sunicecream 发表于 2016-1-7 14:43:49

MK电调加入自检程序后,上电会转动一下,怎么解决?

RT,MK电调的程序在上电后,电机会转一下,然后正常工作,如果去掉自检程序,电机运行也正常(PPM信号控制)。而且自检时也发不出声音。程序如下,基本没怎么改,哪位调过的进来指导一下?
void MotorTon(void)
{
    unsigned char ADR_TAB = {0,0,2,1,3,4,5,6,7};
    unsigned inttimer = 300,i;
    unsigned intt = 0;
    unsigned char anz = 0,MosfetOkay = 0, grenze = 50;

    PORTC &= ~ROT;                                                        // 熄灭红LED
    Delay_ms(300 * ADR_TAB);   
    DISABLE_SENSE_INT;
    cli();                                                                        // 关全局中断
    uart_putchar('\n');
    STEUER_OFF;                                                                // #define STEUER_OFF {PORTD &= ~0x38;PWM_OFF;} 断开所有的MOSFET管
    Strom_max = 0;
    DelayM(50);                                                                // 测量电流50次
    RuheStrom = Strom_max;                                        // RuheStrom为测得的总漏是电流

    Strom = 0;

    if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; // Ausf黨rlicher Test

    Strom = 0;

for(i=0;i<t;i++)
   {
       LOW_A_EIN;                                                                // #define LOW_A_EINPORTD |= 0x08
       DelayM(1);                                                                // 测量一次电流
   FETS_OFF;                                                                // #defineFETS_OFF {PORTD &= ~0x38; PORTB &= ~0x0E; }
   Delay(5);
   HIGH_A_EIN;                                                        // #define HIGH_A_EIN PORTB |= 0x08
   DelayM(1);                                                                // 测量一次电流
   FETS_OFF;   
       if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); FETS_OFF; break;}
   Delay(5);
    }
       
        Delay(10000);
    Strom = 0;

for(i=0;i<t;i++)
   {
   LOW_B_EIN;
   DelayM(1);
   FETS_OFF;
   Delay(5);
   HIGH_B_EIN;
   DelayM(1);
   FETS_OFF;
   if(Strom > grenze + RuheStrom) {anz = 5; uart_putchar('5'); FETS_OFF;break;}
   Delay(5);
    }

    Strom = 0;
    Delay(10000);

for(i=0;i<t;i++)
   {
   LOW_C_EIN;
   DelayM(1);
   FETS_OFF;
   Delay(5);
   HIGH_C_EIN;
   DelayM(1);
   FETS_OFF;
   if(Strom > grenze + RuheStrom) {anz = 6; uart_putchar('6'); FETS_OFF; break;}
   Delay(5);
    }

if(anz) while(1) RotBlink(anz);        // bei Kurzschluss nicht starten


#define TONDAUER40000   
#define SOUND_E   1// 1
#define SOUND1_A300
#define SOUND2_A330
#define SOUND3_A360

    SENSE_A;                                                // #define SENSE_A ADMUX = 0 | IntRef;
    Strom = 0;                                                // 当前电流值
       
    FETS_OFF;                                                // 关断所有MOSFET管
    LOW_B_EIN;                                                 // Low B ein#define LOW_B_EINPORTD |= 0x10
    LOW_C_EIN;                                                 // Low C ein#define LOW_C_EINPORTD |= 0x20

    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
   {
       HIGH_A_EIN;                                         // Test A#define HIGH_A_EIN PORTB |= 0x08
       Delay(SOUND_E);
       if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;};
       PORTB = 0x00;
       Delay(SOUND1_A);
   }
       
    FETS_OFF;
    LOW_A_EIN; // Low A ein
    LOW_C_EIN; // Low C ein
       
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
   {
      HIGH_B_EIN; // Test B
      Delay(SOUND_E);
      if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;};
      PORTB = 0x00;
      Delay(SOUND1_A);
   }

    FETS_OFF;
    LOW_A_EIN; // Low A ein
    LOW_B_EIN; // Low B ein
       
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
   {
      HIGH_C_EIN; // Test C
      Delay(SOUND_E);
      if(MessAD(2) > 50) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;};
      PORTB = 0x00;
      Delay(SOUND1_A);
   }
