用STM32的TIM3输入捕获功能,5分钟搞定PWM频率和占空比测量(附OLED显示代码)
STM32实战5分钟实现PWM频率与占空比测量系统最近在调试电机控制项目时经常需要快速验证PWM信号的参数准确性。传统示波器虽然精确但携带不便而基于STM32的简易测量方案则完美解决了这个问题。本文将分享如何利用STM32F103的TIM3定时器快速搭建一个带OLED显示的PWM参数测量工具整个过程从接线到显示仅需5分钟。1. 硬件准备与接线方案手头需要准备以下硬件组件STM32F103C8T6最小系统板蓝色pill开发板0.96寸OLED显示屏I2C接口PWM信号源可用另一个STM32产生测试信号杜邦线若干关键接线示意图PWM信号源 -- PA6(TIM3_CH1) OLED SCL -- PB6 OLED SDA -- PB7实际项目中遇到过信号干扰问题建议在PA6引脚加装100nF滤波电容。若使用工业环境中的PWM信号最好添加光耦隔离电路。2. TIM3输入捕获配置技巧STM32的定时器输入捕获功能远比想象中强大。TIM3的PWM输入模式可以自动完成双通道捕获大幅简化代码量。以下是CubeMX中的关键配置步骤在Pinout视图中启用TIM3通道1PA6在Configuration选项卡中选择PWM Input Mode设置预分频器(Prescaler)为7172MHz时钟下每个计数1μs开启定时器中断可选对应的寄存器级初始化代码void TIM3_IC_Init(void) { TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter 0x0; TIM_PWMIConfig(TIM3, TIM_ICInitStructure); TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); TIM_Cmd(TIM3, ENABLE); }注意当测量高频PWM10kHz时建议将TIM3的时钟源设置为内部时钟直接驱动避免APB1分频带来的误差。3. 频率与占空比计算原理理解测量原理对调试异常情况很有帮助。PWM输入模式下TIM3会自动完成上升沿捕获CCR1寄存器记录周期值下降沿捕获CCR2寄存器记录高电平时间计算关系如下表参数计算公式示例测得CCR11000, CCR2300频率1/(CCR1 * 时钟周期)1/(1000*1μs) 1kHz占空比(CCR2/CCR1)*100%(300/1000)*100% 30%实际代码实现时添加了滑动平均滤波算法#define SAMPLE_SIZE 5 uint32_t freq_buffer[SAMPLE_SIZE] {0}; uint32_t Get_Filtered_Freq(void) { static uint8_t index 0; freq_buffer[index] 1000000 / (TIM_GetCapture1(TIM3) 1); index (index 1) % SAMPLE_SIZE; uint32_t sum 0; for(int i0; iSAMPLE_SIZE; i){ sum freq_buffer[i]; } return sum / SAMPLE_SIZE; }4. OLED显示优化实践使用u8g2库驱动OLED可以大幅简化显示代码。以下是经过优化的显示方案void Display_Update(void) { char buf[20]; u8g2_ClearBuffer(u8g2); // 频率显示带单位自动切换 uint32_t freq Get_Filtered_Freq(); if(freq 1000) { sprintf(buf, Freq:%.2f kHz, freq/1000.0); } else { sprintf(buf, Freq:%lu Hz, freq); } u8g2_DrawStr(u8g2, 0, 12, buf); // 占空比显示添加进度条 uint8_t duty Get_Filtered_Duty(); sprintf(buf, Duty:%d%%, duty); u8g2_DrawStr(u8g2, 0, 30, buf); u8g2_DrawBox(u8g2, 0, 35, map(duty,0,100,0,128), 5); u8g2_SendBuffer(u8g2); }显示优化技巧添加了频率单位自动转换Hz/kHz用进度条直观展示占空比采用双缓冲机制避免闪烁自定义了适合小屏幕的字体5. 常见问题排查指南在实验室测试中总结了几个典型问题及解决方案现象可能原因解决方法测量值波动大信号噪声干扰增加硬件滤波或软件平均频率显示为零极性配置错误检查TIM_ICPolarity设置占空比始终为100%未启用PWM输入模式调用TIM_PWMIConfig()函数OLED无显示I2C地址不匹配尝试0x3C和0x78两种地址当测量异常时建议先用GPIO翻转法测试中断响应时间while(1) { GPIO_WriteBit(GPIOB, GPIO_Pin_0, 1); Get_Filtered_Freq(); GPIO_WriteBit(GPIOB, GPIO_Pin_0, 0); }用示波器观察PB0引脚波形正常应看到规则的方波。如果波形异常或消失说明定时器配置存在问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2568625.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!