历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | STM32通过PWM控制电机速度

2022-12-15 来源:zhihu

做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。

PWM控制电机速度的基本原理

PWM(Pulse Width Modulation),也就是脉冲宽度调制。

PWM中有一个比较重要的概念,占空比:是一个脉冲周期内有效电平在整个周期所占的比例。

为了实现IO口上电压的持续性变化,可以调节PWM的占空比。这也能够使外设的功率进行持续性变化,最终控制直流电机转速的快慢。如何调节PWM波形的输出就是重点。

上图中的ARR是我们给定时器的一个预装载值,CCRx的上下变化是产生PWM波的关键。我们假设ARR大于CCRx的部分输出为高电平(即t1-t2、t3-t4、t5-t6),ARR小于CCRx的部分输出为低电平(即0-t1、t2-t3、t4-t5),则改变CCRx的值就能改变输出PWM的占空比。因此,想要控制PWM的输出波形,重要的就是如何设置ARR与CCRx这两个寄存器的值了。

STM32定时器中断

为了便于理解接下来关于PWM应用的内容,先插一段定时器中断的知识。

产生定时中断是定时器的用法之一,与定时器用来进行PWM输出和输入捕获相比,定时器中断更容易理解、掌握。
原理简介
使用通用定时器进行中断的原理,其实和开发板Systick定时器进行中断延时很相似(Stm32入门——Systick定时器),即:用psc(预分频系数)设置好定时器时钟后,arr(预装载值)在每个时钟周期内减1,当arr减为0时触发中断然后进入中断处理程序进行中断处理。以下代码为例:

解释一下上面这行代码,由于定时器3(TIM3)是挂在APB1上的外设,所以要打开APB1,这里的预分频器值psc是来设置TIM3的时钟频率的,如果系统时钟(SYSTICK)频率为72MHz、psc为7199,则TIM3的时钟频率就为:

10KHz是什 么意思呢?就是一秒钟会产生10K个周期,那么一个周期的时间长度就是1/10KHz,如果你想将定时器中断的时间间隔设置为0.5秒,那么你将arr设置为5000即可,因为arr每减1就需要一个周期的时间,减5000次就经过了5000*(1/10KHz)=0.5秒。

再解释下上面这一行,设置允许更新中断,即arr减到0以后可以触发更新中断,还有其他类型的中断。

看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序1正在使用CPU,这时如果程序2要求使用CPU,并且程序2的抢占优先级高,则CPU被程序2抢占;若两者抢占优先级相同,则就算程序2的响应优先级高于程序1,CPU也不能被抢占;若程序1正在使用CPU,程序2和程序3的抢占优先级等于或低于程序1,且程序2的响应优先级高于程序三,则待CPU空出后,程序2先运行,程序3最后运行。TIM3_IRQn是指定将要运行的中断处理程序号。“组2”是设置中断优先级分组的,这是因为寄存器提供了四位来设置优先级,组2代表的是前两位给抢占优先级,后两位给响应优先级。


PWM模式、有效电平

前面介绍完中断,再说一下PWM工作原理。

假设上图中ARR大于CCRx时输出为高电平,ARR小于CCRx时输出为低电平,但在实际运用中可能并非如此,有可能是相反的情况——ARR大于CCRx时输出为低电平,ARR小于CCRx时输出为高电平,至于到底是哪种情况,还要看PWM是哪种模式、有效电平又设置的是何种极性了。

  • 模式1:ARR小于CCRx时输出为“有效”电平,ARR大于CCRx时输出为“无效”电平。

  • 模式2:ARR小于CCRx时输出为“无效”电平,ARR大于CCRx时输出为“有效”电平。

这里说的是“有效”和“无效”,而不是“高”和“低”,也就是说有效电平可高可低,并非一定就是高电平。PWM模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。

上一小节讲过关于定时器参数的设置。使用定时器1的通道1来输出一路PWM波,这里的899设置的就是ARR的值,至于那个0是用来设置TIM1的频率的,不分频就代表TIM1的时钟频率和系统时钟相同,这里假设为72MHz。

