szbaoqing 发表于 2008-5-27 08:29:35

请教马老师:定时器的问题!

我现在在做系统,主CPU内部的定时器不够用,于是我加了一个ATMEGA8.这样系统增加了一个16位定时器和二个八位定时器,因为我要做两路方波的产生(频率范围在200-1000HZ),我用ATMEGA8的16位定时器的PWM功能做了一路方波,但是另一路方波,我考虑采用八位定时器做比较麻烦,也想不出什么好的办法,请教马老师,这个问题我有什么好的办法呢?
谢谢马老师!!

yangxiao 发表于 2008-5-27 15:05:17

一个定时器可以做两路啊!
这是我用ATtiny13产生三路PWM的程序:
(ATtiny13只有两个八位定时器)

/*ATtiny13用内部时钟4.8M
相位可调PWM模式
产生两路(PB0,PB1)120HZ,45%占空比,180度相位差的PWM
产生一路(PB2)120HZ,10%占空比的PWM*/

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

unsigned int i;
unsigned int j;


//端口初始化
void port_init(void)
{
PORTB = 0x07;
DDRB= 0x07;
}

//TC0初始化
void timer0_init(void)
{
TCCR0A =(1<<COM0A1)|(1<<COM0A0)|(1<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(1<<WGM00);//相位修正PWM模式
TCCR0B=(0<<WGM02)|(0<<CS02)|(1<<CS01)|(1<<CS00);
}

//器件初始化
void init_devices(void)
{
port_init();   //端口初始化
timer0_init(); //TC1初始化

}


//主函数
intmain(void)
{
init_devices();    //器件初始化
OCR0A=140;
OCR0B=115;
TCNT0=0;
while(1)
{
if(++i>700)
   {
   PORTB&=0XFB;
// i=0;
   if(++j>2450)
           {
          PORTB|=0X04;
               i=0;
                   j=0;
           }
   }
}
}
/*
输出的具体PWM的参数为:
I/O1:160hz,45%占空比,与160hz,45%占空比的相位差是180度,带5%死区
I/O2:160hz,45%占空比
I/O3:124hz,11.7%占空比
*/
页: [1]
查看完整版本: 请教马老师:定时器的问题!