文章目录
一.输入捕获概念
输入捕获模式可以用来测量脉冲宽度或者测量频率。
二.基于NUCLEO-G474RE开发板新建工程
2.1 打开 STM32CubeMX 软件,新建工程.
我手里有开发板所以选择基于开发板。
2.2 选择开发板(芯片)
我这里选择的是我的开发板NUCLEO-G474RE,少去一些步骤。
2.3 配置TIM1
配置TIM1产生100kHz的PWM,对应管脚PC0。
F= Tclk/[(psc+1) * (cnt+1)] = 170MHz/[1*1700] = 100kHz。
2.4 配置TIM2
参考自数据手册 PWM input mode
输入捕获的配置
2.5配置一下时钟树.
2.6生成代码.
三.编写代码
- 定义变量
/* USER CODE BEGIN PV */
uint16_t PRE1=1700;
uint16_t CMP1=500;
uint32_t capture_Buf[4] = {0}; //存放计数
uint32_t capture_Buf1[4] = {0}; //存放计数
uint8_t capture_Cnt = 0; //状标志位
float duty_cycle; //占空
uint32_t frequency; //频率
/* USER CODE END PV */
- 开启定时器TIM1和TIM2
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获(上升沿捕获)
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); //启动频率捕获(下降沿捕获)
/* USER CODE END 2 */
- while 循环中调节TIM1 PWM的频率和占空比
/* USER CODE BEGIN 3 */
//TIM1->PSC=0;
TIM1->ARR=PRE1-1;
TIM1->CCR1=CMP1-1;
- 核心代码(中断回调函数)
/* USER CODE BEGIN 4 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
// 获取频率
if(TIM2==htim->Instance)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
{
if(capture_Cnt == 0)
{
/* Get the 1st Input Capture value */
//capture_Buf[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
capture_Buf[0] = htim->Instance->CCR1;
capture_Buf1[0] = htim->Instance->CCR2;
capture_Cnt = 1;
}
else if(capture_Cnt == 1)
{
/* Get the 2nd Input Capture value */
// capture_Buf[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
capture_Buf[2] = htim->Instance->CCR1;
capture_Buf1[2] = htim->Instance->CCR2;
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获
/* Capture computation */
if (capture_Buf[2] > capture_Buf[0])
{
capture_Buf[3] = (capture_Buf[2] - capture_Buf[0]);
capture_Buf1[3] = (capture_Buf1[2] - capture_Buf[0]);
}
else if (capture_Buf[2] < capture_Buf[0])
{
/* 0xFFFF is max TIM1_CCRx value */
capture_Buf[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf[1]) + 1;
capture_Buf1[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf1[1]) + 1;
}
else
{
/* If capture values are equal, we have reached the limit of frequency
measures */
Error_Handler();
}
/* Frequency computation: for this example TIMx (TIM1) is clocked by
APB2Clk */
frequency = HAL_RCC_GetPCLK2Freq() / capture_Buf[3];
duty_cycle=capture_Buf1[3]*100/capture_Buf[3];
capture_Cnt = 0;
}
}
}
}
/* USER CODE END 4 */
四.调试结果
这里就没有使用串口打印出来了,如果想打印出来请参考串口printf。
思考🤔:在没有信号输入到时候咋个处理???