AVR产生PWM波实例程序

AVR的PWM波(1)一个实例例:这个程序是用IICC的向导导生成的,很很简单 T0是作为普通通8位定时器器,频率1000KHz,每每次中断将PPB0(piin1)状态态反转,产生生的是2000KHz占空空比50%的的方波 T1是作为工作作模式9:相相频可调PWWM波发生器器,频率初始始化16KHHz,占空比比50%请请注意: TCNT1是TT0的定时器器计数值,就就是每个定时时器时钟加11,和普通定定时器的计数数值寄存器作作用一样 OCR1A作为为比较的TOOP值 OOCR1B作作为匹配输出出值 当TCNT1的的值增加到OOCR1B相相等时,OCC1B(piin18)清清零,就是对对应低电平;; 然后TCNT11继续增加到到OCR1AA(就是TOOP)的值,然然后TCNTT1开始减少少,这个中间间,OC1BB(Pin118)状态不不变;当TCCNT1减少少到OCR11B相等时,OOC1B(ppin18)置置1,就是对对应高电平 然后TCNNT1继续减减少到0x000(就是BBOTTOMM),然后TTCNT1又又开始增加,这这个中间,OOC1B(ppin18)状状态不变 OCR1B的值值与OCR11A的比值就就是PWM的的占空比! 所以这个值值必须比OCCR1A小。
当OOCR1B为为0时,PWWM波就一直直为低电平(相相当于占空比比为0);当当OCR1BB为OCR11A时,PWWM波就一直直为高电平(相相当于占空比比为100);;当OCR11B为OCRR1A的一半时时,PWM波波就是占空比比为50% 你可可以修改OCCR1B的值值,然后重新新下载程序运运行,看看占占空比的改变变;也可以修修改OCR11A的值,然然后重新下载载程序运行,看看看频率的改改变,不过要要注意修改OOCR1A时,同时时注意OCRR1B的值不不要比OCRR1A大 模式式9算是PWWM生成中最最复杂的一种种,只要你理理解了这个,对对别的几种PPWM都好理理解TCNT0 == 0xB00; //sset coount OCR0 = 0x50;; 即使工作在noormal模模式下,这个个OCR0仍仍然在和TCCNT0进行行比较,一旦旦匹配后,就就会产生中断断或者改变OOC0脚上的的电平(产生生PWM)改改变这个值,就就会改变中断断发生的时间间,或者改变变OC0脚上上的方波的频频率了 T1定时器1的的模式9,相相频修正模式式,可以用来来产生波形非非常完整的PPWM波。
TTCNT1设设置初值,增增加到0xFFFFF的时时间,然后从从0开始计数数,这个理解解是正确的可可以画一个波波形图对应理理解一下:画画一个占空比比50%的方方波,高电平平上平分为11、2两段,低低电平上平分分为3、4两两段 1就是TCCNNT1从初值值加,-->>0xFFFFF阶段,这这个阶段OCCR1B为高高电平; 2就是TCCNNT1从0xx00加--->OCR11B阶段,这这个阶段为高高电平;匹配配后,变为低低电平 3就是TCCNNT1从OCCR1B加--->OCRR1A阶段,这这个阶段为低低电平; 4就是TCCNNT1从OCCR1A减-->>OCR1BB阶段,这个个阶段为低电电平;匹配后后,变为高电电平 TCCNT1的的初值,就是是保证第一段段高电平的时时间,这样才才能形成一个个完整周期的的方波而且且,这个初值值应该根据OOCR1B的的值而设,就就是TCCNNT1 = 0xfffff-OCRR1B+1;;这样才能保保证时间的匹匹配 如果是模式9,那那么每次变化化后,算出占占空比,算出出OCR1BB的值并赋值值,会自动在在下一个周期期改变占空比比为新值eeasy重重点是:每次次给OCR11B赋值,会会在 下一个个 周期改变变占空比。
//实例:利用用pwm控制制led光暗暗及峰鳴器音音量大小//ICC-AAVR appplicaation buildder : 2005--4-18 12:466:03 // Targget : M16 // Crysstal: 4.00000Mhz #includde
TOPP 值可以为为固定值0xx00FF、00x01FFF或 0x003FF,或或是存储于寄寄存器 OCCR1A或ICRR1里的数值值,具体有赖赖于工作模式式 分5种工工作类型 1 普通模模式 WGMM1=0 跟跟51的普通通模式差不多多,有TOVV1溢出中断断标志,发生生于MAX((0xFFFFF)时 11 采用内部部计数时钟 用于 IICP捕捉输输入场合----测量脉宽宽/红外解码码 (捕捕捉输入功能能可以工作在在多种模式下下,而不单单单只是普通模模式) 22 采用外部部计数脉冲输输入 用于 计数数,测频 其其他的应用,采采用其他模式式更为方便,不不需要像511般费神 2 CCTC模式 [比较匹配配时清零定时时器模式] WGM1==4,12 跟51的自自动重载模式式差不多 1 用于输输出50%占占空比的方波波信号 2 用于产产生准确的连连续定时信号号 WGM1==4时, 最最大值由OCCR1A设定,TTOP时产生生OCF1AA比较匹配中中断标志 WGM1==12时,最最大值由ICCF1设定, TOP时产产生ICF11输入捕捉中中断标志 -------如果TTOP=MAAX,TOPP时也会产生生TOV1溢溢出中断标志志 注:WGMM=15时,也也能实现从OOC1A输出方波波,而且具备备双缓冲功能能 计算公式:: fOCnn="fcllk"_IOO/(2*NN*(1+TTOP)) 变变量N 代表表预分频因子子(1、8、664、2566、10244),T2多多了(32、1128)两级级。
3 快快速PWM模模式 WGMM1=5,66,7,144,15 单单斜波计数,用用于输出高频频率的PWMM信号(比双双斜波的高一一倍频率) 都都有TOV11溢出中断,发发生于TOPP时[不是MMAX,跟普普通模式,CCTC模式不不一样] 比比较匹配后可可以产生OCCF1x比较较匹配中断.. WGM11=5时, 最大值为00x00FFF, 8位分分辨率 WGM11=6时, 最大值为00x01FFF, 9位分分辨率 WGM11=7时, 最大值为00x03FFF,10位分分辨率 WGM1==14时,最最大值由ICCF1设定, TOP时产产生ICF11输入捕捉中中断 (单缓缓冲) WGM1==15时,最最大值由OCCR1A设定,TTOP时产生生OCF1AA比较匹配中中断(双缓冲冲,但OC11A将没有PPWM能力,最最多只能输出出方波) 改变TOPP值时必须保保证新的TOOP值不小于于所有比较寄寄存器的数值值 注注意,即使OOCR1A/B设为为0x00000,也会输输出一个定时时器时钟周期期的窄脉冲,而而不是一直为为低电平 计计算公式:ffPWM=ffclk_IIO/(N**(1+TOOP)) 4 相相位修正PWWM模式 WWGM1=11,2,3,,10,111 双双斜波计数,用用于输出高精精度的,相位位准确的,对对称的PWMM信号 都都有TOV11溢出中断,但但发生在BOOOTOM时时 比比较匹配后可可以产生OCCF1x比较较匹配中断.. WGM11=1时, 最大值为00x00FFF, 8位分分辨率 WGM11=2时, 最大值为00x01FFF, 9位分分辨率 WGM11=3时, 最大值为00x03FFF,10位分分辨率 WGM1==10时,最最大值由ICCF1设定, TOP时产产生ICF11输入捕捉中中断 (单缓缓冲) WGM1==11时,最最大值由OCCR1A设定,TTOP时产生生OCF1AA比较匹配中中断(双缓冲冲,但OC11A将没有PPWM能力,最最多只能输出出方波) 改改变TOP值值时必须保证证新的TOPP值不小于所所有比较寄存存器的数值 可可以输出0%%~100%%占空比的PPWM信号 若若要在T/CC 运行时改改变TOP 值,最好用用相位与频率率修正模式代代替相位修正正模式。
若TTOP保持不不变,那么这这两种工作模模式实际没有有区别 计计算公式:ffPWM=ffclk_IIO/(2**N*TOPP) 5 相相位与频率修修正PWM模模式 WGMM1=8,99 双双斜波计数,用用于输出高精精度的、相位位与频率都准准确的PWMM波形 都都有TOV11溢出中断,但但发生在BOOOTOM时时 比比较匹配后可可以产生OCCF1x比较较匹配中断.. WGM1==8时,最大大值由ICFF1设定, TOP时产产生ICF11输入捕捉中中断 (单缓缓冲) WGM1==9时,最大大值由OCRR1A设定,TTOP时产生生OCF1AA比较匹配中中断(双缓冲冲,但OC11A将没有PPWM能力,最最多只能输出出方波) 相相频修正修正正PWM 模模式与相位修修正PWM 模式的主要要区别在于OOCR1x 寄存器的更更新时间 改改变TOP值值时必须保证证新的TOPP值不小于所所有比较寄存存器的数值 可可以输出0%%~100%%占空比的PPWM信号 使使用固定TOOP 值时最最好使用ICCR1 寄存存器定义TOOP。
这样OOCR1A 就可以以用于在OCC1A输出PWWM 波 但但是,如果PPWM 基频频不断变化((通过改变TTOP值), OCR1AA的双缓冲特特性使其更适适合于这个应应用 计计算公式:ffPWM=ffclk_IIO/(2**N*TOPP) 。