AVR定时计数器0,1,2的相位可调PWM模式彻底应用_第1页
AVR定时计数器0,1,2的相位可调PWM模式彻底应用_第2页
AVR定时计数器0,1,2的相位可调PWM模式彻底应用_第3页
AVR定时计数器0,1,2的相位可调PWM模式彻底应用_第4页
AVR定时计数器0,1,2的相位可调PWM模式彻底应用_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AVR定时计数器 0,1,2的相位可调 PWM模式彻底应用/*AVR定时计数器 0,1,2的相位可调 PWM模式彻底应用* FileName : adjustablePWM.c Author : 沧海麒麟 Date : 2011.05.28 Version : 1.0 Clock Frequency :8 MHZ Description : 适用于 ATmega16(L)AVR的 3个定时计数器相位频率 PWM模式 查询与中断的基本应用 */ #include /常用头文件,如有需要可以查库文件 include #include #include #include #include /#include “delay.c“ /#include “LCM1602.c“ #define uint unsigned int #define uchar unsigned char /*T/C0*/ void Timer0PCPWM_Init(uchar temp); void Timer0PCPWM_NquiryMode(uchar temp);/T/C0查询方式函数 void Timer0PCPWM_InterruptMode(uchar temp);/T/C0中断方式函数 /*T/C2*/ void Timer2PCPWM_Init(uchar temp); void Timer2PCPWM_NquiryMode(uchar temp);/T/C2查询方式函数 void Timer2PCPWM_InterruptMode(uchar temp);/T/C2中断方式函数 /*T/C1*/ void Timer1PCPWM_10_Init(uint top,uint temp);/T/C1波形产生模式:CTC4 void Timer1PCPWM_11_Init(uint top,uint temp);/T/C1波形产生模式:CTC12 void Timer1PCPWM_A_NquiryMode(uint temp);/T/C1比较匹配 A查询方式函数 void Timer1PCPWM_B_NquiryMode(uint temp);/T/C1比较匹配 B查询方式函数 void Timer1PCPWM_InterruptMode(uint temp);/T/C1中断方式函数 void main(void) /占空比为 1/5 Timer0PCPWM_Init(51);/245Hz Timer2PCPWM_Init(51); Timer1PCPWM_10_Init(1249,250);/50HZ /Timer1PWM_14_Init(1249,250); while (1); /*定时计数器的函数*/ /*与 8位 T/C0相关的寄存器 1:T/C0计数寄存器 TCNT0,输出比较寄存器 OCR0,定时计数器中断屏蔽寄存器TIMSK 定时计数器中断标志寄存器 TIFR,T/C0控制寄存器 TCCR0 2:每计数一次需要的时间是(1/Xtal)*N us 在此程序中 Xtal=8,N定义为与分频系数 N:1,8,64,256,1024 1 : TCCR0|=0x01;/0:无时钟,系统不工作 8 : TCCR0|=0x02; 64 : TCCR0|=0x03; 256 : TCCR0|=0x04; 1024: TCCR0|=0x05; /0x06:时钟由 T0引脚输入,下降沿触发 0x07:时钟由 T0引脚输入,上升沿触发 */ /*/ void Timer0PCPWM_Init(uchar temp) /Foc0pwm = Fclk/(510N) DDRB |= 0X08; TCNT0 = 0x00; TCCR0 = 0x40|0x20|0x03; /PWM设置|OC0 触发方式的设置|预分频设置 OCR0 = temp; /在此程序中 Xtal=8,N定义为与分频系数 N:1,8,64,256,1024 /1 : TCCR0|=0x01;/0:无时钟,系统不工作 /8 : TCCR0|=0x02; /64 : TCCR0|=0x03; /256 : TCCR0|=0x04; /1024: TCCR0|=0x05; /*/ void Timer0PCPWM_NquiryMode(uchar temp)/T/C0查询方式函数 while(!(TIFR TIFR=0x02; OCR0 = temp;/Focnpwm = Fclk/N(1+TOP) /*/ void Timer0PCPWM_InterruptMode(uchar temp)/T/C0中断方式函数 CLI(); /disable all interrupts TCCR0 = 0x00; /stop TCNT0 = 0x00; TCCR0 = 0x40|0x20|0x03; /PWM设置|OC0 触发方式的设置|预分频设置 OCR0 = temp; MCUCR = 0x00; GICR = 0x00; TIMSK = 0x02; /timer interrupt sources SEI(); /re-enable interrupts /SREG|=BIT(7);/开启总中断 /*/ #pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP /20 void timer0_comp_isr(void) /compare occured TCNT0=OCR0 /*/ /*与 8位 T/C2相关的寄存器 1:T/C2计数寄存器 TCNT0,输出比较寄存器 OCR2,定时计数器中断屏蔽寄存器TIMSK 定时计数器中断标志寄存器 TIFR,T/C2控制寄存器 TCCR2 2:每计数一次需要的时间是(1/Xtal)*N us 在此程序中 Xtal=8,N定义为与分频系数 N:1,8,64,256,1024 1 : TCCR2|=0x01;/0:无时钟,系统不工作 8 : TCCR2|=0x02; 32 : TCCR2|=0x03; 64 : TCCR2|=0x04; 128 : TCCR2|=0x05; 256 : TCCR2|=0x06; 1024: TCCR2|=0x07; */ /*/ void Timer2PCPWM_Init(uchar temp) /Foc0pwm = Fclk/(510N) DDRD |= 0X80; TCNT2 = 0x00; TCCR2 = 0x40|0x20|0x04; /PWM设置|OC2 触发方式的设置|预分频设置 OCR2 = temp; /Focnpwm = Fclk/N(1+TOP) /*/ void Timer2PCPWM_NquiryMode(uchar temp)/T/C2查询方式函数 while(!(TIFR TIFR=0x80; OCR2 = temp; /*/ void Timer2PCPWM_InterruptMode(uchar temp)/T/C2中断方式函数 CLI(); /disable all interrupts TCCR2 = 0x00; /stop TCNT2 = 0x00; /set count/temp=6,N=64:2000us;计数 250次 TCCR2 = 0x40|0x20|0x04; /PWM设置|OC2 触发方式的设置|预分频设置 OCR2 = temp; MCUCR = 0x00; GICR = 0x00; TIMSK = 0x80; /timer interrupt sources SEI(); /re-enable interrupts /SREG|=BIT(7);/开启总中断 #pragma interrupt_handler timer2_comp_isr:iv_TIM2_COMP /4 void timer2_comp_isr(void) /compare occured TCNT2=OCR2 /*/ /*与 16位 T/C1相关的寄存器 1:T/C1计数寄存器 TCNT1H和 TCNT1L,输出比较寄存器 OCR1A(H/L)和OCR1B(H/L), 定时计数器中断屏蔽寄存器 TIMSK,定时计数器中断标志寄存器 TIFR, T/C1控制寄存器 TCCR1A和 TCCR1B 2:每计数一次需要的时间是(1/Xtal)*N us 在此程序中 Xtal=8,N定义为与分频系数 N:1,8,64,256,1024 /1 : TCCR1B=0x01;/0:无时钟,系统不工作 /8 : TCCR1B=0x02; /64 : TCCR1B=0x03; /256 : TCCR1B=0x04; /1024: TCCR1B=0x05; /0x06:时钟由 T1引脚输入,下降沿驱动 0x07:时钟由 T1引脚输入,上升沿驱动 */ /*/ void Timer1PCPWM_10_Init(uint top,uint temp) DDRD |= 0x30; TCNT1H = 0x00; TCNT1L = 0x00; TCCR1A = 0x80|0x20|(1 WGM11)|(0 WGM10); /OC1A/PWM设置|预分频设置 ICR1 = top; /Focnpwm = Fclk/(2N*TOP) OCR1A = temp; OCR1B = temp; /*/ void Timer1PCPWM_11_Init(uint top,uint temp) DDRD |= 0x30; TCNT1H = 0x00; TCNT1L = 0x00; TCCR1A = 0x80|0x20|(1 WGM11)|(1 WGM10); /OC1A/PWM 设置|预分频设置 OCR1A = top; /Focnpwm = Fclk/(2N*TOP) OCR1B = temp; /说明还有 8 9 10位相位修正 PWM可用 /*/ void Timer1PCPWM_A_NquiryMode(uint temp)/T/C1比较匹配 A查询方式函数 while(!(TIFR TIFR = 0x10; OCR1A = temp; /Focnpwm = Fclk/(2N*TOP) /*/ void Timer1P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论