完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目的
单片机输出PWM信号是很常用的一种功能需求,STM32中通常使用Timer来输出PWM信号,这篇文章将对相关内容做个说明。 基础说明 在使用Timer输出PWM信号需要了解一些Timer的基础知识,可以查看 《使用HAL库开发STM32:Timer基础说明与定时功能使用》 这篇文章中的 Timer基础说明 章节。 PWM信号有几个参数,周期、脉宽、频率、占空比,其中最主要的是 周期 和 脉宽 ,其它参数都可以通过这两个参数计算出来。在使用Timer输出PWM信号时PWM信号的周期就是Timer的计数周期时间,其相关内容可以参考上面链接的文章,这里只贴一下周期时间计算公式: 周期时间 = (Prescaler + 1) × (Period + 1) ÷ 时钟频率 单位:秒 确定单个信号的周期时间就能计算出频率了,计算公式如下: 频率 = 1 ÷ 周期时间 单位:赫兹 上面涉及的一些参数都是Timer本身的一些参数。对于STM32的单片机,很多Timer都可以输出多路PWM信号,每路PWM信号都有独立的参数可以设置其输出特征,最主要的参数就是 Pulse ,这个参数影响PWM信号的脉宽。 上图是默认参数下计数器计数和PWM信号输出的对照图示,上面的几个参数选项说明如下:
占空比 = 高电平时间 ÷ 周期 输出PWM信号 下面是最基础的PWM的使用: 下面图片看不清的话可以点击查看大图 上面演示中我使用了TIM4,在F405上它是在APB1总线上的,在上图中可以看到我的APB1给Timer的时钟频率为84MHz。上图中我设定Prescaler为83,即对时钟84分频,相当于给计数器的时钟为1MHz,每次计数时间为1us。上图中我设定Period为999,即每个计数周期为1000次计数,再根据时钟和Prescaler的设定,最终一个计数周期为1毫秒,频率为1KHz。 在使用STM32CubeIDE配置PWM生成代码后,我们只需要用下面方法就可以启动PWM输出: HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 如果想要停止PWM信号输出可以使用下面方法: HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); 如果想要在程序中动态的修改Pulse来调节占空比可以使用下面方法: __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 在默认配置下,如果Pulse设置为0,那么将恒定输出低电平;如果Pulse设置大于Period,那么将恒定输出高电平。 如果想要在程序中动态修改 周期/频率 ,其实就是修改Period,可以使用下面方法,建议在配置时使能AutoReloadPreload: __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) 通常一个Timer可以输出多路PWM信号,每一路PWM信号可以设置不同的脉宽,但频率是相同的。 总结 使用Timer输出PWM信号只是在定时器的基础上增加一点点内容,使用起来也很简单,更多内容可以查看官方文档和例程。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2990 浏览 16 评论
3490 浏览 1 评论
9052 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2332浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 00:40 , Processed in 1.232202 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号