运转的程序总算是写出来了.几个月的时间过去了.
问题肯定是有的.通常也不容易找到原因.
这次他的问题表现在:不能运转.我的意思就是完全不能动.
仿真了一下.发现程序一直在 模拟比较器A 那里跑来跑去.
void PhaseA_ACD_INIT()
{
cli();
SFIOR |= (1<
ACSR = 0B00001010; //打开ACD中断 比较器下降沿产生中断
ADCSRA &= ~(1<
ADMUX = 0B00000001; //MUX2:0 = 001 ADC1作输入
DDRA &= ~(1<
//DDRB &= ~(1<
NONCE_PHASE = 1;
sei();
}
//
本来原文中, ADMUX = 0B00000001; 是定义为 MUX2:0=000 后来改成了001,为什么呢?
如果是000的话,那么在定义 PhaseA 的模拟比较器的时候,只打开了 PhaseA 的模拟比较器端口,但是,当A比较完毕的时候,我们应当进入B比较才是..所以后面改成了 001 .意思就是从 PhaseB 端比较.
但是问题又来了..
ISR(ANA_COMP_vect)
{
cli();
if(NONCE_PHASE > 3)
{NONCE_PHASE = 1;}
switch(NONCE_PHASE)
{
case 1: // 1 = PHASE_A 打开定时器计延迟时间
{
TCCR2 = 0B00000110; //普通定时方式,256分频,总定时4毫秒
PhaseB_ACD_INIT();
}break;
case 2: // 2 = PHASE_B 关闭定时器,读出定时器数值
{
MITTLE_DELAY = TCNT2; //读出计时
PhaseC_ACD_INIT();
}break;
case 3: // 3 = PHASE_C 重定义 TIMER2 作PWM输出
{
TIMER2_PWM_INIT();
PhaseA_ACD_INIT();
}break;
NONCE_PHASE = NONCE_PHASE+1;
}
sei();
}
//
如上文,我在模拟比较器的 ISR 里面做了设置,计划是:每次进入中断,都将其换到下一相位.所以按照这个想法,模拟比较器的设定应该是正确的.但是为什么在 MUX2:0=000 的时候他完全没反应,而在 MUX2:0=001 的时候他又出现了一些轻微的跳动呢? 这么说来,就是 MUX2:0=001 的时候,他启动了 PWM 那一部分.但是没有完整地走下去.可能是只有一个相位出现了 PWM.
其次还有问题就是,电机的反向电动势很大..几伏是很正常的..显然,我接在ADC0:2上的三个小LED烧了.那个单片机能承受吗?虽然说是模拟比较器,但是有些时候还是没有定义的..某群有人说安全承受为VCC...而且,在管脚和LED连接上一定要加电阻..还说起码 1K ,因为LED只要10mA..说不单只是影响LED,还会影响单片机..这话必须得信啊..
这次留下的貌似全部都是疑问啊..看来只能有待解决来结尾了..