简介
初始化 TIM5 为 PWM input CH1, 获取输入PWM的频率和占空比
电路原理图
连线
将 PC7 与 PA0使用跳线进行连接
其他知识
APIs
/* Blocking mode: Polling */
HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); // 堵塞捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); // 堵塞捕获停止
/* Non-Blocking mode: Interrupt */
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); // 中断捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); // 中断捕获停止
/* Non-Blocking mode: DMA */
HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); //DMA捕获开启
HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); // DMA捕获停止
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); // 捕获时中断回调函数
实现步骤
创建项目
参考 普中STM32-PZ6806L开发板(HAL库函数实现-PWM呼吸灯), 使用同一个GPIO口PC7产生PWM,然后PA0引脚进行捕获
初始化TIM5 CH1
合并通道, 选项为PWM输入到CH1, 这里其实就是合并1和2通道使一个采集上升沿一个采集下降沿
主从模式开启, 先启动会等待另外一个同步启动
添加用户代码
main.c
float frequency = 0;
float dutyCycle = 0;
int capture_index = 0;
uint16_t ic_vals[2];
uint32_t difference = 0;
uint32_t ic_val = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if ( htim->Instance == TIM5 )
{
if ( htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
{
ic_vals[1] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) + 1; // 周期计数值
++capture_index;
// printf("channel1: %d\r\n", capture_index);
}
else if ( htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
ic_vals[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2) + 1; // 高电平计数值
++capture_index;
// printf("channel2: %d\r\n", capture_index);
}
if (2 > capture_index) // PWM数据采集完整才能计算频率
return;
// printf("vals: %d %d\r\n", ic_vals[0], ic_vals[1]);
frequency = (72000000/72)/(ic_vals[1]); // (主频/预分频)/周期计数
dutyCycle = ((float)ic_vals[0])/((float)ic_vals[1]) * 100.0; // (高电平计数值/周期计数值) * 100
capture_index = 0;
}
}
int main(void)
{
...
printf("Very Welcome!\r\n");
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 300); // 改变占空比
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2); // 启动PWM输出
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);
while (1)
{
HAL_Delay(2000);
printf ("frequency : %f, duty: %f\r\n", frequency, dutyCycle);
}
}
共赏
代码
不需要下载, 基本代码上面都提供了
参考
普中STM32-PZ6806L开发板(HAL库函数实现-批量操作GPIO引脚实现跑马灯)
普中STM32-PZ6806L开发板(HAL库函数实现-TIM5捕获上升沿, 获取输入频率)