|
用avrstudio编的程序,打算烧在atmega88上的。
我用电平变化中断来确定反电势过零点,然后就不知道延迟30°电角度要怎么编写了。菜鸟一个,大家勿笑。
下面是自己写的一段程序,但是其中没有延迟电角度的程序。就是电平变化产生中断了,然后根据反电势过零检测电路中3个比较器反馈给单片机的不同的输入信号来开关6个MOSFET
ISR(PCINT1_vect)
{
if ((PINC|0X00)==0X06)//phase_01, V2 and V3 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD=(0<<UH)|(1<<VH)|(0<<WH);
PORTB=(1<<UL)|(1<<VL)|(0<<WL);
TCCR0A = (UH_OFF)|(VH_ON)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_OFF)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
if ((PINC|0X00)==0X04) //phase_02, V3 and V4 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD = (0<<UH)|(1<<VH)|(0<<WH);
PORTB = (0<<UL)|(1<<VL)|(1<<WL);
TCCR0A = (UH_OFF)|(VH_ON)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_OFF)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
if ((PINC|0X00)==0X0C) //phase_03, V4 and V5 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD = (0<<UH)|(0<<VH)|(1<<WH);
PORTB = (0<<UL)|(1<<VL)|(1<<WL);
TCCR0A = (UH_OFF)|(VH_OFF)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_ON)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
if ((PINC|0X00)==0X08) //phase_04, V5 and V6 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD = (0<<UH)|(0<<VH)|(1<<WH);
PORTB = (1<<UL)|(0<<VL)|(1<<WL);
TCCR0A = (UH_OFF)|(VH_OFF)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_ON)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
if ((PINC|0X00)==0X0A) //phase_05, V6 and V1 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD = (1<<UH)|(0<<VH)|(0<<WH);
PORTB = (1<<UL)|(0<<VL)|(1<<WL);
TCCR0A = (UH_ON)|(VH_OFF)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_OFF)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
if ((PINC|0X00)==0X02) //phase_06, V1 and V2 on
{
DDRD=(1<<UH)|(1<<VH)|(1<<WH);
DDRB=(1<<UL)|(1<<VL)|(1<<WL);
PORTD = (1<<UH)|(0<<VH)|(0<<WH);
PORTB = (1<<UL)|(1<<VL)|(0<<WL);
TCCR0A = (UH_ON)|(VH_OFF)|(1<<WGM00);
TCCR0B = (1<<CS00);
TCCR2A = (WH_OFF)|(1<<WGM20);
TCCR2B = (1<<CS20);
}
} |
|