搜索
bottom↓
回复: 0

看feng_matrix无刷电调的程序,有几点不明白的地方,请大家指教~~~

[复制链接]

出0入0汤圆

发表于 2010-7-11 11:46:12 | 显示全部楼层 |阅读模式
首先从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
}

//////////////////////////////////

(原文件名:测电流.PNG)

这个应该是测电流的电路,但是我在原理图上没有找到GND的端点,这个是怎么测得?

谢谢各位,问题有点多,麻烦大家了~~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-31 03:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表