各位好,我是AVR初学者,由于要用到atmega64l单片机的PWM波形产生功能,做了一个测试程序,用定时器T1在IO口PB5和PB6产生两组PWM波形,写了一个简单程序如下:
#include<iom64v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{for(j=0;j<1141;j++);
}
}
void main()
{
uint x,y;
WDTCR|=(1<<WDCE)|(1<<WDE);//置位WDTOE和WDE(在设置看门狗定时器的预置
//分频器参数时需要将其写1))
WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1);//设定周期为1S
DDRB = 0Xff; //PB口设置为输出口
while(1)
{
WDR();
TCCR1A=0XA9; //设置T1三个口都是8位快速PWM模式,OCR比较后输出低电平
TCCR1B=0X09;//时钟采用不分频的设置
OCR1AL=10;
OCR1BL=10;
delay(500);
TCCR1A=0XA9; //设置T1三个口都是8位快速PWM模式,OCR比较后输出低电平
TCCR1B=0X09;//时钟采用不分频的设置
OCR1AL=50;
OCR1BL=50;
delay(500);
TCCR1A=0XA9; //设置T1三个口都是8位快速PWM模式,OCR比较后输出低电平
TCCR1B=0X09;//时钟采用不分频的设置
OCR1AL=100;
OCR1BL=100;
delay(500);
}
}
程序的本意是要产生3组不同占空比的波形的循环,结果写入单片机后观察波形不对,只有两组很窄的PWM波形在循环,而且好像输出波形个数也不一致,完全不是想象中的3组PWM波循环,程序中如果去掉前两组设置,即如下:
#include<iom64v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{for(j=0;j<1141;j++);
}
}
void main()
{
uint x,y;
WDTCR|=(1<<WDCE)|(1<<WDE);//置位WDTOE和WDE(在设置看门狗定时器的预置
//分频器参数时需要将其写1))
WDTCR=(1<<WDE)|(1<<WDP2)|(1<<WDP1);//设定周期为1S
DDRB = 0Xff; //PB口设置为输出口
while(1)
{
WDR();
//TCCR1A=0XA9; //设置三个口都是8位快速PWM模式,OCR比较后输出低电平
//TCCR1B=0X09;//时钟采用不分频的设置
//OCR1AL=10;
//OCR1BL=10;
//delay(500);
//TCCR1A=0XA9; //设置三个口都是8位快速PWM模式,OCR比较后输出低电平
//TCCR1B=0X09;//时钟采用不分频的设置
//OCR1AL=50;
//OCR1BL=50;
//delay(500);
TCCR1A=0XA9; //设置三个口都是8位快速PWM模式,OCR比较后输出低电平
TCCR1B=0X09;//时钟采用不分频的设置
OCR1AL=100;
OCR1BL=100;
delay(500);
}
}
这样的话输出的波形是正确的,是固定占空比的波形循环,而且占空比正确,高电平时间占据不到周期的3分之一,我一时也搞不清楚为什么会出现这样的情况,改了很多情况进行了试验,有错有对,摸不清定时器使用是否正确了,请高手帮忙看定时器使用是否正确,如果定时器使用正确是否是程序写入的问题,我用最简单的并口直连的ISP下载方式,用ponyprog2000下载,下载过程是正确的,不会报错。请各位大侠指导,万分感谢! |