⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 遥控电子玩具电动机的调节转动的速度文件包
💻 C
📖 第 1 页 / 共 2 页
字号:
/*#######################################################################################
无刷电机控制系统
#######################################################################################*/

#include "main.h"

unsigned int  PWM = 0;
unsigned int  Strom = 0,RuheStrom; //0.1A
unsigned char Strom_max = 0;
unsigned char Mittelstrom = 0; 
unsigned int  Drehzahl = 0;  //  100Hz  60 = 6000
unsigned int  KommutierDelay = 10;
unsigned int  I2C_Timeout = 0;
unsigned int SIO_Timeout = 0;
unsigned int  SollDrehzahl = 0;
unsigned int  IstDrehzahl = 0;
unsigned int  DrehZahlTabelle[256];//转动值
unsigned char ZeitFuerBerechnungen = 1;
unsigned char MotorAnwerfen = 0;
unsigned char MotorGestoppt = 1;
unsigned char MaxPWM = MAX_PWM;
unsigned int  CntKommutierungen = 0;
unsigned int  SIO_Drehzahl = 0;
unsigned char ZeitZumAdWandeln = 1;
unsigned char MotorAdresse = 1;
unsigned char PPM_Betrieb = 1;

//############################################################################
void SetPWM(void)
//############################################################################
{
    unsigned char tmp_pwm; 
    tmp_pwm = PWM;
    if(tmp_pwm > MaxPWM)    // 电流限制
        {
        tmp_pwm = MaxPWM;
        PORTC |= ROT; 
        } 
    if(Strom > MAX_STROM)   // Strombegrenzung
        {
        OCR1A = 0; OCR1B = 0; OCR2  = 0;
        PORTC |= ROT; 
        Strom--;
        }
    else 
        {
        #ifdef  _32KHZ 
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
        #endif 

        #ifdef  _16KHZ 
        //OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2  = tmp_pwm;
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
        #endif 
        }
}

//############################################################################
//
void PWM_Init(void)
//############################################################################
{
    PWM_OFF;
    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (0 << WGM12) | 
             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
/*    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) | 
             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
*/
}

//############################################################################
//
void Wait(unsigned char dauer)
//############################################################################
{
    dauer = (unsigned char)TCNT0 + dauer;
    while((TCNT0 - dauer) & 0x80);
}

//############################################################################
//
void Anwerfen(unsigned char pwm)
//############################################################################
{
    unsigned long timer = 300,i;
    DISABLE_SENSE_INT;
    PWM = 5;
    SetPWM();
    Manuell();
    Delay_ms(200);
    PWM = pwm;
    while(1)
        {
        for(i=0;i<timer; i++) 
            {
            if(!UebertragungAbgeschlossen)  SendUart();
            else DatenUebertragung();
            Wait(100);  // wait
            } 
        timer-= timer/15+1;
        if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }

        Manuell();
        Phase++;
        Phase %= 6;
        AdConvert();
        PWM = pwm;
        SetPWM();
        if(SENSE) 
            {
            PORTD ^= GRUEN;
            } 
        }
}

//**********************故障灯*************************//

void RotBlink(unsigned char anz)
{
sei(); // Interrupts ein
 while(anz--)
  {
   PORTC |= ROT;
   Delay_ms(300);    
   PORTC &= ~ROT;
   Delay_ms(300);    
  }
   Delay_ms(1000);    
}

#define TEST_STROMGRENZE 120
unsigned char DelayM(unsigned int timer)
{
 while(timer--)
  {
   FastADConvert();
   if(Strom > (TEST_STROMGRENZE + RuheStrom))
       {
        FETS_OFF;
        return(1);
       } 
  }
 return(0);  
}

unsigned char Delay(unsigned int timer)
{
 while(timer--)
  {
//   if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
  }
 return(0);  
}

/*
void ShowSense(void)
{
 if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}

}
*/
#define HIGH_A_EIN PORTB |= 0x08
#define HIGH_B_EIN PORTB |= 0x04
#define HIGH_C_EIN PORTB |= 0x02
#define LOW_A_EIN  PORTD |= 0x08
#define LOW_B_EIN  PORTD |= 0x10
#define LOW_C_EIN  PORTD |= 0x20

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;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 高端功率管短路测试                                    +//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    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);  

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 低端功率管短路测试
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; 
 Strom = 0;
 for(i=0;i<t;i++)
 {
  LOW_A_EIN; 
  DelayM(1);
  FETS_OFF;
  Delay(5);
  HIGH_A_EIN;
  DelayM(1);
  FETS_OFF;
  if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); 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'); 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'); break;}
  Delay(5);
 } 

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 高端功率管开关测试
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    SENSE_A;
    FETS_OFF;
    LOW_B_EIN; // Low B ein
    LOW_C_EIN; // Low C ein
    Strom = 0;
#define TONDAUER  40000    
#define SOUND_E 2
#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);
     }
    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++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -