|
事无巨细,PWM演示 这几天总是很累,但是要坚持把这个系列写完。今天讲讲PWM。
PWM对许多刚刚跨进电子设计的大门的朋友来说,估计是一个很陌生的名字。当然我本人也只是是一知半解,即便如此,还是尽我所能把我知道的引导给大家。
★PWM,英文全称为Pulse Width Modulation,翻译过来就是脉冲宽度调制。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
★PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
★PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。许多微控制器内部都包含有PWM控制器。例如,Microchip公司的PIC16C67内含两个PWM控制器,每一个都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。
★PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。 对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。 而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。
总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。
上述内容也许比较晦涩,笔者尝试用易懂的话叙述:
★首先要知道,PWM是一种连续的方波,但是与一般方波想比,它的高低电平周期并不相等。
★几个概念,见下图:
T对应的波段,为一个完整PWM波的波形,则T为此PWM波的一个周期。
所以1/T为此PWM波的频率。在此记住一句简单的话:周期和频率互为倒数。
PWM波起始的时间位置称为相位。即相位表示该波形起始的时间距离时间零点多远。
可以看到高电平持续时间TH和低电平持续时间TL并不相等,我们把TH与T的比值定义为改PWM波的占空比。即占空比=TH/T。
★所以可以看到,对于一个正在产生PWM波形的单片机IO口来说,它的实质就是在不断地地按一定的规律来变化它的高低电平。所以在此提出一个问题:用万用表去量一个正在产生PWM波的IO口,量到的是高电平(5V)还是低电平(0V)呢?
其实这是个伪命题,看到上文:PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
这句话的意思是,利用PWM波形可以使数字IO口模拟出模拟信号!!而通过调整PWM波的占空比可以变化模拟大小。假设PWM波峰值电压为VH,一个周期中的高电平持续时间为TH,低电平持续时间为TL,V为模拟电压,则其实有以下公式:
V=VH*(TH/T)
即说明,PWM模拟出来的模拟电压值为PWM峰值电压乘以该波的占空比。所以对于AVR单片机来说,理想情况下,峰值电压为5V(事实上达不到5V),在IO口输出一个占空比=TH/T=1/2的PWM波的情况下,得到的模拟电压为5X1/2=2.5V。所以以上问题的答案是,用万用表去量一个正在产生PWM波的IO口,量到的是模拟电压值。所以要用PWM模拟正弦波形,三角波形等常见的模拟信号波形,只要改变该PWM波的占空比就可以了。所以在此,应该可以理解到上文的“PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换”这句话。
PS:如果觉得“模拟电压”这个概念太抽象。就类似我们家里的电风扇,尽管它只有三个扇叶,但是它转起来的时候,我们看到的往往是一个完整的圆盘。为什么呢,你肯定知道是因为它转的太快了,于是就看起来变成了许多连续的“扇叶”,组成了一个圆盘。事实上确实如此。所以对于此处的PWM来说也有类似的道理,它的电压变化的太快了,以至于从检测仪器来看分辨不出它是不连续的。于是体现出来的就是一个连续信号的效果。
★尽管PWM对外展现的是等同于模拟信号的现象。但是究根揭底,它始终是一种方波,在任意时刻,不是高电平就是低电平,是一种数字信号,不像模拟信号一样存在中间值。所以上文提到,干扰信号只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。这大大提高了PWM的抗干扰能力。
至此,我们对PWM的定义,基本概念,波形特点,还有一些优点有了些许了解了。至于其真正的长处,在工程中的优劣,用言语是无法一一表述的,只能等待各位在实际应用中慢慢去体会。但是在此,至少说让大家有一点肤浅的认识。
下面我们就开始尝试用AVR Mega16单片机产生我们需要的PWM波型,一些官方的泛滥说辞我们就不复制粘贴了。M16单片机内置的三个定时器都可以产生PWM波形,TC0和TC2只有八位的频率精度,TC1可以达到十六位的频率精度并且具备两个输出通道,可以产生两路不同占空比的PWM波形。CEPARK AVR学习开发板就是以TC1的PWM功能设计PWM演示模块的。至于什么精度,请耐心往下看。
先来看看TC1的几个寄存器,笔者只说明输出PWM需要用到的寄存器位:
T/C1 控制寄存器A - TCCR1A,该寄存器各位如下
CMO1A1,COM1A0:这两位决定了输出通道A的比较模式。
COM1B1,COM1B1:这两位决定了输出通道B的比较模式。
WGM11,WGM10:细看下文。
T/C1 控制寄存器B - TCCR1B,该寄存器各位如下
WGM13,WGM12:这两位联合TCCR1A的WGM11,WGM10一起决定定时器TC1的工作模式,详见AVR官方数据文档,文章最后有附件。
CS12,CS11,CS10:这三位决定了定时器TC1时钟源的分频系数。
输出比较寄存器1A- OCR1A:此寄存器中的值为通道A的输出比较值。
输出比较寄存器1B-OCR1B:此寄存器中的值为通道B的输出比较值。
定时器TC1的数据寄存器TCNT1:此寄存器存储了定时器当前的数据。
最后还有中断标志寄存器TIMSK中的OCIE1A 、OCIE1B,使能PWM比较匹配中断。
好,事实上我们只需要操作这几个寄存器:TCNT1、OCR1A、OCR1B、TCCR1B、TCCR1A,TIMSK。
笔者设定了定时器的工作方式为:通道A、B都使用“比较匹配时清零OC1A/OC1B”即当TCNT1中的值与OCR1A或者OCR1B中的值相等时,或将相应的A通道IO或者B通道IO清零;将TC1设定为10位快速PWM模式,10位表示TC1的计时最大值为0x3ff(即11 1111 1111,一共10位,也称为TOP值)当TCNT1里的数据达到TOP值时,会将对应通道置位;时钟源的分频系数为8分频,最后使能A、B两个通道的比较匹配中断,使得在A、B通道匹配产生时会向CPU申请中断,进入中断服务程序。
现在来说说TC1产生PWM的过程:当定时器启动后,TCNT1在定时器时钟的驱动下持续向上加一,TCNT1的值不断增大并当其与OCRAx寄存器中的值相等时,将对应通道置零。TCNT1继续自加,当TCNT1的值达到TOP值时,将对应通道置位,同时TCNT1清零循环加一,至此一个完整的PWM周期便产生了;所以说简要了:遇到OCR1x清零,遇到TOP置位,依次循环,就是这么简单。因此我们很容易看出来,一个PWM脉冲周期里面,从BOTTOM值(也就是0)到OCR1x之间通道显示高电平,从OCR1x到TOP值之间通道显示低电平。那么,我们只要改变OCR1x的值就可以任意改变PWM波的占空比了。来看看CEPARK AVR开发板的PWM演示模块:
如图,TC1两路输出通道A、B分别接在PWM1和PWM2演示示LED上,我们只要在A、B通道输出PWM波,就可以在两个LED上观察到相应现象了。注意此处是AVR的IO口直接驱动LED,而不是像流水灯电路一样是用外部电源驱动。
以下附上源程序:
main.rar
(687 Bytes, 下载次数: 104)
最后补充几个概念:
★关于PWM的周期与频率
现在我们可以知道,PWM的一个周期取决于数据寄存器的计数位数和时钟的分频数,计数位数越高,分频系数越大,周期越长。所以要产生快速的PWM波形,要用低分频系数和低计数位数。
★关于PWM的频率精度
频率精度表示PWM频率可调整的最小值。前文强调过周期与频率的倒数关系,所以频率精度=1/最大周期,定时器TC1的数据存储器有十六位,所以可以达到十六位的频率调整精度。
★关于PWM的输出精度
我们知道V=VH*(TH/T),输出精度即为V的最小步进值,所以最小步进值为1/最大周期(最大计数值)。比如AVR单片机10位的快速的PWM模式可以达到5X1/(2的10次方)=5X1/1024=0.9765X5=4.88mV,这个概念跟ADC的精度类似。好像这个精度也不是很高哈… …
关于程序的一点点说明:
★该程序的作用是分别使两个PWM演示LED,一个以暗逐渐到明,再逐渐回暗的循环过程;另外一个以明逐渐到暗,在逐渐回明的过程。
★中断服务的写法,各个中断入口标识在WINAVR程序文件组中的“avr-libc Manual [WinAVR]”文件里找到。
★要改变随时PWM波的占空比,即是要随时改变OCR1x的值。
★即便AVR的IO口作为第二功能使用,它的方向仍然由DDRx决定。
★注意定时器在时钟选择位不全为0的瞬间启动。(即CS12,CS11,CS10三个寄存器位不为0,0,0)
希望能给有需要的朋友一点帮助。
|
赞赏
-
1
查看全部赞赏
-
|