历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-08-22 来源:eefocus

最近刚做了智能小车的寻迹实验,实验中用了定时器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。



推荐阅读

史海拾趣

Fujisoku Corporation公司的发展小趣事

在电子行业的早期,一家名为“未来电子”的公司(虚构名称,代指类似Fujisoku Corporation的企业)通过自主研发,成功突破了半导体材料的瓶颈,开发出了一种新型的高效能硅基材料。这一创新不仅大幅提升了芯片的性能和稳定性,还降低了生产成本,使“未来电子”迅速在半导体市场崭露头角。公司凭借这一技术优势,不断推出具有竞争力的电子产品,逐步建立起行业领先地位。

American Custom Components公司的发展小趣事

American Custom Components公司自创立之初,就致力于电子元器件的创新研发。在一次技术研讨会上,公司的研发团队发现了一种新型的半导体材料,具有出色的导电性和稳定性。经过数月的实验和验证,团队成功地将这种材料应用于新产品中,推出了一款性能卓越的集成电路。这一创新技术不仅提升了公司的产品质量,还赢得了市场的广泛认可,为公司的发展奠定了坚实基础。

FEIG ELECTRONIC公司的发展小趣事

自1997年以来,FEIG ELECTRONIC开始加速其全球扩张的步伐。通过不断的技术创新和市场推广,FEIG的产品逐渐覆盖了全球多个行业,包括物流、零售、医疗、制造等。FEIG凭借其高质量的产品和卓越的服务,赢得了全球客户的广泛认可,逐渐发展成为全球RFID领域的领军企业。

Dynachip Corp公司的发展小趣事

为了进一步提升公司的竞争力,Dynachip Corp积极寻求国际合作机会。他们与国际知名的半导体企业建立了战略合作关系,共同研发新技术、新产品。同时,他们还积极开拓国际市场,将产品销往全球各地。这些国际合作和市场拓展的努力使Dynachip Corp在国际市场上树立了良好的品牌形象。

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。
EZchip Technologies Ltd公司的发展小趣事

在激烈的市场竞争中,产品质量和客户服务是企业赢得客户信任的关键。EZchip一直秉承“质量第一、客户至上”的理念,注重产品的质量控制和客户服务体验。公司采用严格的生产流程和质量控制标准,确保每一件产品都符合高标准、高质量的要求。同时,EZchip还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些措施不仅提升了产品的竞争力,也赢得了客户的广泛赞誉和信任。

问答坊 | AI 解惑

探秘中国IC设计发展迷局(四):硅谷模式不适全中国环境

四、硅谷模式不适全中国环境 很多从硅谷回国的海归在创业失败后,都会说,在中国运营公司比在硅谷要难。笔者在2005年和2006年认识了很多的回国创业的海归人士,当年都是雄心勃勃,结果,几年下来,现在大都已经宣布公司倒闭,有的回到美国去了,有 ...…

查看全部问答>

寻LED 电源老化装置

请问坛中谁有LED 电源老化的装备;此种装备可以让LED驱动做批量老化用;这种装备只能用led? 可否用功率电阻。…

查看全部问答>

关于RESERVED_BOOT_BLOCKS的问题,eboot大小256K ,为何只占10块?

问题是这样的,eboot运行起来之后我使用 F) Low-level format the Smart Media card 这时候可以看到DNW打印如下信息 Enter your selection: f Reserving Blocks [0x0 - 0x11] ... ...reserve complete. Low-level format Blocks [0x12 - 0xfff ...…

查看全部问答>

430没有使用的I/O口,为降低功耗如何处理?

以前好象看到相关贴子,没有查到.将之设置为输入还是输出?悬空还是接高电平,低电平.…

查看全部问答>

求横流电路PCB 有奖励

本帖最后由 paulhyde 于 2014-9-15 09:12 编辑 求横流电路PCB 有奖励  …

查看全部问答>

【ADC10_B】怎么使用?

ADC10_B只有一个ADC10MEM0,也就是每次只能转化一个通道数据,如果我想同时转化多个通道的数据该怎么办呢?   我原本的想法有两个:   第一,采用Single-channel, single-conversion,每次转换好一个通道后,写指令改通道,再转换, ...…

查看全部问答>

TI femto solution

本帖最后由 dontium 于 2015-1-23 13:12 编辑 TI的收发集成方案请参考下面连接.AFE7225,TRF3720,TRF3711 ti./solution/femto_base_station …

查看全部问答>

零死角玩转STM32

欢迎学习哈………

查看全部问答>

教程:如何为BBB制作cape(或:如何在系统启动时自动加载dtbo)

本帖最后由 wytalfred 于 2014-3-22 00:11 编辑 一、引子 如果你买来BBB是为了搞跟硬件相关的项目,那你八成需要制作一个cape。cape是BBB官方的叫法,其实就是指BBB的软件和硬件外设。通过学习device tree我们了解到BBB是使用capemgr和device tr ...…

查看全部问答>

用ModelSim仿真SDRAM操作(转)

在开始仿真之前,如果对SDRAM原理以及时序不是很了解的朋友,推荐看一下如下这篇文章:SDRAM-高手进阶,终极内存技术指南——完整进阶版 OK,下面正式开始仿真的过程。通过看内存技术指南,我们大概可以总结出SDRAM的工作过程: 上电后进入200us ...…

查看全部问答>