STM32上的PWM
2019-03-06 来源:eefocus
在昨天的实验室嵌入式组内分享会上我讲解了PWM、外部中断以及定时器的一些知识,在整理知识点以及制作PPT的过程中也对自己的知识进行了一个总结,所以打算写三篇博客来记录这三个方面的知识点,就以我最近使用的STM32作为平台来记录,其实这三个点是单片机可以说最为基础以及通用的点,任何一个MCU都会有,所以说总结一下还是很有必要的。
首先就是PWM。
在昨天的分享会上,我以如何调节灯光的亮暗作为引入来讲解PWM,最容易想到的方法就是加一个可调电阻,就像老式的台灯一样,有一个旋钮,通过调节接入电路电阻的阻值来分压或者分流,降低或者调高灯的亮度。还有一个方法就是调节电压,使工作电压低于额定电压就会使灯的亮度降低,而达到或者超过一点额定电压(超过太多肯定会烧了LED)也可以让灯的亮度提高。最后,我们可以用PWM的方式来调节灯的亮度,使小灯以较高频率的闪烁,通过控制高电平和低电平的时间,来控制灯的亮度。
一、原理介绍
什么是PWM?
脉冲宽度调制(Pulse Width Modulation,PWM)简称脉宽调制
是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术
简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
什么是占空比?
占空比就是高电平所占整个周期的时间,如下图所示:
第一个PWM波,周期为10ms,高电平的时间为4ms,所以占空比为40%,同理第二个PWM波为60%,第三个为80%。
调节占空比相当于实际上在调节有效值,如下图不同占空比的PWM的有效值是不同的。
什么是PWM的频率?
PWM的频率的整个周期的倒数,所以说上图PWM的周期为1/0.01,也就是100HZ。改变PWM的频率是通过改变整个的周期实现的。
所以通过改变高低电平总共的时间、改变高电平占总周期的比例就可以实现任意
频率、任意占空比的PWM波。
PWM的用途:
电机调速、功率调制、PID调节、通信等等
PWM的优点:
配置简单、抗干扰能力强
二、在32上的PWM
在STM32上定时器有专门的PWM模式,它的原理就是使用比较输出的方式如下图
ARR为自动重载寄存器,CCR为捕获/比较寄存器,CNT就是定时器的计数器,CNT的值从0开始递增,使用PWM模式后,可以设置有效电平,以及PWM的模式。上图所示的是当CNT的值小于CCRx时,输出低电平,当CNT的值大于CCRx时,输出高点平,所以我们可以通过改变ARR的值来改变PWM的周期,改变CCRx的值来改变PWM的占空比,从而实现任意频率任意占空比的PWM波。
涉及到的寄存器:
用到的一般就是这三个位,CKD来设置时钟分频,ARPE来使能自动重载预装载,CEN来使能计数器。
OC1M来配置PWM的模式,PWM模式1,CNT
CC1P来配置输出极性,可以选择高电平有效或者低电平有效。CC1E来使能捕获/比较。
PWM的配置过程如下:
1、使能IO口时钟以及定时器的时钟
**为什么会使能俩次时钟:因为在单片单片机中IO口、DMA的时钟与低速外设(定时器、ADC、DAC等)并不是共用同一条时钟线的,IO口、DMA以及USB以太网等的时钟线为AHB,主要用于高性能的外设的连接;而定时器、UART等的时钟线为APB,主要用于低带宽的外设的连接。这些涉及到AMBA片上总线规范,在以后的博客中我会单独进行总结。
2、设置IO口为复用模式、复用为TIM。
3、配置定时器:设置ARR、PSC控制周期,设置PWM模式
4、使能定时器通道的输出、使能定时器、
5、修改CCR寄存器控制PWM的占空比
代码实现如下:
//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<8; //TIM14时钟使能
RCC->AHB1ENR|=1<<5; //使能PORTF时钟
GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
GPIO_AF_Set(GPIOF,9,9); //PF9,AF9
TIM14->ARR=arr; //设定计数器自动重装值
TIM14->PSC=psc; //预分频器不分频
TIM14->CCMR1|=6<<4; //CH1 PWM1模式
TIM14->CCMR1|=1<<3; //CH1 预装载使能
TIM14->CCER|=1<<0; //OC1 输出使能
TIM14->CCER|=1<<1; //OC1 低电平有效
TIM14->CR1|=1<<7; //ARPE使能
TIM14->CR1|=1<<0; //使能定时器14
}
通过修改TIM14->CCR1的值可以修改PWM的占空比,可以使用宏定义,这样使修改更加方便。
#define PWM_VAL TIM14->CCR1
主程序中:
TIM14_PWM_Init(100-1,8400-1); //10Khz的计数频率,100HZ的PWM.
如果设置PWM_VAL的值为50,就产生了占空比为50%为的PWM波。
三、总结
以上就是关于PWM的原理介绍以及在STM32上的寄存器配置过程。PWM通常是我们最先接触的,同时它差不多也是开发时用到最多的,所以说熟练掌握PWM的配置与使用是至关重要的。
上一篇:STM32上的外部中断
下一篇:使用stm32产生三角波和正弦波