發現M16的TC1的重大缺陷!!!!!
本人用M16的TC1產生PWM信號,并且在產生信號的同時不斷改變頻率,但變頻幅度很小,這時就出現一個很令人費解的現象,PWM信號會不時有斷開的現象
PWM頻率:28KHz
OC1A、OC1B雙路輸出:想得到的信號是:如圖正常的波形
但是一旦改變頻率,兩路的信號會隨即的中斷6.5ms左右,如圖斷開的波形,不知其解,各位高手請指教
程序:
// Target : M16
// Crystal: 10.000Mhz
#include
#include
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0b00110000;
}
//TIMER1 initialize - prescale:1
// WGM: 8) PWM phz freq correct, TOP=ICRn
// desired value: 28KHz
// actual value: 28.090KHz (0.3%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0x4E;
OCR1AH = 0x00;
OCR1AL = 0xB2-0x50;
OCR1BH = 0x00;
OCR1BL = 0x50;
ICR1H = 0x00;
ICR1L = 0xB2;
TCCR1A = 0xB0;
TCCR1B = 0x11; //start Timer
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void Delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i9)i=0;
Delay(100); //延時
ICR1L=ICR1L_+i; //改變頻率
}
}
正常的波形.jpg (62.61 KB, 下載次數: 105)
下載附件
2012-7-25 22:56 上傳
斷開的波形.jpg (47.83 KB, 下載次數: 101)
下載附件
2012-7-25 22:56 上傳
|