搜索
bottom↓
回复: 8

脉宽调制的基本原理

[复制链接]

出0入0汤圆

发表于 2008-4-16 23:51:37 | 显示全部楼层 |阅读模式
脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。


模拟电路:
模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。9V电池就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。

模拟电压和电流可直接用来进行控制,如对汽车收音机的音量进行控制。在简单的模拟收音机中,音量旋钮被连接到一个可变电阻。拧动旋钮时,电阻值变大或变小;流经这个电阻的电流也随之增加或减少,从而改变了驱动扬声器的电流值,使音量相应变大或变小。与收音机一样,模拟电路的输出与输入成线性比例。

尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

数字控制:

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。

简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。

例如,假设供电电源为9V,占空比为10%,则对应的是一个幅度为0.9V的模拟信号,使用9V电池来给一个白炽灯泡供电。如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。如果在1秒钟内将此过程重复10次,灯泡将会点亮并象连接到了一个4.5V电池(9V的50%)上一样。这种情况下,占空比为50%,调制频率为10Hz。

大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。要让灯泡取得4.5V电压的供电效果,通断循环周期与负载对开关状态变化的响应时间相比必须足够短。要想取得调光灯(但保持点亮)的效果,必须提高调制频率。在其他PWM应用场合也有同样的要求。通常调制频率为1kHz到200kHz之间。


硬件控制器:
许多微控制器内部都包含有PWM控制器。Atmel公司的AVR单片机中内含有PWM控制器。占空比是接通时间与周期之比;调制频率为周期的倒数。执行PWM操作之前,微处理器要求在软件中完成以下工作:
* 设置提供调制方波的片上定时器/计数器的周期
* 在PWM控制寄存器中设置接通时间
* 设置PWM输出的方向,这个输出是一个通用I/O管脚
* 启动定时器
* 使能PWM控制器

虽然具体的PWM控制器在编程细节上会有所不同,但它们的基本思想通常是相同的。

通信与控制:
PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。

PWM广泛应用在多种系统中。作为一个具体的例子,我们来考察一种用PWM控制的制动器。简单地说,制动器是紧夹住某种东西的一种装置。许多制动器使用模拟输入信号来控制夹紧压力(或制动功率)的大小。加在制动器上的电压或电流越大,制动器产生的压力就越大。

可以将PWM控制器的输出连接到电源与制动器之间的一个开关。要产生更大的制动功率,只需通过软件加大PWM输出的占空比就可以了。如果要产生一个特定大小的制动压力,需要通过测量来确定占空比和压力之间的数学关系(所得的公式或查找表经过变换可用于控制温度、表面磨损等等)。

例如,假设要将制动器上的压力设定为100psi,软件将作一次反向查找,以确定产生这个大小的压力的占空比应该是多少。然后再将PWM占空比设置为这个新值,制动器就可以相应地进行响应了。如果系统中有一个传感器,则可以通过闭环控制来调节占空比,直到精确产生所需的压力。

总之,PWM既经济、节约空间、抗噪性能强,是一种值得广大工程师在许多设计应用中使用的有效技术。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出300入0汤圆

发表于 2008-4-17 16:57:17 | 显示全部楼层
感谢你的资料,根据此资料我写了一个小玩具,不说了,开!
.include "tn13def.inc"
.DEF TEMP        = R16                        ;各种临时变量。
.DEF ZERO        = R3                        ;清零寄存器
.DEF CON        = R19                        ;存放计数器的内存
.DEF ADS        = R20                        ;递加值的初始内存。存放递加数
.DEF TOCR0        = R21                        ;存放定时器值


.org 0x0000
        RJMP RESET                                ;开机跳转
        RJMP RESET                                ;外部按键唤醒休眠       

.ORG 0X4A
RESET:                                                ;初始化系统中断和资源部分
        CLI                                                ;关闭全局中断标志
        WDR                                                ;喂狗,防止它出来咬人
        LDI TEMP,$00                        ;设置清除ram
        MOV ZERO,TEMP                        ;清除R3
        MOV CON,ZERO                        ;清除累计计数器
        MOV TOCR0,TEMP                        ;清除pwm初值
          LDI TEMP,low(RAMEND)        ;设置堆栈指针低位 ??
        OUT SPL,TEMP                         ;设置堆栈指针为ram顶部??
        OUT WDTCR,ZERO                        ;把狗喂饱了再偷偷打死,免得以后害人
        OUT DIDR0,ZERO                        ;关闭全部数字输入输出缓冲
        OUT SREG,ZERO                        ;清除全部数学标志。(增加稳定性)
        LDI        TEMP,$10                        ;装muccr控制数
        MOV ADS,TEMP                        ;把递加值放在递加数寄存器内
        OUT MCUCR,TEMP                        ;传递控制数:上拉开=0;休眠关;掉电休眠模式
        LDI TEMP,$FF
        OUT PORTB,TEMP                        ;端口上拉全开       
        LDI        TEMP,$3D
        OUT DDRB,TEMP                        ;端口PB1输入开,也是int0端口
        LDI TEMP,0x19                        ;减小temp值,快速进入休眠

BEGIN:
        RCALL DY01S                                ;定时基准是0s1
        DEC TEMP                                ;递减约2s5后无按键则休眠
        BREQ LJ0                                ;TEMP=0经中间跳转句去跳转区?
        SBIC PINB,1                                ;键判断是否启动
        RJMP BEGIN                                ;键判断结束区   

ADT:
        RCALL DY01S                                ;延迟0.1s再判断
        SBIC PINB,1                                ;K=0;按键有效。同时包括出错判断
        RJMP BEGIN                                ;初次键判断延迟及误复位处理完
        CBI DDRB,3                                ;开PB3输入,置为输入高阻
        CBI PORTB,3                                ;开PB3输入(pwm只能驱动PB4)
        LDI TEMP,$C3                        ;装各种操作数操作pwm初始化
        OUT TCCR0A,TEMP                        ;定义输出模式\输出脚
        LDI TEMP,$01                        ;T0时钟系统CLIio不分频 128k
        OUT TCCR0B,TEMP                        ;定义输出模式\分频系数
        LDI TOCR0,$00                        ;初始pwm值
        LDI CON,$06                                ;初始化计数器,6级输出
;-------------------------------------------------------------
;    DEF R20=TOCR0,K=PB1,低电平动作,可能在硬件新版本中加入
;上拉电阻,以维持端口电平
;_____________________________________________________________

RA1:
        ADD TOCR0,ADS                        ;ADD计时器和步进值
        OUT OCR0A,TOCR0                 ;输出pwm脉冲,pb4会亮
        DEC CON                                        ;递增计数值;判断是否到6次,减完保持
        BREQ RHOLD                                ;如果相等就跳转到保持段
        LDI TEMP,$50                        ;定义每个按键周期检测是0s8,4s8循环完

RA2:
        RCALL DY01S                       
        DEC TEMP                                ;0s8递减数
        BREQ RJX                                ;延迟数检查是否减完,减完就跳转
        RJMP RA2                                ;08延迟数没减完,返回继续减

RJX:       
        SBIS PINB,1                                ;再检测键释放?是跳过下行
        RJMP RA1                                ;没释放,回去再加pwm值
;-----------------------------------------------------------
;                读取键盘释放信息,并开始计时。
;-----------------------------------------------------------
RHOLD:
        RCALL DY01S                                ;延迟释放
        SBIC PINB,1                                ;检测键盘释放B=0?跳行!
        RJMP RTMOUT                        ;释放了就跳去开始计时
        RJMP RHOLD                                ;没释放再返回等待

LJ0:
        RJMP LJ1
;-------------------专用0s1延迟-------------------------
DY01S:                                                ;目前延迟时间0.1S,10HZ
        LDI R17,$C8                        ;原9.6/8预分频为1.2M,软件版本1.27
D41:LDI R18,$40                        ;现改1.2M 8频,CLK=128K.O.1S=12800
D42:DEC R18
        DEC R17
        BRNE D41
        RET

;-----------------------------------------------------------
;       1800s自关机超时,定义键盘检测:如果按下进绿灯循环
;-----------------------------------------------------------
RTMOUT:
                LDI CON,$C8                        ;延迟循环值1
RL1:        LDI TEMP,$5A                ;装载另一个操作数,准备递减延迟
RL2:        RCALL DY01S                        ;每个周期调用01s延迟
                DEC TEMP
                RJMP RKEY                        ;每0.1s检测一次键
RL3:        BRNE RL2
                DEC CON
                BRNE RL1
                RJMP OFF                ;减完了就去关机了。

;--------------转为1800s制造的R键判断延迟-----------------
RKEY:
        SBIC PINB,1                        ;检测键按下,跳转去绿色控制
        RJMP RL3                        ;否则返回

;---------------进绿色开启段,关闭红色---------------------
GDT:
        OUT OCR0A,ZERO                        ;关掉pwm输出
        RCALL DY01S                                ;为同步定时器,防止一个延迟
        LDI TEMP,$FF
        OUT PORTB,TEMP                        ;端口上拉全开       
        LDI        TEMP,$3D
        OUT DDRB,TEMP                        ;端口PB1输入开,也是int0端口
        RCALL DY01S                                ;延迟0s1
        SBIC PINB,1                                ;按键仍然有效,做识别
        RJMP BEGIN                                ;无键动作做出误处理
        CBI DDRB,4                                ;开PB4输入,置为输入高阻
        CBI PORTB,4                                ;开PB4输入(pwm只能驱动PB3)
        LDI TOCR0,$00                        ;初始pwm值
        LDI CON,$06                                ;初始化计数器,6级输出
;-------------------------------------------------------------
;    DEF R20=TOCR0,K=PB1,低电平动作,可能在硬件新版本中加入
;上拉电阻,以维持端口电平
;_____________________________________________________________

GA1:
        ADD TOCR0,ADS                        ;INC计时器和步进值
        OUT OCR0A,TOCR0                 ;输出pwm脉冲
        DEC CON                                        ;递增计数值;判断是否到6次,减完保持
        BREQ GHOLD                                ;如果相等就跳转到保持段
        LDI TEMP,$50                        ;定义每个按键周期检测是0s8,4s8循环完

GA2:
        RCALL DY01S                       
        DEC TEMP                                ;0s8递减数
        BREQ GJX                                ;延迟数检查是否减完,减完就跳转
        RJMP GA2                                ;08延迟数没减完,返回继续减

GJX:       
        SBIS PINB,1                                ;再检测键释放=1?是跳过下行
        RJMP GA1                                ;没释放,回去再加pwm值
;-----------------------------------------------------------
;                读取键盘释放信息,并开始计时。
;-----------------------------------------------------------
GHOLD:
        RCALL DY01S                                ;延迟释放
        SBIC PINB,1                                ;检测键盘按下B=0?跳行!
        RJMP GTMOUT                        ;释放了就跳去开始计时
        RJMP RHOLD                                ;没释放再返回等待

LJ1:
        RJMP POW_OFF
;-----------------------------------------------------------
;       1800s自关机超时,定义键盘检测:如果按下进绿灯循环
;-----------------------------------------------------------
GTMOUT:
                LDI CON,$C8                        ;延迟循环值1
GL1:        LDI TEMP,$5A                ;装载另一个操作数,准备递减延迟
GL2:        RCALL DY01S                        ;每个周期调用01s延迟
                DEC TEMP
                RJMP GKEY                        ;每0.1s检测一次键
GL3:        BRNE GL2
                DEC CON
                BRNE GL1
                RJMP OFF                ;减完了就去关机了。
;--------------转为1800s制造的G键判断延迟-----------------
GKEY:
        SBIC PINB,1                                ;检测键按下,跳转去绿色控制
        RJMP GL3                                ;否则返回

;--------------------------------------------------------
;  DEF        TIME_OUT关机段,当超时再按键则判断是否释放
;  释放后,全关
;--------------------------------------------------------
OFF:
        OUT TCCR0A,ZERO
        OUT TCCR0B,ZERO
        LDI TEMP,$FF
        OUT PORTB,TEMP                        ;端口上拉全开       
        LDI        TEMP,$3D
        OUT DDRB,TEMP                        ;端口PB1输入开,也是int0端口
        RCALL DY01S
        SBIC PINB,1                                ;读键释放否?
        RJMP POW_OFF                                ;K=1,已释放就去关
        RCALL DY01S
        RJMP OFF                                ;K=0,返回再检测键释放没



;-------------------------------------------------------
;      主程序结束,定义全关,重开sleep和中断wake up
;-------------------------------------------------------
POW_OFF:
        LDI TEMP,$40
        OUT GIMSK,TEMP                        ;开启INT0中断允许
        LDI TEMP,$30
        OUT MCUCR,TEMP
        SEI
        SLEEP                                ;进入休眠模式
        RJMP OFF                        ;强制在此循环

出300入0汤圆

发表于 2008-4-17 16:59:44 | 显示全部楼层
单键6级(非连续)pwm,单键双色输出,完整汇编程序,汇编不好看,我反复加注释,自己有时都会晕
我只会用汇编,可以用AStudio粘贴就能生成了,硬件在程序里说了.

出0入0汤圆

 楼主| 发表于 2008-4-17 22:03:55 | 显示全部楼层
没看到你的晶振是多少,所以不知道PWM频率。
总之要在具体项目中尽可能高的提高PWM调制频率(当然要考虑成本先,嘿嘿)

出300入0汤圆

发表于 2008-4-18 17:54:43 | 显示全部楼层
;-------------------专用0s1延迟-------------------------
DY01S:                                                ;目前延迟时间0.1S,10HZ
        LDI R17,$C8                        ;原9.6/8预分频为1.2M,软件版本1.27
D41:LDI R18,$40                        ;现改1.2M 8频,CLK=128K.O.1S=12800  
D42:DEC R18
        DEC R17
        BRNE D41
        RET

嘿嘿,以前那个版本是4.8M不分频,现在是128k不分频,待机电流=0uA,用在一个用2032扣式电池供电的,对功耗有变态要求……
为一个照明功能的小零件。提高pwm频率可以有效降低滤波功率器件尺寸、改善工作线性,但是自耗变的很“可观”用这么低的频率是没办法:F=128K/256=500HZ,高速运动的时候闪。我要改善滤波,不过这次尺寸没有限制了。好搞
后面注释有误,请参照帮助读程序。注释改了很多次的……

出0入0汤圆

发表于 2010-3-22 11:14:38 | 显示全部楼层
挺不错的  理解了,最近正在搞PWM控制电机  谢谢你的资料

出0入0汤圆

发表于 2011-7-8 14:58:43 | 显示全部楼层
我擦,二楼的全部是汇编啊!!太牛了!

出0入0汤圆

发表于 2014-8-16 10:56:45 | 显示全部楼层
简单易懂,感谢楼主

出0入0汤圆

发表于 2014-8-16 11:12:27 | 显示全部楼层
看来我还不是很明白,我想问一下就是8位分辨率的脉宽调制输出中的8位分辨率是什么意思?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表