简介
初始化 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捕获上升沿, 获取输入频率)