看feng_matrix无刷电调的程序,有几点不明白的地方,请大家指教~~~
首先从main函数开始说://///////////////////////////////
下面这段应该是程序判断如果与本电调地址一致则闪一下绿灯,但是最后怎么又延时500ms这么长时间?
for(test=0;test<5;test++)
{
if(test == MOTORADRESSE) PORTD |= GRUEN;//0x80 //绿色
Delay_ms(150);
PORTD &= ~GRUEN;//绿色灭
Delay_ms(250);
}
Delay_ms(500);
//////////////////////////////////
下面这段应该是设置一些时间变量,用来在while(1)进行轮询操作的
Blink = SetDelay(101); //眨眼
Blink2 = SetDelay(102);
MinUpmPulse = SetDelay(103); //最小脉冲转速
MittelstromTimer= SetDelay(254); //中央电力定时器
DrehzahlMessTimer = SetDelay(1005); //转速测量定时器
TestschubTimer = SetDelay(1006); //推力测试定时器
/////////////////////////////////
这个TEST_SCHUB初始化为0,所以这个程序电调是等待从I2C收到PWM数据后才开始启动,如果自己的调试的话可以自己设置PWM。
if(!TEST_SCHUB) PWM = SollwertErmittlung();
/////////////////////////////////
不清楚下面操作时要做什么? 但是我知道Mittelstrom变量 是要通过I2C发送出去的
if(CheckDelay(MittelstromTimer))
{
MittelstromTimer = SetDelay(50); // alle 50ms
if(Mittelstrom <Strom) Mittelstrom++;// Mittelwert des Stroms bilden平均电流的形式
else if(Mittelstrom >Strom) Mittelstrom--;
if(Mittelstrom > LIMIT_STROM)// Strom am Limit?
{
MaxPWM--;// dann die Maximale PWM herunterfahren
PORTC |= ROT;
}
else
{
if(MaxPWM < MAX_PWM) MaxPWM++;
}
}
//////////////////////////////////
下面这段也不清楚,寻找CntKommutierungen变量在比较中断中有提到。SIO_Drehzahl与 "if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)"有关系。
if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen转速测量定时器
{
DrehzahlMessTimer = SetDelay(10);
SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2);
//串口速度
CntKommutierungen = 0;
//if(PPM_Timeout == 0) // keine PPM-Signale
//ZeitZumAdWandeln = 1;
}
//////////////////////////////////
if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
{
MotorGestoppt = 1;
DISABLE_SENSE_INT;
MinUpmPulse = SetDelay(100);
if(MotorAnwerfen) //如果设置开环启动变量为1
{
PORTC &= ~ROT;
MotorAnwerfen = 0;
Anwerfen(10); //则开始开环启动PWM设置为10
PORTD |= GRUEN;
MotorGestoppt = 0; //电机停转变量为0
Phase--; //相位数减1,我感觉是让开环控制与闭环控制的相位一致
PWM = 1;
SetPWM();
SENSE_TOGGLE_INT; //只要有沿变化就出发比较中断
ENABLE_SENSE_INT;
MinUpmPulse = SetDelay(100);
while(!CheckDelay(MinUpmPulse)); //不清楚为什么要进行延时?
PWM = 10; //又设置PWM?
SetPWM();
MinUpmPulse = SetDelay(200);
while(!CheckDelay(MinUpmPulse)); //又延时?
MinUpmPulse = SetDelay(1000);
altPhase = 7; //为什么让altPhase等于7?是为了if(Phase != altPhase) 这个条件成立吗?
}
}
//////////////////////////////////
SIGNAL(SIG_COMPARATOR)
//############################################################################
/*补充注释:
比较器中断,实现闭环中断过零检测并换向
注意其中并不包含电角度延迟,即:换向提前角是30度
*/
{
unsigned char sense = 0;
do
{//sense 是为了同步 沿
if(SENSE_H) sense = 1; else sense = 0;//((ACSR & 0x20))检测ACO的值就可以得出比较结果。AIN0<AIN1(ACO=0);AIN0>AIN1(ACO=1)
switch(Phase)
{
case 0:
STEUER_A_H;
if(sense)
{
STEUER_C_L;
TCNT2 = 1; //TCNT2为什么赋值为1,定时器2的作用是什么?
if(ZeitZumAdWandeln) AdConvert();//转换时间 ZeitZumAdWandeln这个变量怎么只转换一次
SENSE_FALLING_INT;
SENSE_B;
Phase++;
CntKommutierungen++; //CntKommutierungen的作用是什么?
}
else
{
STEUER_B_L;
}
break;
.............................
while((SENSE_L && sense) || (SENSE_H && !sense)); //这个的作用是什么?
ZeitZumAdWandeln = 0; //这样的话 AdConvert();只能执行一次了?
}
////////////////////////////////
void AdConvert(void)
//############################################################################
/*补充注释:
AD采样,进入时保存比较器端口
然后切换到AD采样,采样工作电流,并移动加权平均算法过滤之
完成后恢复到之前的比较器端口
*/
i = ADCW * 4; //这段算法的意义?
if(i > 200) i = 200; //为什么以200为界?
Strom = (i + Strom * 7) / 8; //这是加权平均算法? 好奇怪,为什么要进行加权平均
if (Strom_max < Strom) Strom_max = Strom;
ADCSRA = 0x00;
SFIOR = 0x08;// Analog Comperator ein
}
//////////////////////////////////
http://cache.amobbs.com/bbs_upload782111/files_30/ourdev_567115K01U9T.PNG
(原文件名:测电流.PNG)
这个应该是测电流的电路,但是我在原理图上没有找到GND的端点,这个是怎么测得?
谢谢各位,问题有点多,麻烦大家了~~~
页:
[1]