RotBlink(10);
        /********************************************************************************************************************/       
       
    FETS_OFF;
    LOW_A_EIN;                 // Low A ein                
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
   {
       HIGH_C_EIN;        // CA相通电               
       Delay(SOUND_E);
       if(MessAD(0) > 300) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;};
       PORTB = 0x00;
       Delay(SOUND3_A);
   }

    FETS_OFF;
    LOW_C_EIN;                // Low C ein
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
   {
      HIGH_B_EIN;        // BC相通电
      Delay(SOUND_E);
      if(MessAD(2) > 300) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;};
      PORTB = 0x00;
      Delay(SOUND3_A);
   }
       
    FETS_OFF;
    LOW_B_EIN;                // Low B ein                               
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
   {
       HIGH_A_EIN;         // AB相通电
       Delay(SOUND_E);
       if(MessAD(1) > 300) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;};
       PORTB = 0x00;
       Delay(SOUND3_A);
   }
       
    FETS_OFF;
       
    sei();                                        //Globale Interrupts Einschalten

Delay_ms(300 * (4-ADR_TAB));   
if(!(MosfetOkay & 0x01)){ anz = 1; UDR='A'; } else
if(!(MosfetOkay & 0x02)){ anz = 2; UDR='B'; } else
if(!(MosfetOkay & 0x04)){ anz = 3; UDR='C'; } else
if(!(MosfetOkay & 0x08)){ anz = 4; UDR='a'; } else
if(!(MosfetOkay & 0x10)){ anz = 5; UDR='b'; } else
if(!(MosfetOkay & 0x20)){ anz = 6; UDR='c'; }   

if(anz) while(1) RotBlink(anz);                         // bei Kurzschluss nicht starten

RotBlink(anz);
uart_putchar('.');
}

sunicecream 发表于 2016-1-7 14:48:13

我加断点试了下,是测量六个管子的导通特性的时候引起电机转动的,而且根据《电调设计全攻略》一文来看,发音也是这一段程序。实际上电也没有声音出来。电机用的是XXD2212电机

Hgww_MKV 发表于 2016-2-16 16:21:27

我最近也在弄mk电调。自己弄了个板子,但是按照官网上的步骤给mega8刷bootloader的时候刷进去就芯片锁死了。 bootloader也没起作用。工具usbasp(网上买的十几块一个) 软件AVR_fighter   。 我想问问你用的是什么办法刷进去的,熔断丝怎么设置

Hgww_MKV 发表于 2016-2-16 16:27:03

#define SOUND_E   1// 1
#define SOUND1_A300
#define SOUND2_A330
#define SOUND3_A360

你可以试试改 SOUND_E为10

sunicecream 发表于 2016-2-22 11:54:18

Hgww_MKV 发表于 2016-2-16 16:27
#define SOUND_E   1// 1
#define SOUND1_A300
#define SOUND2_A330


你说的那个我改过,没什么作用。我是用AVR MARKII刷程序的。在我看来,bootloader的作用就是起到可以让串口直接刷程序的作用而已,如果不需要通过串口直接刷程序,bootloader可以忽略掉,直接烧写编译好的HEX文件就好了。熔丝位的话,使用usbasp时需要对应的将熔丝位配置为 0xDA (高位)   0x84(低位)即可。上面只是我的一家之言,自己摸索的,可能有不对的地方。目前我自己写了一个发声程序,加上去之后,程序很容易出现逻辑错乱的情况,就是上电后不一定能运行起来,灯也不正常。如果灯能正常,发声程序也就能正常执行……现在这是我的一个困惑在这里,没能解决。有时间可以多交流

Hgww_MKV 发表于 2016-2-23 09:24:38

sunicecream 发表于 2016-2-22 11:54
你说的那个我改过,没什么作用。我是用AVR MARKII刷程序的。在我看来,bootloader的作用就是起到可以让串 ...

官方给你那个熔断丝设置,直接是设置的外部时钟。。然后用并口下载器sercon 刷的bootlaoder 这样说来bootloader里面因该有修改时钟设置的。。可能问题出在这里。 我这边是直接烧进的程序。ppm 和串口正常。 只是一直自检不通过。我在想是bootlader 里面他做了时钟等配置的处理

sunicecream 发表于 2016-2-23 09:59:30

Hgww_MKV 发表于 2016-2-23 09:24
官方给你那个熔断丝设置,直接是设置的外部时钟。。然后用并口下载器sercon 刷的bootlaoder 这样说来boot ...

自检不通过是因为里边的检测时间的问题而已。修改一下时间或者把自检去掉,就没问题了
页: [1]
查看完整版本: MK电调加入自检程序后,上电会转动一下,怎么解决?