0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32通过PWM控制电机速度

单片机与嵌入式 来源:单片机与嵌入式 2023-07-06 09:56 次阅读

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

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

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

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

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

wKgZomSmH1OAGSNRAACBEuIXb6A923.png

上图中的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时触发中断然后进入中断处理程序进行中断处理。以下代码为例:

wKgZomSmH1OAK2eSAAAY3c8kK-Y218.png

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

wKgZomSmH1OAHty_AAAGa2o90Lk604.png

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

wKgZomSmH1OALkQZAAADRYb1tsA366.png

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

wKgaomSmH1OAO96AAAAG9bTnlCw926.png

看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序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模式、效电平极性,需要程序员自己配置相关的寄存器来实现。通过下面的代码来讲解。

wKgaomSmH1OAGz4QAAAHWckfgEY235.png

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

wKgZomSmH1OAb3iQAAAlakSS3eI200.png

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

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

wKgZomSmH1OAUdxrAAAH5_nIZak402.png

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

wKgaomSmH1OAG4y4AAAIivBZrkw040.png

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

wKgaomSmH1OAc56GAAACcm_HAAo426.png

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

wKgaomSmH1OAcfzxAAAEYatoBMY746.png

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

wKgZomSmH1OAU4nNAAAETxYy_Gg917.png

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

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

wKgaomSmH1OAJL9SAAAGWULp8LM190.png

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

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4900

    浏览量

    209906
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348743
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112036
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950
  • 控制电机
    +关注

    关注

    0

    文章

    188

    浏览量

    17724

原文标题:STM32通过PWM控制电机速度

文章出处:【微信号:单片机与嵌入式,微信公众号:单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    stm32通过PWM输出控制LED亮或灭

    谁会stm32通过PWM输出控制LED亮或灭 求大神指导
    发表于 06-26 00:55

    STM32F407通过定时器控制电机做正反转正弦运动

    电机转动角度为A,求导后得到角速度公式:,由公式可以看出电机的运行速度是从零开始增加的,可以减小电机启动负载。本模块的最终目的是
    发表于 10-28 08:00

    stm32如何通过pwm控制导轨电机

    stm32发出PWM控制电机,使得导轨上的平台沿着导轨左右移动。从而通过程序控制电机的启动,
    发表于 06-28 13:54

    stm32电机控制控制两路直流电机

    小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM
    发表于 06-29 09:18

    实现电机速度闭环控制

    2.3 STM32电机PID速度控制之前的文章,完成了直流减速电机PWM
    发表于 08-04 07:07

    基于stm32pwm控制电机速度

    基于stm32pwm控制电机速度目录一、STM32F103输出一路
    发表于 08-09 07:23

    STM32电机PWM控制

    2.1 STM32电机PWM控制我们这里提供左右两个电机PWM
    发表于 08-11 09:06

    STM32电机PWM控制

    2.1 STM32电机PWM控制我们这里提供左右两个电机PWM
    发表于 09-03 08:28

    stm32如何通过PWM电机控制

    stm32如何通过PWM电机控制
    发表于 12-21 06:48

    如何通过PWM程序来控制交流伺服电机速度呢?

    如何通过PWM程序来控制交流伺服电机速度,就是说PWM的占空比还是频率影响交流伺服
    发表于 04-10 11:52

    PID控制PWM调节直流电机速度

    PID控制PWM调节直流电机速度(安徽理士电源技术有限公司图片)-PID控制PWM调节直流
    发表于 09-15 14:02 90次下载
    PID<b class='flag-5'>控制</b><b class='flag-5'>PWM</b>调节直流<b class='flag-5'>电机</b><b class='flag-5'>速度</b>

    stm32电机控制控制两路直流电机!看完你会了吗

    小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM
    发表于 01-14 12:38 43次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>电机</b><b class='flag-5'>控制</b>之<b class='flag-5'>控制</b>两路直流<b class='flag-5'>电机</b>!看完你会了吗

    基于STM32F103PWM控制H桥驱动电路

    通过stm32f103单片机io口引脚输出pwm信号控制两个桥电路驱动电机
    发表于 10-24 11:25 19次下载

    树莓派通过pwm控制电机速度

    树莓派通过脉冲宽度调制可以控制电机速度。实际上在精度要求不是非常高的情况下,普通引脚也可以通过软件模拟来
    发表于 03-21 10:19 0次下载
    树莓派<b class='flag-5'>通过</b><b class='flag-5'>pwm</b><b class='flag-5'>控制</b><b class='flag-5'>电机</b><b class='flag-5'>速度</b>

    PWM输出控制电机

    4、main函数; 电机系列 一、PWM 输出控制电机 1 、相关 IO 介绍 电机控制芯片为
    发表于 05-06 11:03 2次下载
    <b class='flag-5'>PWM</b>输出<b class='flag-5'>控制</b><b class='flag-5'>电机</b>