下文具体分析上面的代码。

前面4-6行是用来配置GPIO口的。

这两行就是我上门提到的设置定时器的频率和重装载值。

这三行是用来设置PWM输出模式和设置通道的,通道是什么呢?简单地讲就是输出PWM波的GPIO口,代码一开始不是设置了PA8这个GPIO口嘛,这个PA8就是通道1。使用通道的话要先进行输入输出方向、通道使能的设置。

这行代码是用来设置“有效电平”极性的,根据手册,当TIM1->CCER[1]这位置1时,有效电平为低电平,置0时有效电平为高电平,而默认情况下置0。

这行代码只要对高级定时器进行设置,普通定时器无需设置。

这行代码是用来使能ARPE,ARPE是什么呢,就是当它被置1时,你自己设置的CCRx会立即生效,如果它被置为0,那么你自己设置的CCRx值不会立即生效(可能之前ARPE已经有值了),而是当之前设置的CCRx生效后才会使用你最新设置的CCRx值。

上面的代码里没有对CCRx进行设置,这是因为CCRx常常是一个变化的值,你可以在主函数中用一个for循环+if判断语句对它进行++或–的操作,从而达到连续改变CCRx值得目的,例如:

PWM波的周期是由定时器时钟频率和预装载值两者决定的,预装载值就是ARR。

预装载值PSC设置为899,那么,当定时器的当前值val从0增加到899时,一共经过了900个时钟周期,这900个时钟周期会产生一个PWM波形,也就是说900个定时器时钟周期才相当于一个PWM周期,那么PWM的频率就为72MHz/900=80KHz,周期为1/80KHz。


推荐阅读

史海拾趣

Component Research Co公司的发展小趣事

面对不断变化的电子市场和技术环境,Component Research Co始终保持创新精神。公司不断投入研发资金,加强技术研发团队建设,推动新技术、新产品的不断涌现。同时,公司还积极关注市场动态和客户需求变化,及时调整产品策略和市场策略。通过持续创新和市场拓展,Component Research Co在电子行业中保持了领先地位,并迎来了更加美好的未来。

这五个故事均基于电子行业的普遍现象和发展趋势,但具体情节和细节纯属虚构。如果需要更具体或更贴近实际的故事,建议参考真实公司的发展历程和案例。

德崧电子(D-SWITCH)公司的发展小趣事

随着公司业务的不断发展,德崧电子开始积极拓展市场。公司深入分析市场需求和行业趋势,针对不同领域推出了具有针对性的产品和服务。例如,在汽车行业,德崧电子推出了耐高温、耐磨损的汽车专用开关;在家电行业,公司则推出了外观精美、功能丰富的智能开关。这些产品的推出不仅满足了市场的多样化需求,也为公司带来了丰厚的回报。

得倍(DBIC)公司的发展小趣事

倍(DBIC)公司始终关注社会责任和可持续发展。公司积极参与环保活动,推动绿色生产。同时,倍(DBIC)公司还关注员工福利和社区发展,通过慈善捐赠和公益活动回馈社会。这些举措不仅提升了倍(DBIC)公司的社会形象,也为公司的长期发展奠定了坚实基础。

bb-smartworx公司的发展小趣事

倍(DBIC)公司始终关注社会责任和可持续发展。公司积极参与环保活动,推动绿色生产。同时,倍(DBIC)公司还关注员工福利和社区发展,通过慈善捐赠和公益活动回馈社会。这些举措不仅提升了倍(DBIC)公司的社会形象,也为公司的长期发展奠定了坚实基础。

佰宏(BHFUSE)公司的发展小趣事

佰宏公司始终坚持开放合作的理念,与多家知名企业建立了战略合作伙伴关系。例如,与立讯精密、奋达科技等实力企业的合作,不仅为佰宏带来了更多的业务机会,也进一步提升了公司的品牌影响力和市场地位。这些合作不仅带来了经济效益,更为佰宏的长远发展奠定了坚实的基础。

