liuliu443 发表于 2010-7-11 11:46:12

看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]
查看完整版本: 看feng_matrix无刷电调的程序,有几点不明白的地方,请大家指教~~~