电调闭环算法
经高人点拨,让小弟先做好闭环再开环,如果自己转一下电机能进入闭环,说明没问题。我照抄了MK代码加以改动,一开始SENSE_C和模拟比较器上升沿,一旦发现中断标志位置位就开启模拟比较器中断进入闭环程序,可是我转一下还是卡住不动,电流就超了。。求解。AVR MEGA16 代码如下:
SIGNAL(SIG_COMPARATOR)
{
unsigned char sense = 0;
do
{
if(SENSE_H)
sense = 1;
else
sense = 0;
switch(Phase)
{
case 0:
A_H_ON;
if(sense)
{
C_L_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_FALLING_EDGE;
SENSE_B;
Phase++;
sendchar('0');
}
else
{
B_L_ON;
sendchar('a');
}
break;
case 1:
C_L_ON;
if(!sense)
{
B_H_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_RISING_EDGE;
SENSE_A;
Phase++;
sendchar('1');
}
else
{
A_H_ON;
sendchar('b');
}
break;
case 2:
B_H_ON;
if(sense)
{
A_L_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_FALLING_EDGE;
SENSE_C;
Phase++;
sendchar('2');
}
else
{
C_L_ON;
sendchar('c');
}
break;
case 3:
A_L_ON;
if(!sense)
{
C_H_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_RISING_EDGE;
SENSE_B;
Phase++;
sendchar('3');
}
else
{
B_H_ON;
sendchar('d');
}
break;
case 4:
C_H_ON;
if(sense)
{
B_L_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_FALLING_EDGE;
SENSE_A;
Phase++;
sendchar('4');
}
else
{
A_L_ON;
sendchar('e');
}
break;
case 5:
B_L_ON;
if(!sense)
{
A_H_ON;
if(Measure_Current)
Filtted_Current_Get();
SENSE_RISING_EDGE;
SENSE_C;
Phase = 0;
sendchar('5');
}
else
{
C_H_ON;
sendchar('f');
}
break;
}
}while((SENSE_L && sense) || (SENSE_H && !sense));
Measure_Current = 0;
} 饿,中间的sendchar是我用串口自己调试用的。。。
页:
[1]