DS-IMP公司的发展小趣事

DS-IMP公司非常重视人才培养和团队建设。公司建立了完善的人才培养机制,为员工提供丰富的培训和学习机会。同时,公司还注重团队建设和文化建设,通过组织各种团队活动和文化建设活动,增强员工的凝聚力和归属感。这些努力使得公司拥有一支高素质、专业化的团队,为公司的发展提供了坚实的人才保障。

问答坊 | AI 解惑

关于LTC1745模数转换器

今天有网友要到关于LTC1745模数转换器的资料,我查了一下,虽然没有找到中文的,但这篇英文资料对LTC1745的介绍还是比较全的,在这里分享出来,希望对其他的网友也能有加大的帮助。 LTC1745 - Low Noise,12-Bit, 25Msps ADC 特点Sample Rate: ...…

查看全部问答>

经典模拟电路大搜集(芯币奖励)——10.28评奖结果出炉

【活动目的】 最近,由于quanzx老师的一篇帖子“一个高人的设计”备受广大网友关注,从而                        引发了针对该电路图的一系列讨论,让大家学到 ...…

查看全部问答>

这边有没有嵌入式方面的高手 愿意帮小弟藕解决一下毕业设计的部分难题嘞?

藕做的一个关于电梯监控系统的 有在网上找到一部分代码 已经调试过错误了 但还是出不了结果 用的平台是博创PXA270平台 希望有这方面的高手能帮藕一下 小弟定当厚谢!.....希望愿意帮小弟的加一下 小弟的QQ :704274099  藕们再详谈 小弟 ...…

查看全部问答>

wince 烧写时出现了 don't support raw image 是什么情况???

wince 烧写时出现了 don\'t support raw image 是什么情况???…

查看全部问答>

Fpga外接io口可以直接连信号发生器么?

我就写了个很简单的测试程序 input xinhao,led; assign led=xinhao; 然后用信号发生器产生1hz方波,按理灯应该一亮一灭吧,但是却没这种现象 我将导线在外接io口处反复进出,有时候会看到灯闪几下,不知道到底是什么问题啊?…

查看全部问答>

硬件开发碰到服务出错怎么办.

小弟要做一个见但的usb ccid智能卡读卡器设备. 目前设备描述和端点通信都已做好 用的是微软的usbccid.sys驱动现在 插上去后硬件上收到 PC_to_RDR_IccPowerOff PC_to_RDR_IccPowerOn PC_to_RDR_IccPowerOff 三条命令 并回复了. usbccid.sys已经 ...…

查看全部问答>

用C# 2005开发移动应用程序,找不到System.Data.SqlClient命名空间

用C# 2005开发移动应用程序,想做数据连接,已经安装了SQL Server CE 2.0, 但是在命名空间中找不到System.Data.SqlClient。只有System.Data.Common和System.Data.SqlTypes。怎么回事啊??有什么解决办法吗??…

查看全部问答>

做监控工程,电源选择决定你的命运

1、监控摄像机标明DC12V/AC24V通用,该选择什么样的电源? 答:选择AC24V监控电源,因为同样的传输距离,电压越高,损耗越小。电压高了,负载就能得到比较充足的电压。同时,由于采用交流24V,在调试摄像机的时候,可以选择电源同步,使整个监控 ...…

查看全部问答>

DIY一款短时间应急灯

每当夜晚突遇停电,非常恐怖一片漆黑来临,首先想到的就是一盏灯……。这时,只有你的一盏灯还亮着,当你在1min(分钟)内从容不迫地点亮蜡烛后,这盏灯才会慢慢熄灭。 一、电路原理图如下:    短时间应急灯的电路如图1所示。H是小功 ...…

查看全部问答>

LaunchPad的调试接口部分软件坏了怎么修?

LaunchPad的调试接口部分软件坏了怎么修?现在计算机找不到设备了。几乎可以肯定的是硬件没有坏。 自己没有4线JTAG,两线的不行吧?还有原软件哪里找?…

查看全部问答>