Exemplo n.º 1
0
//正常测量电流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;  //恢复“比较器多路复用”为使能状态
}
Exemplo n.º 2
0
//############################################################################
//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
  
}
Exemplo n.º 3
0
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('.');
  }