|
利用AVR的T/C1的OC1A引脚输出50%占空比20kHz方波,并用频率计测量,结果遇到一个百思不得其解的问题:
T/C1设置为比较输出模式,时钟为1M无分频,源程序很简单,如下:
#include<avr/io.h>
#include<avr/interrupt.h>
#define counter 25
SIGNAL(TIMER1_COMPA_vect) // T/C1 ISP
{
OCR1A=OCR1A+counter; //SET TO NEXT MATCH (TOGGLE) POINT
}
int main(void)
{
DDRD|= (1<<PIND5); //SET OC1A BIT (PIND5) FOR OUTPUT
TCCR1A|= (1<<COM1A0); //SET PRESCALER TO Clock(1M,1us colck)
TCCR1B|= (1<<CS10); //enable output compare mode to toggle OC1A pin on match
TIMSK|= (1<<OCIE1A); //UNMASK OUTPUT COMPARE MATCH INTERRUPT FOR OC1A
sei(); //set global interrupt bit
while(1)
;
}
得到的结果却让我瞠目结舌,输出居然只有8Hz!与预期的20kHz可相差太远了!
仿真结果如下:
debug result (原文件名:debug result.jpg)
我试着输出11kHz,10kHz或更低的频率,都正常.但12kHz就出现上面的问题,频率计显示与预期相差很大很大
再试着调整MCU时钟频率,在8M无分频下可以输出80kHz,但再高也会出现上面同样的问题.
是不是可以这样理解,AVR的T/C最高输出频率为大概十分之一MCU时钟频率?
请各位老大们指点,多谢了! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|