//正常测量电流Strom值(每次新测量的值仅占1/8权重,上次值占7/8权重) void NormalStromConvert() { uint16_t i=0; //+++++++++++++++++++ #ifdef USE_AVR_mega32 i = MessAD(6) * 4; //!!!!!!要根据自己的电阻改!!!! if(i > 200) i = 200; #endif //------------------ #ifdef USE_AVR_mega8 i = MessAD(6) * 4; if(i > 200) i = 200; #endif //+++++++++++++++++ Strom = (i + Strom * 7) / 8; if (Strom_max < Strom) Strom_max = Strom; //SFIOR = 0x08; //恢复“比较器多路复用”为使能状态 }
//############################################################################ //Strom Analogwerte lesen void FastADConvert(void) //############################################################################ { unsigned int i=0; i = MessAD(6) * 4; // i = ADCW * 4; if(i > 200) i = 200; Strom = i;//(i + Strom * 1) / 2; if (Strom_max < Strom) Strom_max = Strom; ADCSRA = 0x00; SFIOR = 0x08; // Analog Comperator ein }
void MotorTon(void) //自检流程分析 //############################################################################ { unsigned char ADR_TAB[5] = {0,0,2,1,3}; unsigned int timer = 300,i; unsigned int t = 0; unsigned char anz = 0,MosfetOkay = 0, grenze = 50; // PORTC &= ~ROT; Delay_ms(300 * ADR_TAB[MotorAdresse]); DISABLE_SENSE_INT; //关模拟比较器中断 cli();//Globale Interrupts Ausschalten 关总中断 uart_putchar('\n'); //给串口发一个换行字符 STEUER_OFF;//关断所有场效应管 Strom_max = 0; DelayM(50); RuheStrom = Strom_max; //总漏电流 // uart_putchar(RuheStrom + 'A'); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ High-Mosfets auf Kurzschluss testen //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Strom = 0; /* LOW_B_EIN; HIGH_A_EIN; if(DelayM(3)) { anz = 1; uart_putchar('1'); } FETS_OFF; Delay(1000); Strom = 0; LOW_A_EIN; HIGH_B_EIN; if(DelayM(3)) { anz = 2; uart_putchar('2'); } FETS_OFF; Delay(1000); Strom = 0; LOW_B_EIN; // Low C ein HIGH_C_EIN; // High B ein if(DelayM(3)) { anz = 3; uart_putchar('3'); } FETS_OFF; Delay(1000); LOW_A_EIN; // Low A ein; und A gegen C HIGH_C_EIN; // High C ein if(DelayM(3)) { anz = 3; uart_putchar('7'); } FETS_OFF; DelayM(10000); if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten */ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ LOW-Mosfets auf Schalten und Kurzschluss testen //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; // Ausführlicher Test Strom = 0; for(i=0;i<t;i++) { LOW_A_EIN; // 打开A相的下单臂 DelayM(1); // 检测一下电流 FETS_OFF; // 关断所有管 Delay(5); HIGH_A_EIN; DelayM(1); FETS_OFF; if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); FETS_OFF; break;} //grenze ?? anz?? 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 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ High-Mosfets auf Schalten testen //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SENSE_A; FETS_OFF; LOW_B_EIN; // Low B ein LOW_C_EIN; // Low C ein Strom = 0; #define TONDAUER 40000 //电机上的硅钢片在振动,且频率在高于20HZ小于20000HZ时,能够发出声音 #define SOUND_E 1 // 1 #define SOUND1_A 300 #define SOUND2_A 330 #define SOUND3_A 360 for(i=0; i< (TONDAUER / SOUND2_A) ; i++) { HIGH_A_EIN; // Test A Delay(SOUND_E); if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;}; PORTB = 0; Delay(SOUND1_A); // 控制Delay参数,就可以控制音调 } 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 = 0; 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 = 0; Delay(SOUND2_A); } FETS_OFF; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //+ Low-Mosfets auf Schalten testen //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // SENSE_B; LOW_A_EIN; // Low A ein for(i=0; i< (TONDAUER / SOUND2_A) ; i++) { HIGH_B_EIN; // Test B Delay(SOUND_E); if(MessAD(0) > 128) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;}; PORTB = 0; Delay(SOUND2_A); } //++++++++++++++++++++++++++++++++++++ LOW_C_EIN; // Low C ein for(i=0; i<(TONDAUER / SOUND1_A); i++) { HIGH_B_EIN; // Test B Delay(SOUND_E); if(MessAD(2) > 128) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;}; PORTB = 0; Delay(SOUND3_A); } FETS_OFF; //++++++++++++++++++++++++++++++++++++ FETS_OFF; LOW_B_EIN; // Low B ein for(i=0; i<(TONDAUER / SOUND3_A); i++) { HIGH_C_EIN; // Test C Delay(SOUND_E); if(MessAD(1) > 128) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;}; PORTB = 0; Delay(SOUND3_A); } FETS_OFF; //++++++++++++++++++++++++++++++++++++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sei();//Globale Interrupts Einschalten // Delay_ms(250 * MotorAdresse); /* LOW_A_EIN; // Low B ein #define SOUND8_A 650 for(i=0; i<(TONDAUER / SOUND8_A); i++) { HIGH_B_EIN; // Test B Delay(SOUND_E); PORTB = 0; Delay(SOUND8_A); } */ Delay_ms(300 * (4-ADR_TAB[MotorAdresse])); 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) Delay_ms(1000); if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten RotBlink(anz); uart_putchar('.'); }