《2022年AVR产生PWM波实例程序) .pdf》由会员分享,可在线阅读,更多相关《2022年AVR产生PWM波实例程序) .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、AVR 的 PWM 波(1)一个实例:这个程序是用ICC 的向导生成的,很简单。T0 是作为普通8 位定时器,频率 100KHz , 每次中断将PB0 (pin1) 状态反转,产生的是200KHz占空比 50的方波。T1 是作为工作模式9:相频可调PWM 波发生器,频率初始化16KHz ,占空比50。请注意:TCNT1 是 T0 的定时器计数值,就是每个定时器时钟加1,和普通定时器的计数值寄存器作用一样。OCR1A 作为比较的TOP 值。OCR1B 作为匹配输出值。当 TCNT1 的值增加到OCR1B 相等时, OC1B(pin18) 清零,就是对应低电平;然后 TCNT1 继续增加到OCR1
2、A (就是TOP)的值,然后TCNT1 开始减少,这个中间,OC1B(Pin18)状态不变;当TCNT1 减少到 OCR1B 相等时, OC1B(pin18)置 1,就是对应高电平。然后 TCNT1 继续减少到0 x00(就是 BOTTOM ) ,然后 TCNT1 又开始增加,这个中间, OC1B(pin18)状态不变。OCR1B 的值与OCR1A 的比值就是PWM 的占空比!所以这个值必须比OCR1A 小。当OCR1B 为 0 时, PWM 波就一直为低电平(相当于占空比为0) ;当 OCR1B 为 OCR1A 时,PWM 波就一直为高电平(相当于占空比为100) ;当 OCR1B 为 OC
3、R1A 的一半时, PWM 波就是占空比为50。你可以修改OCR1B 的值,然后重新下载程序运行,看看占空比的改变;也可以修改OCR1A 的值,然后重新下载程序运行,看看频率的改变,不过要注意修改OCR1A 时,同时注意 OCR1B 的值不要比OCR1A 大。模式 9 算是 PWM 生成中最复杂的一种,只要你理解了这个,对别的几种PWM 都好理解。TCNT0 = 0 xB0; /set count OCR0 = 0 x50; 即使工作在normal 模式下, 这个 OCR0 仍然在和TCNT0 进行比较, 一旦匹配后, 就会产生中断或者改变OC0 脚上的电平(产生PWM ) 。改变这个值,就会
4、改变中断发生的时间,或者改变 OC0 脚上的方波的频率了。T1 定时器 1 的模式 9,相频修正模式,可以用来产生波形非常完整的PWM 波。 TCNT1 设置初值,增加到0 xFFFF 的时间,然后从0 开始计数,这个理解是正确的。可以画一个波形图对应理解一下:画一个占空比50的方波,高电平上平分为1、2 两段,低电平上平分为3、4 两段。1 就是 TCCNT1 从初值加, -0 xFFFF 阶段,这个阶段OCR1B 为高电平;2 就是 TCCNT1 从 0 x00 加-OCR1B 阶段,这个阶段为高电平;匹配后,变为低电平3 就是 TCCNT1 从 OCR1B 加-OCR1A 阶段,这个阶段
5、为低电平;4 就是 TCCNT1 从 OCR1A 减-OCR1B 阶段,这个阶段为低电平;匹配后,变为高电平TCCNT1 的初值,就是保证第一段高电平的时间,这样才能形成一个完整周期的方波。而且,这个初值应该根据OCR1B 的值而设,就是 TCCNT1 = 0 xffff-OCR1B+1;这样才能保证时间的匹配。如果是模式9,那么每次变化后,算出占空比,算出OCR1B 的值并赋值,会自动在下一个周期改变占空比为新值。easy。 。 。重点是:每次给OCR1B 赋值,会在下一个周期改变占空比。/实例:利用pwm 控制 led 光暗及峰鳴器音量大小名师资料总结 - - -精品资料欢迎下载 - -
6、- - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - /ICC-A VR application builder : 2005-4-18 12:46:03 / Target : M16 / Crystal: 4.0000Mhz #include #include #define uchar unsigned char #define uint unsigned int void port_init(void); void timer0_init(void); void init_de
7、vices(void); void delay_short(uint t); uchar scan_key(void); void port_init(void) PORTA = 0 x00; DDRA = 0 x00; PORTB = BIT(PB3); DDRB = BIT(PB3); PORTC = 0 x00; /m103 output only DDRC = 0 x00; PORTD = 0 x00; DDRD = 0 x00; / WGM: PWM Phase correct / desired value: 1KHz / actual value: 0.980KHz (-2.0%
8、) void timer0_init(void) TCCR0 = 0 x00; /stop TCNT0 = 0 x01; /set count OCR0 = 0 xFF; /set compare TCCR0 = 0 x62; /start timer ; 相位修正 , 8 分頻 /call this routine to initialize all peripherals void init_devices(void) /stop errant interrupts until set up CLI(); /disable all interrupts port_init(); timer
9、0_init(); MCUCR = 0 x00; GICR = 0 x00; TIMSK = 0 x00; /timer interrupt sources SEI(); /re-enable interrupts 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - /all peripherals are now initialized void delay_short(uint t) / 短延時 uint i; for (i=0
10、;i 0) if (key=1) / 減少佔空比 OCR0_V -= 10; OCR0 = OCR0_V; ; if (key=2) / 增加佔空比 OCR0_V += 10; OCR0 = OCR0_V; ; if (key=3) / 全黑 ,佔空比為100% OCR0_V = 0 xff; OCR0 = OCR0_V; ; ; 實驗板接線 : PB3 - JA.1 及 JM PD0 - K1 PD1 - K2 PD2 - K3 (2)相关详细理论说明:符号定义 : BOTTOM 计数器计到0 x0000 时即达到 BOTTOM MAX 计数器计到0 xFFFF ( 十进制的65535) 时
11、即达到MAX TOP 计数器计到计数序列的最大值时即达到TOP。TOP 值可以为固定值0 x00FF、 0 x01FF 或 0 x03FF,或是存储于寄存器OCR1A或 ICR1 里的数值,具体有赖于工作模式分 5种工作类型1 普通模式WGM1=0 跟 51 的普通模式差不多,有TOV1 溢出中断标志,发生于MAX(0 xFFFF) 时1 采用内部计数时钟用于ICP 捕捉输入场合 -测量脉宽 /红外解码(捕捉输入功能可以工作在多种模式下,而不单单只是普通模式) 2 采用外部计数脉冲输入用于计数,测频名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
12、 - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 其他的应用,采用其他模式更为方便,不需要像51 般费神2 CTC 模式比较匹配时清零定时器模式 WGM1=4,12 跟 51 的自动重载模式差不多1 用于输出50%占空比的方波信号2 用于产生准确的连续定时信号WGM1=4 时,最大值由OCR1A 设定, TOP 时产生 OCF1A 比较匹配中断标志WGM1=12 时,最大值由ICF1 设定,TOP 时产生 ICF1 输入捕捉中断标志- 如果 TOP=MAX ,TOP 时也会产生TOV1 溢出中断标志注:WGM=15 时,也能
13、实现从OC1A 输出方波,而且具备双缓冲功能计算公式:fOCn=fclk_IO/(2*N*(1+TOP) 变量 N 代表预分频因子(1、8、64、256、1024),T2 多了 (32、128)两级。3 快速 PWM 模式WGM1=5,6,7,14,15 单斜波计数,用于输出高频率的PWM 信号 (比双斜波的高一倍频率) 都有 TOV1 溢出中断,发生于TOP 时 不是 MAX, 跟普通模式, CTC 模式不一样 比较匹配后可以产生OCF1x 比较匹配中断. WGM1=5 时, 最大值为0 x00FF, 8 位分辨率WGM1=6 时, 最大值为0 x01FF, 9 位分辨率WGM1=7 时,
14、最大值为0 x03FF,10 位分辨率WGM1=14 时,最大值由ICF1 设定,TOP 时产生 ICF1 输入捕捉中断(单缓冲 ) WGM1=15 时,最大值由OCR1A 设定, TOP 时产生OCF1A 比较匹配中断(双缓冲 ,但 OC1A 将没有 PWM 能力,最多只能输出方波) 改变 TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值注意, 即使 OCR1A/B 设为 0 x0000,也会输出一个定时器时钟周期的窄脉冲,而不是一直为低电平计算公式: fPWM=fclk_IO/(N*(1+TOP) 4 相位修正PWM 模式WGM1=1,2,3,10,11 双斜波计数,用于输出高
15、精度的,相位准确的,对称的PWM 信号都有 TOV1 溢出中断,但发生在BOOTOM 时比较匹配后可以产生OCF1x 比较匹配中断. WGM1=1 时, 最大值为0 x00FF, 8 位分辨率WGM1=2 时, 最大值为0 x01FF, 9 位分辨率WGM1=3 时, 最大值为0 x03FF,10 位分辨率WGM1=10 时,最大值由ICF1 设定,TOP 时产生 ICF1 输入捕捉中断(单缓冲 ) WGM1=11 时,最大值由OCR1A 设定, TOP 时产生OCF1A 比较匹配中断 (双缓冲 ,但 OC1A 将没有 PWM 能力,最多只能输出方波) 改变 TOP 值时必须保证新的TOP 值
16、不小于所有比较寄存器的数值可以输出0%100%占空比的PWM 信号若要在 T/C 运行时改变TOP 值,最好用相位与频率修正模式代替相位修正模式。若TOP 保持不变,那么这两种工作模式实际没有区别计算公式: fPWM=fclk_IO/(2*N*TOP) 5 相位与频率修正PWM 模式WGM1=8 ,9 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 双斜波计数,用于输出高精度的、相位与频率都准确的PWM 波形都有 TOV1 溢出
17、中断,但发生在BOOTOM 时比较匹配后可以产生OCF1x 比较匹配中断. WGM1=8 时,最大值由ICF1 设定,TOP 时产生 ICF1 输入捕捉中断(单缓冲 ) WGM1=9 时 ,最大值由OCR1A 设定, TOP 时产生 OCF1A 比较匹配中断 (双缓冲 ,但OC1A 将没有 PWM 能力,最多只能输出方波) 相频修正修正PWM 模式与相位修正PWM 模式的主要区别在于OCR1x 寄存器的更新时间改变 TOP 值时必须保证新的TOP 值不小于所有比较寄存器的数值可以输出0%100%占空比的PWM 信号使用固定TOP 值时最好使用ICR1 寄存器定义TOP。这样OCR1A 就可以用于在OC1A 输出 PWM 波。但是,如果PWM 基频不断变化(通过改变TOP 值), OCR1A 的双缓冲特性使其更适合于这个应用。计算公式: fPWM=fclk_IO/(2*N*TOP) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -