STM32 —— PWM 入门
STM32 —— PWM 入门
简介
PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或 MOS 管栅极的偏置,来实现晶体管或 MOS 管导通时间的改变,从而实现开关稳压电源输出的改变。
基本原理
PWM 就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也可以这样理解,PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有( ON ),要么完全无( OFF )。电压或电流源是以一种通( ON )或断( OFF )的重复脉冲序列被加到模拟负载上去的。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。
要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形
面积等效原理
面积等效原理是PWM控制技术的重要理论基础。 原理内容:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
冲量即指窄脉冲的面积
效果基本相同,是指环节的输出响应波形基本相同
如果把各输出波形用傅里叶变换分析,则其低频段非常接近,仅在高频 段略有差异
将图1a、b、c、d所示的脉冲作为输入,加在图2a所示的R-L电路 上,设其电流i(t)为电路的输出,图2b给出了不同窄脉冲时i(t)的响应波形
用 pwm 波代替正弦波
用PWM波代替正弦半波
将正弦半波看成是由 N 个彼此相连的脉冲宽度为 π/N ,但幅值顶部是曲线且大小按正弦规律变化的脉冲序列组成的
把上述脉冲序列利用相同数量的等幅而不等宽的矩形脉冲代替,使矩形脉冲的中点和相应正弦波部分的中点重合,且使矩形脉冲和相应的正弦波部 分面积(冲量)相等,这就是 PWM 波形。对于正弦波的负半周,也可以用同样的方法得到 PWM 波形
脉冲的宽度按正弦规律变化而和正弦波等效的 PWM 波形,也称 SPWM(Sinusoidal PWM)波形
基于等效面积原理,PWM 波形还可以等效成其他所需要的波形,如等效所需要的非正弦交流波形等
PWM 波形可分为等幅 PWM 波和不等幅PWM波两种,由直流电源产生的 PWM 波通常是等幅 PWM 波
调制法生成 PWM 波形
把希望输出的波形作为调制信号,把接受调制的信号作为载波,通过信号波的调制得到所期望的PWM波形。最简单可以产生一个脉冲宽度调制信号的方式是交集性方法(intersective method),这个方法只需要使用锯齿波或三角波以及一个比较器。当参考的信号值(红色波)比锯齿波(蓝色波) 大,则脉冲调制后的结果会在高状态,反之,则在低状态,如图:
图中,红色:调制信号;蓝色:载波信号;紫色:已调制信号
PWM 信号参数
周期:信号变化的过程中,某段波形重复出现,其某一次开始至结束的这段时间就称为 “周期”
脉宽:在一个周期内正脉冲的持续时间
占空比:是在一串理想的脉冲系列中,脉宽与周期的比值。例如在上图中t为正脉冲的持续时间,T为脉冲周期,占空比为t/T
PWM 实现方式
简而言之,PWM 是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM 信号仍然是数字信号,而且幅值相等,在任意时刻,输出的信号就只有 1(ON) 或者 0(OFF) 两个状态,具体是 0 还是 1 ,则由控制器来控制,也由控制器的精度决定只要带宽足够,任何模拟值都可以使用PWM进行编码
既然 PWM 是数字信号,那么任何具有高低电平可控输出功能的数字芯片都可以生成 PWM ,比如最常用有微控制器( MCU ),可编程逻辑 FPGA ,或是 LED 驱动控制芯片如 PCA9685 ,以及各种电源用的控制芯片,以上都可以产生 PWM 波形,所以说 PWM 应用实在是太广了
模拟 PWM 电路
单片机( MCU )生成 PWM
使用 MCU 生成 PWM 是最简单的方式,PWM 发生功能和定时器功能是一起的,一种方法是使用软件设置定时器的定时时间,定时时间到翻转 I/O 的高低电平,由于是软件来翻转电平,因此精度不能做到非常精确;另一种是直接使用定时器中的 PWM 功能,在定时器模块中已经集成了专用的 PWM 发生电路,用户只需要配置一下该模块的寄存器,在寄存器中配置好 PWM 的频率和占空比,软件使能该功能后,就可以输出精准的 PWM 波形。
STM32 中的 PWM
TIM 与 PWM
STM32 的定时器除了 TIM6 和 TIM7 ,其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。通用定时器产生PWM 的定时器框图如下:
![](https://img2022.cnblogs.com/blog/2829072/202211/2829072-20221105215104565-1728434858.png)
在 STM32 中,PWM 有两种产生方式:
-
利用普通IO口输出PWM
-
利用定时器的PWM的IO口或复用IO口
PWM 产生方式
PWM 端口
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出
普通 IO 口
一般能够输出 PWM 的端口都会在主要功能那一栏出现 CHx 的标志,而普通定时器没有出现这种标志
这里使用普通 IO 口输出 PWM 有三种方式:
-
定时器中断产生 pwm
-
比较匹配 + 溢出中断
-
系统滴答定时器
普通 IO 口如何产生一个 pwm ?其实就是通过一个高低电平周期性的变化。这种思想很重要,确定频率就可以确定周期(T=1/f)也就是在一个周期内产生 pwm 的时间可以确定下来了
不同产生方式对比
一般而言,尽量选用 PWM 口进行 PWM 输出,因为普通 IO 口模拟 PWM 的输出频率越高,进入定时器中断的次数就越快,中断间隔的时间越短,如果再有其他类型的中断也要处理时,会因为中断的优先级嵌套等待响应,影响控制精度,PWM 输出误差增大,也会影响其他如 ADC 等中断处理,甚至会较出现单片机逻辑出错,死机或者跑飞的情况
普通 IO 也可以输出 PWM ,只是产生 PWM 一般用转用芯片(开关电源上用的较多)或者单片机的 PWM 内置模块如定时器,很小直接用 MCU 的 IO 口线直接输出因为那样太耗 MCU 资源了
PWM 的通道概览
每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较
CCR1寄存器:捕获/比较值寄存器:设置比较值;
CCMR1寄存器:OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1或者PWM模式2
CCER寄存器:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效
CCER寄存器:CC1E位:输入/捕获1输出使能。0:关闭,1:打开
PWM输出的模式区别
通过设置寄存器 TIMx_CCMR1的OC1M[2:0] 位来确定PWM的输出模式:
PWM 模式1:在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道1为有效电平,否则为无效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时通道 1 为无效电平( OC1REF=0 ),否则为有效电平( OC1REF=1 )
PWM 模式2:在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道1为无效电平,否则为有效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时通道1为有效电平,否则为无效电平
注意:PWM 的模式只是区别什么时候是有效电平,但并没有确定是高电平有效还是低电平有效。这需要结合 CCER 寄存器的 CCxP 位的值来确定
例如:若 PWM 模式1,且 CCER 寄存器的 CCxP 位为 0 ,则当 TIMx_CNT<TIMx_CCR1 时,输出高电平;同样的,若 PWM 模式 1 ,且 CCER 寄存器的 CCxP 位为2,则当TIMx_CNT<TIMx_CCR1时,输出低电平
PWM 的计数模式
向上计数模式
下面是一个 PWM 模式 1 的例子。当 TIMx_CNT<TIMx_CCRx 时 PWM 信号参考 OCxREF 为高,否则为低。如果 TIMx_CCRx 中的比较值大于自动重装载值( TIMx_ARR ),则 OCxREF 保持为 1。如果比较值为 0,则 OCxREF 保持为 0
向下计数模式
在 PWM 模式 1,当 TIMx_CNT>TIMx_CCRx 时参考信号 OCxREF 为低,否则为高。如果 TIMx_CCRx 中的比较值大于 TIMx_ARR 中的自动重装载值,则 OCxREF 保持为 1 。该模式下不能产生 0% 的 PWM 波形。
中央对齐模式
当 TIMx_CR1 寄存器中的 CMS 位不为 00 时,为中央对齐模式(所有其他的配置对 OCxREF/OCx 信号都有相同的作用)。根据不同的 CMS 位设置,比较标志可以在计数器向上计数时被置 1 、在计数器向下计数时被置 1 、或在计数器向上和向下计数时被置 1 。TIMx_CR1 寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它