stm32入门——PWM输出控制直流电机变速

2019-08-22来源: 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  输出控制  直流电机  变速

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic472143.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32的官方库函数调用

例如添加 #include "stm32f10x.h" 添加stm32f10x_gpio.c、stm32f10x_usart.c再在stm32f10x_conf.h 中去掉相应的头文件注释
发表于 2019-09-23
STM32的官方库函数调用

stm32库函数学习篇---通用定时器(输入捕获功能)

实现功能:PA8随意延时驱动led灯闪烁,并且将PA8用杜邦线连接到PA7口,PA7是通用定时器TIM3的2通道,在TIM3_CH2触发中断程序中取反连接到PD2口的led灯,指示中断程序运行,并且每次进入中断后改变触发捕获的极性。实现两个led灯会交替闪烁。先有必要了解stm32定时器的输入触发模块,如下图:需要注意的是,一眼望去一个定时器似乎有8个通道,左边四个,右边四个,但其实左边和右边是共用相同的IO引脚,所以名称标注是一模一样。也就是说,每个通用定时器都只有四个独立通道,当某一通道作为了输入触发功能那就不能再作为输出匹配功能。这一点我们也可以从其他地方找到印证。比如TIM_ITConfig()函数中如下:Enables
发表于 2019-09-23
stm32库函数学习篇---通用定时器(输入捕获功能)

(STM32)GPIO库函数使用一览

一、STM公司对于该文件的简述  现在能够看到的关于GPIO操作的库函数是V1.8.0,可以在STM官方库支持中下载,文档的综述表明其功能是管理GPIO的外设功能,总共是三点:1.初始化;2.读写;3.复用。二、文件中函数的使用  整个文件中包含14个函数,其中初始化与配置4个函数;读写操作9个;复用1个。  初始化函数:  GPIO_DeInit()  表示将取消初始化,恢复为其默认复位值。默认引脚悬空(除JTAG)。  GPIO_Init()  根据初始化结构体来自定义初始化引脚。例如下面的PA0引脚作为输入功能的初始化,在主函数中循环前使用,即可完成初始化
发表于 2019-09-23

STM32——库函数开发小结

基本上所有外设都有以下几类寄存器:【CR/DR/SR】(1)控制寄存器 xxx_CR(Control/Configuration Register):这类寄存器是用来配置、控制 相应 外 设 的 工 作 方 式 的 。 如 GPIOx_CRL、GPIOx_CRH, AFIO_EXTICR1~AFIO_EXTICR4,串口的 USART_CR1~USART_CR3等。(2)数据寄存器 xxx_DR(Data Register):这类寄存器主要是存储了外设进行输出输入的数据。如 GPIOx_IDR、GPIOx_ODR、USART_DR 等。(3)状态寄存器 xxx_SR(Status Register):这类寄存器主要存储了当前外设
发表于 2019-09-23
STM32——库函数开发小结

stm32点亮LED灯一(库函数版)

学习51单片机的第一个控制IO口的操作就是流水灯,stm32的学习我也是从一个流水灯开始,是stm32是32位机,里面有很多的寄存器,操作stm32单片机也可以使用寄存器操作,使用寄存器操作的好处就是程序的执行速度快,程序的体积小,但是,问题也有很多,比如不方便移植,stm32不同型号的寄存器是有差别的,同时开发的效率低,因为操作寄存器需要频繁地查芯片手册。权衡了一下,我选用库函数点亮LED。第一步,建立环境,我选用的单片机是stm32f103c8,下载器是st-link,编译软件是keil5.首先,我需要配一个库,因为库我只需要GPIO,所以我就只用GPIO库。开始说正事。建立几个文件夹先(显得比较专业)说明:Doc说明文
发表于 2019-09-23
stm32点亮LED灯一(库函数版)

STM8中GPIO的12种模式

(1)GPIO_Mode_In_FL_No_IT:浮空输入无中断(2)GPIO_Mode_In_PU_No_IT:上拉输入无中断(3)GPIO_Mode_In_FL_IT:浮空输入有中断 (4)GPIO_Mode_In_PU_IT :上拉输入有中断 (5)GPIO_Mode_Out_OD_Low_Fast :开漏-输出低-高速   Output open-drain, low level, 10MHz   (6)GPIO_Mode_Out_PP_Low_Fast :推挽-输出低-高速   Output push-pull, low level
发表于 2019-09-23

小广播

何立民专栏

单片机及嵌入式宝典

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

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