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('.');
}
我加断点试了下,是测量六个管子的导通特性的时候引起电机转动的,而且根据《电调设计全攻略》一文来看,发音也是这一段程序。实际上电也没有声音出来。电机用的是XXD2212电机 我最近也在弄mk电调。自己弄了个板子,但是按照官网上的步骤给mega8刷bootloader的时候刷进去就芯片锁死了。 bootloader也没起作用。工具usbasp(网上买的十几块一个) 软件AVR_fighter 。 我想问问你用的是什么办法刷进去的,熔断丝怎么设置 #define SOUND_E 1// 1
#define SOUND1_A300
#define SOUND2_A330
#define SOUND3_A360
你可以试试改 SOUND_E为10 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(低位)即可。上面只是我的一家之言,自己摸索的,可能有不对的地方。目前我自己写了一个发声程序,加上去之后,程序很容易出现逻辑错乱的情况,就是上电后不一定能运行起来,灯也不正常。如果灯能正常,发声程序也就能正常执行……现在这是我的一个困惑在这里,没能解决。有时间可以多交流 sunicecream 发表于 2016-2-22 11:54
你说的那个我改过,没什么作用。我是用AVR MARKII刷程序的。在我看来,bootloader的作用就是起到可以让串 ...
官方给你那个熔断丝设置,直接是设置的外部时钟。。然后用并口下载器sercon 刷的bootlaoder 这样说来bootloader里面因该有修改时钟设置的。。可能问题出在这里。 我这边是直接烧进的程序。ppm 和串口正常。 只是一直自检不通过。我在想是bootlader 里面他做了时钟等配置的处理 Hgww_MKV 发表于 2016-2-23 09:24
官方给你那个熔断丝设置,直接是设置的外部时钟。。然后用并口下载器sercon 刷的bootlaoder 这样说来boot ...
自检不通过是因为里边的检测时间的问题而已。修改一下时间或者把自检去掉,就没问题了
页:
[1]