📄 main.c
字号:
#define TONDAUER 40000
#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);
}
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('.');
}
//############################################################################
//
unsigned char SollwertErmittlung(void)
//############################################################################
{
static unsigned int sollwert = 0;
unsigned int ppm;
if(!I2C_Timeout) // bei Erreichen von 0 ist der Wert ung黮tig
{
if(SIO_Timeout) // es gibt g黮tige SIO-Daten
{
sollwert = (MAX_PWM * (unsigned int) SIO_Sollwert) / 200; // skalieren auf 0-200 = 0-255
PPM_Betrieb = 0;
ICP_INT_DISABLE;
PORTC &= ~ROT;
}
else
if(anz_ppm_werte > 20) // es gibt g黮tige PPM-Daten
{
PPM_Betrieb = 1;
ppm = PPM_Signal;
if(ppm > 300) ppm = 0; // ung黮tiges Signal
if(ppm > 200) ppm = 200;
if(ppm <= MIN_PPM) sollwert = 0;
else
{
sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM);
}
PORTC &= ~ROT;
}
else // Kein g黮tiger Sollwert
{
if(!TEST_SCHUB) { if(sollwert) sollwert--; }
PORTC |= ROT;
}
}
else // I2C-Daten sind g黮tig
{
sollwert = I2C_RXBuffer;
PPM_Betrieb = 0;
PORTC &= ~ROT;
ICP_INT_DISABLE;
}
if(sollwert > MAX_PWM) sollwert = MAX_PWM;
return(sollwert);
}
//############################################################################
//Hauptprogramm
int main (void)
//############################################################################
{
char altPhase = 0;
int test = 0;
unsigned int Blink,TestschubTimer;
unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;
DDRC = 0x08;
PORTC = 0x08;
DDRD = 0x3A;
PORTD = 0x00;
DDRB = 0x0E;
PORTB = 0x31;
#define ADRESSOFFSET 0
#if (MOTORADRESSE == 0)
PORTB |= (ADR1 + ADR2); // Pullups f黵 Adresswahl
for(test=0;test<500;test++);
if(PINB & ADR1)
{
if (PINB & ADR2) MotorAdresse = 1 + ADRESSOFFSET;
else MotorAdresse = 2 + ADRESSOFFSET;
}
else
{
if (PINB & ADR2) MotorAdresse = 3 + ADRESSOFFSET;
else MotorAdresse = 4 + ADRESSOFFSET;
}
HwVersion = 11;
#else
MotorAdresse = MOTORADRESSE;
HwVersion = 10;
#endif
if(PIND & 0x80) {HwVersion = 12; IntRef = 0xc0;}
DDRD = 0xBA;
UART_Init();
Timer0_Init();
sei();//Globale Interrupts Einschalten
// Am Blinken erkennt man die richtige Motoradresse
/*
for(test=0;test<5;test++)
{
if(test == MotorAdresse) PORTD |= GRUEN;
Delay_ms(150);
PORTD &= ~GRUEN;
Delay_ms(250);
}
Delay_ms(500);
*/
// UART_Init(); // war doppelt
PWM_Init();
InitIC2_Slave(0x50);
InitPPM();
Blink = SetDelay(101);
Blink2 = SetDelay(102);
MinUpmPulse = SetDelay(103);
MittelstromTimer = SetDelay(254);
DrehzahlMessTimer = SetDelay(1005);
TestschubTimer = SetDelay(1006);
while(!CheckDelay(MinUpmPulse))
{
if(SollwertErmittlung()) break;
}
GRN_ON;
PWM = 0;
SetPWM();
SFIOR = 0x08; // Analog Comperator ein
ADMUX = 1;
MinUpmPulse = SetDelay(10);
DebugOut.Analog[1] = 1;
PPM_Signal = 0;
if(!SollwertErmittlung()) MotorTon();
//MotorTon();
PORTB = 0x31; // Pullups wieder einschalten
// zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
if(TEST_MANUELL) Anwerfen(TEST_MANUELL); // kommt von dort nicht wieder
while (1)
{
//ShowSense();
if(!TEST_SCHUB) PWM = SollwertErmittlung();
//I2C_TXBuffer = PWM; // Antwort 黚er I2C-Bus
if(MANUELL_PWM) PWM = MANUELL_PWM;
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(Phase != altPhase) // es gab eine Kommutierung im Interrupt
{
MotorGestoppt = 0;
ZeitFuerBerechnungen = 0; // direkt nach einer Kommutierung ist Zeit
MinUpmPulse = SetDelay(250); // Timeout, falls ein Motor stehen bleibt
altPhase = Phase;
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(!PWM) // Sollwert == 0
{
MotorAnwerfen = 0; // kein Startversuch
ZeitFuerBerechnungen = 0;
// nach 1,5 Sekunden den Motor als gestoppt betrachten
if(CheckDelay(MotorGestopptTimer))
{
DISABLE_SENSE_INT;
MotorGestoppt = 1;
STEUER_OFF;
}
}
else
{
if(MotorGestoppt) MotorAnwerfen = 1; // Startversuch
MotorGestopptTimer = SetDelay(1500);
}
if(MotorGestoppt && !TEST_SCHUB) PWM = 0;
SetPWM();
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(!ZeitFuerBerechnungen++)
{
if(MotorGestoppt)
{
// GRN_ON;
FastADConvert();
}
if(SIO_DEBUG)
{
DebugAusgaben(); // welche Werte sollen angezeigt werden?
if(!UebertragungAbgeschlossen) SendUart();
else DatenUebertragung();
}
// Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung
if(CheckDelay(MittelstromTimer))
{
MittelstromTimer = SetDelay(50); // alle 50ms
if(Mittelstrom < Strom) Mittelstrom++;// Mittelwert des Stroms bilden
else if(Mittelstrom > Strom) Mittelstrom--;
if(Strom > MAX_STROM) MaxPWM -= MaxPWM / 32;
if((Mittelstrom > LIMIT_STROM))// Strom am Limit?
{
if(MaxPWM) MaxPWM--;// dann die Maximale PWM herunterfahren
PORTC |= ROT;
}
else
{
if(MaxPWM < MAX_PWM) MaxPWM++;
}
}
if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen
{
DrehzahlMessTimer = SetDelay(10);
SIO_Drehzahl = CntKommutierungen;//(6 * CntKommutierungen) / (POLANZAHL / 2);
CntKommutierungen = 0;
// if(PPM_Timeout == 0) // keine PPM-Signale
ZeitZumAdWandeln = 1;
}
#if TEST_SCHUB == 1
{
if(CheckDelay(TestschubTimer))
{
TestschubTimer = SetDelay(1500);
switch(test)
{
case 0: PWM = 50; test++; break;
case 1: PWM = 130; test++; break;
case 2: PWM = 60; test++; break;
case 3: PWM = 140; test++; break;
case 4: PWM = 150; test = 0; break;
default: test = 0;
}
}
}
#endif
// Motor Stehen geblieben
if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
{
MotorGestoppt = 1;
DISABLE_SENSE_INT;
MinUpmPulse = SetDelay(100);
if(MotorAnwerfen)
{
PORTC &= ~ROT;
Strom_max = 0;
MotorAnwerfen = 0;
if(Anwerfen(10))
{
// GRN_ON;
MotorGestoppt = 0;
Phase--;
PWM = 1;
SetPWM();
SENSE_TOGGLE_INT;
ENABLE_SENSE_INT;
MinUpmPulse = SetDelay(20);
while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren
PWM = 15;
SetPWM();
MinUpmPulse = SetDelay(300);
while(!CheckDelay(MinUpmPulse)) // kurz Durchstarten
{
if(Strom > LIMIT_STROM/2)
{
STEUER_OFF; // Abschalten wegen Kurzschluss
RotBlink(10);
MotorAnwerfen = 1;
}
}
// Drehzahlmessung wieder aufsetzen
DrehzahlMessTimer = SetDelay(50);
altPhase = 7;
}
else if(SollwertErmittlung()) MotorAnwerfen = 1;
}
}
} // ZeitFuerBerechnungen
} // while(1) - Hauptschleife
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -