3

关于投票
PWM控制LED渐亮与渐灭

;设计思路:用定时器中断产生最小时间单位T0,每m个T0组成一个子周期T10,其中前n个T0为LED导通时间,即Ton=n*T0,则Toff=(m-n)*T0
;每X个T10组成一个母周期T20,其中前y个T10为有效控制时间,后续的(x-y)个T10令LED熄灭或者子周期占空比调至最小。
;适当调节n/m和x/y的比例使显示效果达到最佳。
;以下是刚刚调试通过的小段程序,显示效果良好。
;实验过程本人有一种推测,不知是否成立:
;子周期的最小占空比的宽度应大于LED的点亮时间,即点亮LED的时间宽度n/m*T0应足够产生余辉。类似于动态数码管对点亮时间的要求。
;母周期的宽度应小于1/50s,提高刷新频率以令肉眼察觉不出闪烁。
;未经验证的推测,可能是错误的,请大家接着探讨。。。
;芯片: AT89C2051
;晶振:18.9375
;电路描述:输入5V电源,简易RC复位,P3.3对地接KEY(减1),P3.3对地接KEY2(加1),P3.7接三极管C106驱动LED。LED直径5mm,红色。限流电阻471、1/4W.
;功能描述:LED渐亮渐灭。按住KEY可以保持住当前某占空比的亮度(如一开始按住KEY再通电,将看到空度比为1%的亮度)。
;调节子周期和母周期,均可渐亮渐灭。 同时按下“加1”和“减1”按键切换选择调节对象(2004.11.04)
LED BIT P3.7
KEY BIT P3.3
SOV BIT 20H.0 ;子周期显示完毕标志
BOV BIT 20H.1 ;母周期显示完毕标志
SSS EQU 30H   ;子周期占空宽度调节
T10 EQU 31H   ;子周期宽度
AAA EQU 32H   ;子周期占空宽度入口
BBB EQU 33H   ;母周期占空宽度入口
T20 EQU 34H   ;母周期宽度
MMM EQU 35H   ;母周期占空宽度调节
A10 EQU 36H   ;子周期宽度缓冲
B20 EQU 37H   ;母周期宽度缓冲

KEY2 BIT P3.2
COM1 BIT P3.5
COM2 BIT P3.4
COM3 BIT P3.1
COM4 BIT P3.0
NOISE1 EQU 38H
NOISE2 EQU 39H
NOISE3 EQU 3AH

ORG 00H
LJMP MAIN
ORG 0BH
LJMP PWM

PWM:
MOV TH0,#0FFH
MOV TL0,#90H
PUSH ACC
;####################################################
JB  BOV,OUTLOW
;*********************************************
JB  SOV,IFSEND
DEC  T10               ;保持计数同步
DJNZ SSS,LRET          ;占空参数修正
MOV  SSS,AAA           ;复原子周期占空参数
MOV  A,T10
CJNE A,#0,SCTN         ;对占空比为100%时的修正
AJMP T10END
SCTN:
CLR  LED
SETB SOV
AJMP LRET
IFSEND:
DJNZ T10,LRET
T10END:
MOV  T10,A10           ;复原子周期宽度参数
SETB LED
CLR  SOV               ;子周期处理完毕
;**********************************************
DEC  T20
DJNZ MMM,LRET
MOV  MMM,BBB
MOV  A,T20
CJNE A,#0,MCTN         ;对占空比为100%时的修正
AJMP T20END
MCTN:
CLR  LED
SETB BOV
AJMP LRET
OUTLOW:
CLR  LED               ;母周期低电平部分输出0DJNZ T10,LRET
MOV  T10,A10
DJNZ T20,LRET
T20END:
MOV T20,B20
SETB LED
CLR  BOV               ;母周期处理完毕
;#############################
LRET:
POP ACC
RETI

MAIN:
MOV  P3,#00001100B
MOV TMOD,#01H
MOV A10,#10        ;子周期宽设置
MOV B20,#20        ;母周期宽设置
MOV T10,A10
MOV T20,B20
MOV AAA,#6         ;子周初始占空宽度设置
MOV BBB,#20         ;母周初始占空宽度设置
MOV SSS,AAA
MOV MMM,BBB
SETB ET0
SETB TR0
SETB EA
SETB LED
MOV  20H,#0;所有标志位清零
MOV  R0,#250
MOV  R1,#2 ;每隔0.07*250*2ms调节一次亮度

FREE:    ;KEY BBBBBBBBBBBBBBBBBBBBBBBBBBBB
MOV  PCON,#1
CHANGE2:
JB  KEY,CHOU1
JB  KEY2,CHOU1
DJNZ NOISE1,FREE
JNB KEY,$
JNB KEY2,$
AJMP FREE3
CHOU1:
MOV NOISE1,#0
DOWN1:
JB KEY,UP1
DJNZ NOISE2,FREE
DJNZ BBB,NEXT      ;减1修正
MOV  BBB,#1
NEXT:
JB   KEY,FREE      ;操作完成后待松键再退出
JNB  KEY2,FREE
SJMP NEXT
UP1:
MOV NOISE2,#0
IFUP:
JB KEY2,LCRNOS
DJNZ NOISE3,FREE
INC  BBB            ;加1修正
MOV  A,BBB
CJNE A,#21,NEXT2
MOV  BBB,#20
NEXT2:
JB   KEY2,FREE      ;操作完成后待松键再退出
JNB  KEY,FREE
SJMP NEXT2
LCRNOS:
MOV NOISE3,#0
AJMP FREE ;KEY B


FREE3:    ;KEY 
MOV  PCON,#1
CHANGE1:
JB  KEY,CHOU2
JB  KEY2,CHOU2
DJNZ NOISE1,FREE3
JNB KEY,$
JNB KEY2,$
AJMP FREE
CHOU2:
MOV NOISE1,#0
DOWN2:
JB KEY,UP2
DJNZ NOISE2,FREE3
DJNZ AAA,NEXT3      ;减1修正
MOV  AAA,#1
NEXT3:
JB   KEY,FREE3      ;操作完成后待松键再退出
JNB  KEY2,FREE3
SJMP NEXT3
UP2:
MOV NOISE2,#0
IFUP2:
JB KEY2,LCRNOS2
DJNZ NOISE3,FREE3
INC  AAA            ;加1修正
MOV  A,AAA
CJNE A,#11,NEXT4
MOV  AAA,#10
NEXT4:
JB   KEY2,FREE3      ;操作完成后待松键再退出
JNB  KEY,FREE3
SJMP NEXT4
LCRNOS2:
MOV NOISE3,#0
AJMP FREE3 ;
END

系统分类: 单片机
用户分类: pwm脉宽调制
标签: pmw
来源: 转贴
发表评论 阅读全文(640) | 回复(0)

3

关于投票
用单片机产生正玄波信号的方法

一、定时/计数器PWM设计要点

根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:

1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。

2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。

3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))

4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。

5.频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。PWM频率的计算公式为:

PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))

6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。

7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。此时应注意:不仅调整占空比时,PWM的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase and Frequency Correct)。

8.在PWM方式中,计数器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)。或由用户设定的0x0000-0xFFFF,设定值在16位T/C的ICP或OCRA寄存器中。而比较匹配寄存器的值与计数器上限值之比即为占空比。

二、 PWM应用设计参考

  下面给出一个设计示例,在示例中使用PWM方式来产生一个1KHz左右的正弦波,幅度为0-Vcc/2。

  首先按照下面的公式建立一个正弦波样本表,样本表将一个正弦波周期分为128个点,每点按7位量化(127对应最高幅值Vcc/2):

f(x) = 64 + 63 * sin(2πx/180) x∈[0…127]

   如果在一个正弦波周期中采用128个样点,那么对应1KHz的正弦波PWM的频率为128KHz。实际上,按照采样频率至少为信号频率的2倍的取样定理来计算,PWM的频率的理论值为2KHz即可。考虑尽量提高PWM的输出精度,实际设计使用PWM的频率为16KHz,即一个正弦波周期(1KHz)中输出16个正弦波样本值。这意味着在128点的正弦波样本表中,每隔8点取出一点作为PWM的输出。

  程序中使用ATmega128的8位T/C0,工作模式为相位调整PWM模式输出,系统时钟为8MHz,分频系数为1,其可以产生最高PWM频率为: 8000000Hz / 510 = 15686Hz。每16次输出构成一个周期正弦波,正弦波的频率为980.4Hz。PWM由OC0(PB4)引脚输出。参考程序如下(ICCAVR)。

//ICC-AVR application builder : 2004-08
// Target : M128
// Crystal: 8.0000Mhz

#include
#include

#pragma data:code
// 128点正弦波样本表
const unsigned char auc_SinParam[128] = {
64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,
123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,
117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,
45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,
7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};
#pragma data:data

unsigned char x_SW = 8,X_LUT = 0;

#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
   X_LUT += x_SW; // 新样点指针
   if (X_LUT > 127) X_LUT -= 128; // 样点指针调整
   OCR0 = auc_SinParam[X_LUT]; // 取样点指针到比较匹配寄存器
}

void main(void)
{
   DDRB |= 0x10; // PB4(OC0)输出
   TCCR0 = 0x71; // 相位调整PWM模式,分频系数=1,正向控制OC0TIMSK = 0x01; // T/C0溢出中断允许
   SEI(); // 使能全局中断
   while(1)
      {……};
}

 

  每次计数器溢出中断的服务中取出一个正弦波的样点值到比较匹配寄存器中,用于调整下一个PWM的脉冲宽度,这样在PB4引脚上输出了按正弦波调制的PWM方波。当PB4的输出通过一个低通滤波器后,便得到一个980.4Hz的正弦波了。如要得到更精确的1KHz的正弦波,可使用定时/计数器T/C1,选择工作模式10,设置ICR1=250为计数器的上限值。

  在ATMEL公司网站上,给出了使用一个定时/计数器实现双音频拨号的应用设计参考(AVR314.pdf),读者可以从中学习到如何更好设计和使用PWM的功能。

 

f(x) = 64 + 63 * sin(2πx/128) x∈[0…127]

这个问题我也弄过好长一段时间。
在编号为 AVR314 的 Application Note 中,这个讲得很详细。
在这个 note 中,因为正弦波最终用于高、低频的叠加以生成DTMF信号,所以就用了7位来存储正弦表。7位最大为127
而f(x)=sin(x)的值域为[0…1],所以,63 * sin(2πx/128)就放大了值域。再加64,则将值全部上移为正,满足存储要求。

系统分类: 单片机
用户分类: pwm脉宽调制
标签: pmw
来源: 无分类
发表评论 阅读全文(878) | 回复(0)

2

关于投票
PWM技术
Tue Jul 31 2007
PWM技术
脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
    简而言之,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
    PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。
    对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式。

PWM控制技术一直是变频技术的核心技术之一。1964年A.Schonung和H.stemmler首先提出把这项通讯技术应用到交流传动中,从此为交流传动的推广应用开辟了新的局面。
从最初采用模拟电路完成三角调制波和参考正弦波比较,产生正弦脉宽调制SPWM信号以控制功率器件的开关开始,到目前采用全数字化方案,完成优化的实时在线的PWM信号输出,可以说直到目前为止,PWM在各种应用场合仍在主导地位,并一直是人们研究的热点。
由于PWM可以同时实现变频变压反抑制谐波的特点。由此在交流传动及至其它能量变换系统中得到广泛应用。PWM控制技术大致可以为为三类,正弦PWM(包括电压,电流或磁通的正弦为目标的各种PWM方案,多重PWM也应归于此类),优化PWM及随机PWM。正弦PWM已为人们所熟知,而旨在改善输出电压、电流波形,降低电源系统谐波的多重PWM技术在大功率变频器中有其独特的优势(如ABB  ACS1000系列和美国ROBICON公司的完美无谐波系列等);而优化PWM所追求的则是实现电流谐波畸变率(THD)最小,电压利用率最高,效率最优,及转矩脉动最小以及其它特定优化目标。
在70年代开始至80年代初,由于当时大功率晶体管主要为双极性达林顿三极管,载波频率一般最高不超过5kHz,电机绕组的电磁噪音及谐波引起的振动引起人们的关注。为求得改善,随机PWM方法应运而生。其原理是随机改变开关频率使电机电磁噪音近似为限带白噪音(在线性频率坐标系中,各频率能量分布是均匀的),尽管噪音的总分贝数未变,但以固定开关频率为特征的有色噪音强度大大削弱。正因为如此,即使在IGBT已被广泛应用的今天,对于载波频率必须限制在较低频率的场合,随机PWM仍然有其特殊的价值(DTC控制即为一例);别一方面则告诉人们消除机械和电磁噪音的最佳方法不是盲目地提高工作频率,因为随机PWM技术提供了一个分析、解决问题的全新思路。
系统分类: 单片机
用户分类: pwm脉宽调制
标签: pmw
来源: 转贴
发表评论 阅读全文(500) | 回复(0)
总共 , 当前 /