一.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 */
}
占空率、频率与示波器测出的有些许差异,不知道是什么原因导致。