1、 unsigned char tmp_pwm; tmp_pwm = PWM; if(tmp_pwm MaxPWM) tmp_pwm = MaxPWM; PORTC |= ROT; if(Strom MAX_STROM) OCR1A = 0; OCR1B = 0; OCR2 = 0; PORTD &= 0x38; DebugOut.Analog6+; Strom-; else #ifdef _32KHZ OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm; #endif #ifdef _16KHZ void DebugAusgaben(void) D
2、ebugOut.Analog0 = Strom; DebugOut.Analog1 = Mittelstrom; DebugOut.Analog2 = PPM_Signal; DebugOut.Analog3 = OCR2;void PWM_Init(void) PWM_OFF; TCCR1B = (1 CS10) | (0 CS11) | (0 CS12) | (0 WGM12) | (0 WGM13) | (0 ICES1) | (0 ICNC1);void Wait(unsigned char dauer) dauer = (unsigned char)TCNT0 + dauer; wh
3、ile(TCNT0 - dauer) & 0x80);void RotBlink(unsigned char anz)sei(); / Interrupts ein while(anz-) Delay_ms(300); PORTC &= ROT; Delay_ms(1000);char Anwerfen(unsigned char pwm) unsigned long timer = 300,i; DISABLE_SENSE_INT; PWM = 5; SetPWM(); Manuell(); MinUpmPulse = SetDelay(300); while(!CheckDelay(Min
4、UpmPulse) FastADConvert(); 120) STEUER_OFF; RotBlink(10); return(0); PWM = pwm; while(1) for(i=0;itimer; i+) if(!UebertragungAbgeschlossen) SendUart(); else DatenUebertragung(); Wait(100); / warten DebugAusgaben(); 60) / Abschalten wegen Kurzschluss timer-= timer/15+1; if(timer 25) if(TEST_MANUELL)
5、timer = 25; else return(1); Phase+; Phase %= 6; AdConvert(); if(SENSE) PORTD = GRUEN;#define TEST_STROMGRENZE 120unsigned char DelayM(unsigned int timer) while(timer-) (TEST_STROMGRENZE + RuheStrom) FETS_OFF; return(1);unsigned char Delay(unsigned int timer)#define HIGH_A_EIN PORTB |= 0x08#define HI
6、GH_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 |= 0x20void MotorTon(void) unsigned char ADR_TAB9 = 0,0,2,1,3,4,5,6,7; unsigned int timer = 300,i; unsigned int t = 0; unsigned char anz = 0,MosfetOkay = 0, gre
7、nze = 50; Delay_ms(300 * ADR_TABMotorAdresse); cli();/Globale Interrupts Ausschalten uart_putchar(n); Strom_max = 0; DelayM(50); RuheStrom = Strom_max; Strom = 0; if(UDR = ) t = 65535; grenze = 40;_ else t = 1000; / Ausf黨rlicher Testt;i+) LOW_A_EIN; DelayM(1); Delay(5); HIGH_A_EIN; grenze + RuheStro
8、m) anz = 4;4 break; Delay(10000); LOW_B_EIN; HIGH_B_EIN; grenze + RuheStrom) anz = 5;5break; LOW_C_EIN; HIGH_C_EIN; grenze + RuheStrom) anz = 6;6 if(anz) while(1) RotBlink(anz); / bei Kurzschluss nicht starten/+/+ High-Mosfets auf Schalten testen SENSE_A; / Low B ein / Low C ein#define TONDAUER 4000
9、0 #define SOUND_E 1 / 1#define SOUND1_A 300#define SOUND2_A 330#define SOUND3_A 360 i 50) MosfetOkay |= 0x01; else MosfetOkay &= 0x01; PORTB = 0; Delay(SOUND1_A); / Low A ein(TONDAUER / SOUND1_A); / Test B if(MessAD(1) 50) MosfetOkay |= 0x02;= 0x02;(TONDAUER / SOUND3_A); / Test C if(MessAD(2) 50) Mo
10、sfetOkay |= 0x04;= 0x04; Delay(SOUND2_A);/+ Low-Mosfets auf Schalten testen/ SENSE_B; 128) MosfetOkay &= 0x08; else MosfetOkay |= 0x08;/+= 0x20; else MosfetOkay |= 0x20; Delay(SOUND3_A);= 0x10; else MosfetOkay |= 0x10;/Hauptprogrammint main (void) char altPhase = 0; int test = 0; unsigned int Blink,
11、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;test500;test+); if(PINB &
12、 ADR1) if (PINB & ADR2) MotorAdresse = 1 + ADRESSOFFSET; else MotorAdresse = 2 + ADRESSOFFSET; else ADR2) MotorAdresse = 3 + ADRESSOFFSET; else MotorAdresse = 4 + ADRESSOFFSET; HwVersion = 11;#else MotorAdresse = MOTORADRESSE; HwVersion = 10;#endif if(PIND & 0x80) HwVersion = 12; IntRef = 0xc0; DDRD
13、 = 0xBA; UART_Init(); Timer0_Init(); sei();/Globale Interrupts Einschalten PWM_Init(); InitIC2_Slave(0x50); InitPPM(); Blink = SetDelay(101); Blink2 = SetDelay(102); MinUpmPulse = SetDelay(103); MittelstromTimer = SetDelay(254); DrehzahlMessTimer = SetDelay(1005); TestschubTimer = SetDelay(1006);Che
14、ckDelay(MinUpmPulse) if(SollwertErmittlung() break; GRN_ON; PWM = 0; SFIOR = 0x08; / Analog Comperator ein ADMUX = 1; MinUpmPulse = SetDelay(10); DebugOut.Analog1 = 1; PPM_Signal = 0;SollwertErmittlung() MotorTon(); / Pullups wieder einschalten / zum Test der Hardware; Motor dreht mit konstanter Dre
15、hzahl ohne Regelung if(TEST_MANUELL) Anwerfen(TEST_MANUELL); / kommt von dort nicht wieder while (1)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 =
16、0; ZeitFuerBerechnungen = 0; / direkt nach einer Kommutierung ist Zeit MinUpmPulse = SetDelay(250); / Timeout, falls ein Motor stehen bleibt altPhase = Phase;PWM) / Sollwert = 0 MotorAnwerfen = 0; / kein Startversuch / nach 1,5 Sekunden den Motor als gestoppt betrachten if(CheckDelay(MotorGestopptTimer) MotorGestoppt = 1; if(MotorGestoppt) MotorAnwerfen = 1; / Startversuch MotorGestopptTimer = SetDelay(1500); if(MotorGestoppt & !TEST_SCHUB) PWM = 0; / +ZeitFuerBerechnungen+) if(MotorGestoppt) / GRN_ON; if(SIO_DEBUG) DebugAusgaben
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1