AVR使用范例--定时器实现PWM功能本页关键词:什么是pwmpwm原理pwm控制pwm芯片pwm单片机单片机pwm控制应用pwm电路pwm输出pwm调制脉宽调制PWM是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。通俗的说PWM就是波形,波形的波峰以波谷的比例关系成为占空比,我们可以通过PWM控制电机,音量控制,模拟控制等。AVR单片机的定时器可以轻松实现PWM功能。mega16和mega32的timer0是和timer2都具有PWM功能,timer0和timer2都为8位定时器。timer2为异步操作定时器,在操作过程中要等待寄存器状态更改完成。详情参看数据手册:8位有pwm操作的异步操作定时器timer2。下图设定使用timer0来实现PWM功能。PWM电机控制:。OC0outputmode设定了pwm输出控制选择:正常的端口操作,不与OC0相连接,比较匹配发生时OC0取反,比较匹配发生时OC0清零,比较匹配发生时OC0置位。Waveformmode设定了波形产生模式:比较匹配输出模式,快速PWM模式,相位修正PWM模式。更详细的内容请参看数据手册。看看程序代码://ICC-AVRapplicationbuilder:2006-11-250:15:12//Target:M16//Crystal:7.3728Mhz#include#includevoidport_init(void){PORTA=0x00;DDRA=0x00;DDRB=0x08;//PB3为PWM输出,非常重要,否则无法输出波形DDRB=0x00;PORTC=0x00;//m103outputonlyDDRC=0x00;PORTD=0x00;DDRD=0x00;}//TIMER0initialize-prescale:64//WGM:Normal//desiredvalue:1KHz//actualvalue:1.002KHz(0.2%)voidtimer0_init(void){TCCR0=0x00;//stopTCNT0=0x8D;//setcount/*TCNT0*/OCR0=0x73;//setcompare/*OCR0*/TCCR0=0x23;//starttimer/*TCCR0*/}#pragmainterrupt_handlertimer0_comp_isr:20voidtimer0_comp_isr(void){//compareoccuredTCNT0=OCR0}#pragmainterrupt_handlertimer0_ovf_isr:10voidtimer0_ovf_isr(void){TCNT0=0x8D;//reloadcountervalue}//callthisroutinetoinitializeallperipheralsvoidinit_devices(void){//stoperrantinterruptsuntilsetupCLI();//disableallinterruptsport_init();timer0_init();MCUCR=0x00;GICR=0x00;TIMSK=0x03;//timerinterruptsources/*TIMSK*/SEI();//re-enableinterrupts//allperipheralsarenowinitialized}voidmain(void)/*加上这些,程序就可以运行了。*/{init_devices();while(1);}程序运行效果:波形从PB3输出:看看几个关键的寄存器的意义:1.TCNT0:定时器计数值,定时过程中不断增大,溢出后重新置数,开始下一轮。2.OCR0:定时器比较的值,当TCNT0=OCR0时,会产生timer0_comp_isr中断。3.TCCR0:控制timer0的寄存器,这里0x23代表的是:波形产生模式为普通模式,比较匹配发生时OC0清零,clkI/O/64(来自预分频器),详细内容请查看数据手册。4.TIMSK:定时器中断选项,这里允许timer0比较中断,溢出中断。5.预分频器:预分频器是独立运行的。也就是说,其操作独立于T/C的时钟选择逻辑,且它由T/C1与T/C0共享。由于预分频器不受T/C时钟选择的影响,预分频器的状态需要包含预分频时钟被用到何处这样的信息。一个典型的例子发生在定时器使能并由预分频器驱动(6CSn2:01)的时候:从计时器使能到第一次开始计数可能花费1到N+1个系统时钟周期,其中N等于预分频因子(8、64、256或1024)。PWM的工作流程:1.初始化,定时器开始工作,TCNT0逐渐增大,在预分频这么多个时钟周期里变化一次。2.输出比较寄存器包含一个8位的数据,不间断地与计数器数值TCNT0进行比较。匹配事件可以用来产生输出比较中断,或者用来在OC0引脚上产生波形。3.TCNT0溢出,溢出中断用于在OC0上产生波形,置位或者清零。4.TCNT0复位,进行下一次定时操作。PWM的占空比:调节PWM的占空比,只需要用程序更改OCR0的值即可,根据不同的情况,可能是增加也可能是减小。注意:因为Timer2是异步控制器,使用Timer2时,调节OCR2需要等待寄存器更新完成才能进行其他操作。