历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | stm32入门——PWM输出控制直流电机变速

发布者:码上奇迹 来源: eefocus关键字:stm32  PWM  输出控制  直流电机  变速 手机看文章 扫描二维码
随时随地手机看文章

最近刚做了智能小车的寻迹实验,实验中用了定时器PWM输出来改变直流电机的转速,我在这里就大致总结一下PWM相关的知识。


什么是PWM?

PWM(Pulse Width Modulation)脉冲宽度调制。

占空比:pwm占空比就是一个脉冲周期内有效电平在整个周期所占的比例。

通过调节PWM的占空比就能调节IO口上电压的持续性变化,因此也能够控制外设的功率进行持续性变化,也就能控制直流电机的转速快慢。

那么重点就在于如何调节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这两个寄存器的值了。


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波,想详细了解定时器参数的设置的朋友可以参考(stm32入门——定时器中断),我这里简单介绍一下,这里的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   

}  


前三行是用来配置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。



关键字:stm32  PWM  输出控制  直流电机  变速 引用地址:stm32入门——PWM输出控制直流电机变速

上一篇:STM32学习笔记(PWM输出)
下一篇:STM32——使用PWM+DMA实现脉冲发送精确控制

推荐阅读

可以与人交流的个人家用机器人开始走出实验室,进入我们的客厅和厨房。但是邀请机器人进入人类的生活,人类准备好了吗?人们花了几十年的研究才造出了机器人,但其复杂程度远不及流行科幻小说中出现的机器人。他们不太像那些早已在书中出现的虚构的机器人;他们大多不走路,只是有时会翻滚着行动,也经常有很多没有四肢的机器人。而且他们在语言、社交技巧和...
百度无人巴士二代即将推出,对于近期传闻百度无人车项目解散,百度给出了官方回应。报道称,“百度阿波龙无人巴士项目的主要技术、开发人员已经撤出,分散进其他项目和阿波龙开源项目。当时阿波龙项目很受重视,投入的总人数有300人左右,现在只剩下一些测试和代码维护人员,做一些简单维护”。对此,百度公关部相关人士回应称“百度无人巴士项目生变”相...
近日获悉,哈崎机器人(HachiBot)宣布完成数千万美元Pre-A轮融资,由北极光创投领投、梅花天使创投等基金和个人跟投。其中,微软全球原执行副总裁沈向洋及酷我音乐创始人、北京大学人工智能创新中心主任雷鸣为投资人和顾问。谌振宇认为,机器人迈进千家万户的时代即将到来。“根据我的经验判断,这个时间点类似于1995年的互联网时代和2008年的移动Mobil...
8月19日上午消息,谷歌公司前天推出了低价5G手机Pixel 5a,9to5google等外媒已经拿到它,并写出了上手体验,新浪数码为您编译,让国内用户也能了解这部谷歌新品的体验,以下是全文:  在推出之前,许多人认为Pixel 5a只是Pixel 4a的翻版而已。然而,在使用它之后,我现在相信带有5G功能的谷歌Pixel 5a承载了Pixel 5的火种,足以抵御昂贵的...

史海拾趣

问答坊 | AI 解惑

向自己做个电源

寝室总停电   不知道有什么办法自己做个升压的电源啊?…

查看全部问答∨

大家有谁做过录音笔分享点资料?

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 大家有谁做过录音笔分享点资料?  …

查看全部问答∨

谁有s3c2410(arm9)原理图和PCB图.

谁有s3c2410(arm9)原理图和PCB图.…

查看全部问答∨

第一次尝试做个东西,请教各位大哥大姐!

做个东西主要是用于简单的水位检测,高于一定水位报警(打算用个发光二极管就算了),同样低于某处一样。同时用电动机模拟抽水排水系统,正反转分别代表抽排。还有个功能就是水压检测(还要用数码管显示压值),不知道当时是那部分脑子浸水了,为 ...…

查看全部问答∨

求助:两个机器互相ping的问题!

两个机器都是vxWorks。由于两个机器是网线直连,这就引入了一个问题。如果机器不开机则网卡没有激活,创建的socket会丢数据。所以甲机器写了一个ping程序,如果甲先开机则首先通过ping来判断乙是否已经开机,判断乙开机后才创建socket,从而保证通 ...…

查看全部问答∨

WinCE 和 tcpmp

本人最近想将下载的ffmpge porting到 wince5.0和wince6.0上。选用工具是2005。现在有以下问题 1。是否可以用tcpmp AP 进行ffmpege测试。如果可以是不是分别要将tcpmp分别作成CE5.0和CE6.0的Ap. 2. 如果可以用tcpmp AP 进行ffmpege测试.有高手可以 ...…

查看全部问答∨

430手册里说VCC在2.2-3.6V,为什么实际只能到2.6V

用的MSP430F5437,手册里说供电电压在2.2-3.6V之间,可是我实际测试时,电压降低到2.5-2.6就 不能工作了,为什么呢?? Recommended Operating Conditions VCC Supply voltage during program execution and flash programming (××CC = DVCC1/2/3/4 ...…

查看全部问答∨

来看看两句printf语句

以下有两个很短的程序。唯一的区别只在于 printf那一句的参数。可是它们输出的效果却截然不同。因为程序很简单,这里卖个关子,不说结果,有兴趣的朋友试试。/*program 1*/#include <stdio.h>int main(void){ char slave = 0; char Buffer = 0; ...…

查看全部问答∨

PCB设计技巧百问

内容挺多的,这个大家看以慢慢看一下…

查看全部问答∨

没有用过ADS1256的高手啊。。。。冒泡指点一下

没有用过ADS1256的高手啊 [ 本帖最后由 simonprince 于 2013-11-28 10:55 编辑 ]…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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