0
点赞
收藏
分享

微信扫一扫

蓝桥杯嵌入式stm32g431rbt6输入捕获实验

夏天的枫_ 2022-04-08 阅读 82
stm32c语言

一.cubmax配置

打开RCC

打开SYS

配置PB4,PA15

设置PB4引脚对应时钟通道(TIM3,channel1)

设置80预分频

自动装载置设置最大值

打开自动装载

上升沿捕获

滤波值为8

下拉电阻

设置PA15引脚对应时钟通道(TIM2,channel1)

设置80预分频

自动装载置设置最大值

打开自动装载

下降沿捕获

滤波值为8

上拉电阻

 

使能TIM2,TIM3时钟中断 

 设置时钟

项目文件设置

然后点击GENERATE CODE创建工程

在工程中配置下载工具

 

调用库,定义变量

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "lcd.h"

/* USER CODE END Includes */


/* USER CODE BEGIN PTD */
uint32_t PB4_capture_Buf[3] = {0};   //PB4_存放计数值
uint8_t PB4_capture_Cnt = 0;    //PB4_状态标志位
uint32_t PB4_PWM;  //PB4捕获频率

uint32_t PA15_capture_Buf[3] = {0};   //PA15存放计数值
uint8_t PA15_capture_Cnt = 0;    //PA15状态标志位
uint32_t PA15_PWM;  //PA15捕获频率
/* USER CODE END PTD */

在main函数外添加捕获中断回调函数代码

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	if(htim == (&htim3)){
		switch(PB4_capture_Cnt){
			case 0:
				PB4_capture_Buf[0] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);//获取开始计数值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);//设置捕获极性为下降
				PB4_capture_Cnt++;  
				break;
			case 1:
				PB4_capture_Buf[1] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)-PB4_capture_Buf[0];//获取高电平计数值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);  //设置为上升捕获
				PB4_capture_Cnt++;
				break;
			case 2:
				PB4_capture_Buf[2] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1)-PB4_capture_Buf[0]-PB4_capture_Buf[1];//获取低电平计数值
				PB4_capture_Cnt++;    
				break;
		}
	}
	if(htim == (&htim2)){
		switch(PA15_capture_Cnt){
			case 0:
				PA15_capture_Buf[0]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取开始时计数值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING);//设置上升捕获
				PA15_capture_Cnt++;
				break;
			case 1:
				PA15_capture_Buf[1]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)-PA15_capture_Buf[0];//获取低电平计数值
				__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);//设置下降捕获
				PA15_capture_Cnt++;
				break;
			case 2:
				PA15_capture_Buf[2]=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)-PA15_capture_Buf[0]-PA15_capture_Buf[1];//获取高电平计数值
				PA15_capture_Cnt++;
				break;
		}
	}
}

在tim.h文件中可找到该函数 

main函数中while循环外代码,初始化lcd,黑底白字,创建输出lcd数组

/* USER CODE BEGIN 2 */
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	char buff[20];
  /* USER CODE END 2 */

 while循环中代码

 while (1)
  {
		if(PB4_capture_Cnt==0){
			HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);//开始捕获
		}
		else if(PB4_capture_Cnt==3){
			HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1); //停止捕获  
			__HAL_TIM_SET_COUNTER(&htim3, 0);  //设置时钟3计数值为0
			
			sprintf(buff,"star:%d    ",PB4_capture_Buf[0]);
			LCD_DisplayStringLine(Line0,(uint8_t*)buff);//输出pwm周期开始时计数值
			
			sprintf(buff,"low:%d    ",PB4_capture_Buf[1]);//输出pwm周期低电平计数值
			LCD_DisplayStringLine(Line1,(uint8_t*)buff);
			
			sprintf(buff,"high:%d    ",PB4_capture_Buf[2]);
			LCD_DisplayStringLine(Line2,(uint8_t*)buff);//输出pwm周期高电平计数值
			
			PB4_PWM=1000000/(PB4_capture_Buf[2]+PB4_capture_Buf[1]);
			sprintf(buff,"pwm:%dHz %d%%    ",PB4_PWM,PB4_capture_Buf[2]*100/(PB4_capture_Buf[2]+PB4_capture_Buf[1]));
			LCD_DisplayStringLine(Line3,(uint8_t*)buff);//输出频率占空比
			PB4_capture_Cnt=0;
			
			HAL_Delay(200);
		}
		if(PA15_capture_Cnt==0){
			HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//开始捕获
		}
		else if(PA15_capture_Cnt==3){
			HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获  
			__HAL_TIM_SET_COUNTER(&htim2, 0);  //设置时钟2计数值为0
			sprintf(buff,"star:%d    ",PA15_capture_Buf[0]);
			LCD_DisplayStringLine(Line4,(uint8_t*)buff);//输出pwm周期开始时计数值
			
			sprintf(buff,"high:%d    ",PA15_capture_Buf[1]);
			LCD_DisplayStringLine(Line5,(uint8_t*)buff);//输出pwm周期高电平计数值
			
			sprintf(buff,"low:%d    ",PA15_capture_Buf[2]);
			LCD_DisplayStringLine(Line6,(uint8_t*)buff);//输出pwm整个周期计数值
			
			PA15_PWM=1000000/(PA15_capture_Buf[2]+PA15_capture_Buf[1]);//计算频率
			sprintf(buff,"pwm:%dHz %d%%    ",PA15_PWM,PA15_capture_Buf[1]*100/(PA15_capture_Buf[2]+PA15_capture_Buf[1]));
			LCD_DisplayStringLine(Line7,(uint8_t*)buff);//输出频率占空比
			PA15_capture_Cnt=0;
			
			HAL_Delay(200);
		}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 占空率、频率与示波器测出的有些许差异,不知道是什么原因导致。

 

 

举报

相关推荐

0 条评论