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

发布者:Mengyun最新更新时间:2024-03-20 来源: elecfans关键字:PWM控制  电机速度  Stm32 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


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


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


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


void TIM3_Int_Init(u16 arr,u16 psc){  RCC->APB1ENR|=1<<1;  //TIM3时钟使能       TIM3->ARR=arr;    //设定计数器自动重装值   TIM3->PSC=psc;    //预分频器设置  TIM3->DIER|=1<<0;   //允许更新中断          TIM3->CR1|=0x01;    //使能定时器3    MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2                   }

RCC->APB1ENR|=1<<1

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


72MHz/(7199+1)Hz = 10KHz    //这里的“+1”是手册中规定的。

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


TIM3->DIER|=1<<0

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


MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2

看上面这行代码,中断优先级有抢占优先级和响应(即子优先级)优先级两种,抢占优先级即:若程序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工作原理。相关文章:浅析PWM控制电机转速的原理。


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


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


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


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


TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz

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


void TIM1_PWM_Init(u16 arr,u16 psc){                //此部分需手动修改IO口设置  RCC->APB2ENR|=1<<11;   //TIM1时钟使能      GPIOA->CRH&=0XFFFFFFF0;  //PA8清除之前的设置  GPIOA->CRH|=0X0000000B;  //复用功能输出 

  TIM1->ARR=arr;      //设定计数器自动重装值   TIM1->PSC=psc;      //预分频器设置

  TIM1->CCMR1|=7<<4;    //CH1 PWM2模式       TIM1->CCMR1|=1<<3;     //CH1预装载使能      TIM1->CCER|=0<<1;     //OC1 输出使能     //TIM1->CCER|=1<<1;

  TIM1->BDTR|=1<<15;     //MOE 主输出使能     

  TIM1->CR1=0x0080;     //ARPE使能   TIM1->CR1|=0x01;      //使能定时器1                       }

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


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


TIM1->ARR=arr; //设定计数器自动重装值TIM1->PSC=psc; //预分频器设置

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


TIM1->CCMR1|=7<<4; //CH1 PWM2模式TIM1->CCMR1|=1<<3; //CH1预装载使能TIM1->CCER|=0<<1; //OC1 输出使能

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


TIM1->CCER|=1<<1;

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


TIM1->BDTR|=1<<15; //MOE 主输出使能

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


TIM1->CR1=0x0080; //ARPE使能

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


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


for(i=0;i<300;i++){  TIM1->CCR1=i;if(i==300){    i=0;  }}

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


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


关键字:PWM控制  电机速度  Stm32 引用地址:PWM控制电机速度的基本原理

上一篇:用定时器生成PWM波的方法
下一篇:机智云代码工程移植/采集数据上发/控制数据下拉/配置入网

推荐阅读最新更新时间:2024-11-11 18:10

基于STM32的嵌入式语音识别电路模块设计
 介绍了一种以ARM为核心的嵌入式语音识别模块的设计与实现。模块的核心处理单元选用ST公司的基于ARM Cortex-M3内核的32位处理器STM32F103C8T6。本模块以对话管理单元为中心,通过以LD3320芯片为核心的硬件单元实现语音识别功能,采用嵌入式操作系统μC/OS-II来实现统一的任务调度和外围设备管理。经过大量的实验数据验证,本文设计的语音识别模块具有高实时性、高识别率、高稳定性的优点。    主控制器电路   本文的主控制器选用的是ST公司的STM32F103C8T6芯片。该芯片基于ARM Cottex-M3 32位的RISC内核,工作频率最高可达72 MHz,内置高速存储器(64 KB的闪存和20 KB的S
[电源管理]
基于<font color='red'>STM32</font>的嵌入式语音识别电路模块设计
基于STM32的矿用本质安全型电源设计
0 引言 本安电源是本安型电气设备的一个重要组成部分,由于煤矿的机械化,井下传感器、弯道报警器等设备的供电,通信、报警都需要供电设备。但是基于井下复杂的环境,对供电设备的要求也是非常严格的,它要求电源电路的内部和引出线无论是在正常工作还是在故障状态下都是安全的并且产生的电火花不会点燃周围环境中的爆炸性混合物。本安电源有“ia”和“ib”两个等级。在本文中介绍的本安电源是井下常用的“ia”等级,也就是说在一个故障,一套保护电路损坏的情况下也能继续工作。 1 本安电源的组成及工作原理 1.1 电源 本系统中本安电源的输入+Vin、-Vin为48 V直流电源,经过DC/DC电源转换模块(U1)输出12 V直流电,U2是7
[单片机]
基于<font color='red'>STM32</font>的矿用本质安全型电源设计
STM32-点亮一个LED灯-流水灯
1.跟着例程自己创建自己的工程时,出现了GPIO库文件里有undefined等等,在我们刚开始学习新建工程时要注意C/c++里面的Defined,与开发板匹配! 2.在启动文件中选择与开发板匹配的文件,比如hd,ld,md等等只要加入一种,多了会出现错误. 3.终于成功了! 4.出现Flash download failed cortex M3 注意Flashdownload里面关于你芯片Flash匹配。 5.今天终于借助于库开发点亮第一个LED灯,哈哈。 http://blog.csdn.net/hantangsongming/article/details/8139793 http://blog.sina.com.cn/s/b
[单片机]
stm32 看门狗 BKP(HAL库)
(一)概述 stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1)。 (二)硬件看门狗实现代码 IWDG_HandleTypeDef hiwdg; // 硬件看门狗初始化 static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg) { pHiwdg- Instance = IWDG; pHiwdg- Init.Prescaler = IWDG_PRESCALER_4; pHiwdg- Init.Reload = 0xFFF; // Tout = ((4 * 2^prer) * rlr) / 40 = 409ms,看门狗
[单片机]
基于STM32单片机的电子称设计
摘要 电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元,在配以键盘、显示电路及强大软件来组成。电子称不但计量准确、快速方便,更重要的自动称重、数字显示,对人们生活的影响越来越大,广受欢迎。 本系统的设计主要从硬件电路设计,软件编程调试,实物焊接调试三部分进行详细阐述。硬件电路主要是基于单片机为核心的控制单元实现数据的处理,采用压力传感器对数据进行采集,电子秤专用24位AD转换芯片HX711对传感器采集到的模拟量进行AD转换,转换后的数据送到单片机进行处理显示,数据显示由LCD160
[单片机]
基于<font color='red'>STM32</font>单片机的电子称设计
STM32 IAP 设计实例 (一)
项目需要,需要开发一款手持设备,对产品进行软件升级。现在的产品都是使用STM32,所以可以很方便的应用STM32的 IAP功能对软件进行在线升级。 总体需求就是,主机Master通过CAN接口,发送数据给从机Slave。从机在接收到应用程序APP后,把接收的数据覆盖掉原来的应用程序区。从而实现Master对Slave的在线升级。 这里先介绍IAP,对IAP的整体实现有个了解,方便后续开发。参考了原子STM32开发板,对IAP功能的介绍。 要实现IAP,需要有两个项目代码。第一个称之为Bootloader程序,第二个称之为APP程序。Bootloader负责引导APP程序启动,以及需要在线更新APP时,接收主机发送的APP
[单片机]
<font color='red'>STM32</font> IAP 设计实例 (一)
STM32外部中断和IWDG
实验平台:正点原子战舰开发板 系统:windows 7 64位 编译器:MDK 4.72a 参考例程:ATK串口例程,野火ISO串口例程 外部中断 中断主要分为两种: 1、系统异常中断也可以说的内核异常,这类异常中断有些是不可以控制的,如RESET,NMI,FAULT. 2、外部中断,这些中断都是可以设置的,每个GPIO都可以被设置为中断。 一、NVIC控制器 当要使用中断时候都要对NVIC进行设置 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); NVIC_IRQChannel 需要配置的中断线 NVIC_IRQChannelCmd 使能或关闭相应中断向量的
[单片机]
关于STM32中RTC的校准方法
实现RTC 校准的核心之一是库文件Stm321f0x_bkp.c中的void BKP_SetRTCCalibrationValue (uint8_t CalibrationValue) 函数。谈到RTC校准的相关参考文档包括AN2604.pdf,AN2821.pdf和AN2821.zip。这三个文档都可以从STM32官方网站下载。 按照AN2604.pdf描述的原理,RTC 的校准值应在0-127之间。可实现的校准误差对应为0-121ppm。相当于每30天跑快的秒数为0-314s。 这里应注意的一个关键问题是,RTC只能对跑快进行校准,不能对跑慢进行校准。如果手表晶振的标称频率是32768Hz,设其可能的误差范围是±2Hz
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved