Rev 51 | Rev 60 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 51 | Rev 58 | ||
---|---|---|---|
Line 10... | Line 10... | ||
10 | /############################################################################*/ |
10 | /############################################################################*/ |
Line 11... | Line 11... | ||
11 | 11 | ||
Line 12... | Line 12... | ||
12 | #include "main.h" |
12 | #include "main.h" |
13 | 13 | ||
14 | unsigned int PWM = 0; |
14 | unsigned int PWM = 0; |
15 | unsigned int Strom = 0; //ca. in 0,1A |
15 | unsigned int Strom = 0,RuheStrom; //ca. in 0,1A |
16 | unsigned char Strom_max = 0; |
16 | unsigned char Strom_max = 0; |
17 | unsigned char Mittelstrom = 0; |
17 | unsigned char Mittelstrom = 0; |
18 | unsigned int Drehzahl = 0; // in 100UPM 60 = 6000 |
18 | unsigned int Drehzahl = 0; // in 100UPM 60 = 6000 |
Line 143... | Line 143... | ||
143 | Delay_ms(300); |
143 | Delay_ms(300); |
144 | } |
144 | } |
145 | Delay_ms(1000); |
145 | Delay_ms(1000); |
146 | } |
146 | } |
Line 147... | Line 147... | ||
147 | 147 | ||
148 | #define TEST_STROMGRENZE 90 |
148 | #define TEST_STROMGRENZE 120 |
149 | unsigned char DelayM(unsigned int timer) |
149 | unsigned char DelayM(unsigned int timer) |
150 | { |
150 | { |
151 | while(timer--) |
151 | while(timer--) |
152 | { |
152 | { |
153 | FastADConvert(); |
153 | FastADConvert(); |
154 | if(Strom > TEST_STROMGRENZE) |
154 | if(Strom > (TEST_STROMGRENZE + RuheStrom)) |
155 | { |
155 | { |
156 | FETS_OFF; |
156 | FETS_OFF; |
157 | return(1); |
157 | return(1); |
158 | } |
158 | } |
Line 167... | Line 167... | ||
167 | // if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
167 | // if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
168 | } |
168 | } |
169 | return(0); |
169 | return(0); |
170 | } |
170 | } |
Line -... | Line 171... | ||
- | 171 | ||
171 | 172 | /* |
|
172 | void ShowSense(void) |
173 | void ShowSense(void) |
173 | { |
174 | { |
Line 174... | Line 175... | ||
174 | if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
175 | if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;} |
175 | 176 | ||
176 | } |
177 | } |
177 | 178 | */ |
|
178 | #define HIGH_A_EIN PORTB |= 0x08 |
179 | #define HIGH_A_EIN PORTB |= 0x08 |
179 | #define HIGH_B_EIN PORTB |= 0x04 |
180 | #define HIGH_B_EIN PORTB |= 0x04 |
180 | #define HIGH_C_EIN PORTB |= 0x02 |
181 | #define HIGH_C_EIN PORTB |= 0x02 |
Line 186... | Line 187... | ||
186 | //############################################################################ |
187 | //############################################################################ |
187 | { |
188 | { |
188 | unsigned char ADR_TAB[5] = {0,0,2,1,3}; |
189 | unsigned char ADR_TAB[5] = {0,0,2,1,3}; |
189 | unsigned int timer = 300,i; |
190 | unsigned int timer = 300,i; |
190 | unsigned int t = 0; |
191 | unsigned int t = 0; |
191 | unsigned char MosfetKurzschluss = 0, MosfetOkay = 0,anz = 0; |
192 | unsigned char anz = 0,MosfetOkay = 0, grenze = 50; |
Line 192... | Line 193... | ||
192 | 193 | ||
193 | PORTC &= ~ROT; |
194 | PORTC &= ~ROT; |
194 | Delay_ms(300 * ADR_TAB[MotorAdresse]); |
195 | Delay_ms(300 * ADR_TAB[MotorAdresse]); |
195 | DISABLE_SENSE_INT; |
196 | DISABLE_SENSE_INT; |
196 | cli();//Globale Interrupts Ausschalten |
197 | cli();//Globale Interrupts Ausschalten |
197 | uart_putchar('\n'); |
198 | uart_putchar('\n'); |
- | 199 | STEUER_OFF; |
|
198 | STEUER_OFF; |
200 | Strom_max = 0; |
- | 201 | DelayM(50); |
|
- | 202 | RuheStrom = Strom_max; |
|
199 | 203 | // uart_putchar(RuheStrom + 'A'); |
|
200 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
204 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
201 | //+ High-Mosfets auf Kurzschluss testen |
205 | //+ High-Mosfets auf Kurzschluss testen |
202 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
206 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
203 | Strom = 0; |
207 | Strom = 0; |
Line 233... | Line 237... | ||
233 | LOW_A_EIN; // Low A ein; und A gegen C |
237 | LOW_A_EIN; // Low A ein; und A gegen C |
234 | HIGH_C_EIN; // High C ein |
238 | HIGH_C_EIN; // High C ein |
235 | if(DelayM(3)) |
239 | if(DelayM(3)) |
236 | { |
240 | { |
237 | anz = 3; |
241 | anz = 3; |
238 | MosfetKurzschluss = 0x01; |
- | |
239 | uart_putchar('7'); |
242 | uart_putchar('7'); |
240 | } |
243 | } |
241 | FETS_OFF; |
244 | FETS_OFF; |
242 | DelayM(10000); |
245 | DelayM(10000); |
243 | if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten |
246 | if(anz) while(1) RotBlink(anz); // bei Kurzschluss nicht starten |
Line 244... | Line 247... | ||
244 | 247 | ||
245 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
248 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
246 | //+ LOW-Mosfets auf Schalten und Kurzschluss testen |
249 | //+ LOW-Mosfets auf Schalten und Kurzschluss testen |
247 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
250 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
248 | if(UDR == ' ') {t = 65535; uart_putchar('_');} else t = 1000; // Ausführlicher Test |
251 | if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000; // Ausführlicher Test |
249 | Strom = 0; |
252 | Strom = 0; |
250 | for(i=0;i<t;i++) |
253 | for(i=0;i<t;i++) |
251 | { |
254 | { |
252 | LOW_A_EIN; |
255 | LOW_A_EIN; |
253 | DelayM(1); |
256 | DelayM(1); |
254 | FETS_OFF; |
257 | FETS_OFF; |
255 | Delay(5); |
258 | Delay(5); |
256 | HIGH_A_EIN; |
259 | HIGH_A_EIN; |
257 | DelayM(1); |
260 | DelayM(1); |
258 | FETS_OFF; |
261 | FETS_OFF; |
259 | if(Strom > 40) {anz = 4; uart_putchar('4'); break;} |
262 | if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); break;} |
260 | Delay(5); |
263 | Delay(5); |
261 | } |
264 | } |
Line 262... | Line 265... | ||
262 | Delay(10000); |
265 | Delay(10000); |
Line 269... | Line 272... | ||
269 | FETS_OFF; |
272 | FETS_OFF; |
270 | Delay(5); |
273 | Delay(5); |
271 | HIGH_B_EIN; |
274 | HIGH_B_EIN; |
272 | DelayM(1); |
275 | DelayM(1); |
273 | FETS_OFF; |
276 | FETS_OFF; |
274 | if(Strom > 40) {anz = 5; uart_putchar('5'); break;} |
277 | if(Strom > grenze + RuheStrom) {anz = 5; uart_putchar('5'); break;} |
275 | Delay(5); |
278 | Delay(5); |
276 | } |
279 | } |
Line 277... | Line 280... | ||
277 | 280 | ||
278 | Strom = 0; |
281 | Strom = 0; |
Line 285... | Line 288... | ||
285 | FETS_OFF; |
288 | FETS_OFF; |
286 | Delay(5); |
289 | Delay(5); |
287 | HIGH_C_EIN; |
290 | HIGH_C_EIN; |
288 | DelayM(1); |
291 | DelayM(1); |
289 | FETS_OFF; |
292 | FETS_OFF; |
290 | if(Strom > 40) {anz = 6; uart_putchar('6'); break;} |
293 | if(Strom > grenze + RuheStrom) {anz = 6; uart_putchar('6'); break;} |
291 | Delay(5); |
294 | Delay(5); |
292 | } |
295 | } |
Line 293... | Line 296... | ||
293 | 296 | ||
294 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
297 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 341... | Line 344... | ||
341 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
344 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
342 | //+ Low-Mosfets auf Schalten testen |
345 | //+ Low-Mosfets auf Schalten testen |
343 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
346 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
344 | SENSE_B; |
347 | SENSE_B; |
345 | LOW_A_EIN; // Low A ein |
348 | LOW_A_EIN; // Low A ein |
346 | #define SOUND2_A 500 |
- | |
347 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
349 | for(i=0; i< (TONDAUER / SOUND2_A) ; i++) |
348 | { |
350 | { |
349 | HIGH_B_EIN; // Test B |
351 | HIGH_B_EIN; // Test B |
350 | Delay(SOUND_E); |
352 | Delay(SOUND_E); |
351 | if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;}; |
353 | if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;}; |
Line 390... | Line 392... | ||
390 | Delay(SOUND_E); |
392 | Delay(SOUND_E); |
391 | PORTB = 0; |
393 | PORTB = 0; |
392 | Delay(SOUND8_A); |
394 | Delay(SOUND8_A); |
393 | } |
395 | } |
394 | */ |
396 | */ |
395 | if(!(MosfetOkay & 0x01)) { anz = 1; uart_putchar('A'); } else |
- | |
396 | if(!(MosfetOkay & 0x02)) { anz = 2; uart_putchar('B'); } else |
- | |
397 | if(!(MosfetOkay & 0x04)) { anz = 3; uart_putchar('C'); } else |
- | |
398 | if(!(MosfetOkay & 0x08)) { anz = 4; uart_putchar('a'); } else |
- | |
399 | if(!(MosfetOkay & 0x10)) { anz = 5; uart_putchar('b'); } else |
- | |
400 | if(!(MosfetOkay & 0x20)) { anz = 6; uart_putchar('c'); } |
- | |
401 | Delay_ms(300 * (4-ADR_TAB[MotorAdresse])); |
397 | Delay_ms(300 * (4-ADR_TAB[MotorAdresse])); |
- | 398 | if(!(MosfetOkay & 0x01)) { anz = 1; UDR='A'; } else |
|
- | 399 | if(!(MosfetOkay & 0x02)) { anz = 2; UDR='B'; } else |
|
- | 400 | if(!(MosfetOkay & 0x04)) { anz = 3; UDR='C'; } else |
|
- | 401 | if(!(MosfetOkay & 0x08)) { anz = 4; UDR='a'; } else |
|
- | 402 | if(!(MosfetOkay & 0x10)) { anz = 5; UDR='b'; } else |
|
- | 403 | if(!(MosfetOkay & 0x20)) { anz = 6; UDR='c'; } |
|
Line 402... | Line 404... | ||
402 | 404 | ||
Line 403... | Line 405... | ||
403 | if(MosfetOkay != 0x3f) Delay_ms(1000); |
405 | if(anz) Delay_ms(1000); |
404 | 406 | ||
405 | RotBlink(anz); |
407 | RotBlink(anz); |
Line 540... | Line 542... | ||
540 | MinUpmPulse = SetDelay(10); |
542 | MinUpmPulse = SetDelay(10); |
541 | DebugOut.Analog[1] = 1; |
543 | DebugOut.Analog[1] = 1; |
542 | PPM_Signal = 0; |
544 | PPM_Signal = 0; |
Line 543... | Line 545... | ||
543 | 545 | ||
- | 546 | if(!SollwertErmittlung()) MotorTon(); |
|
- | 547 | //MotorTon(); |
|
Line 544... | Line 548... | ||
544 | if(!SollwertErmittlung()) MotorTon(); |
548 | PORTB = 0x31; // Pullups wieder einschalten |
545 | 549 | ||
Line 546... | Line 550... | ||
546 | // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung |
550 | // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung |
Line 557... | Line 561... | ||
557 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
561 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
558 | if(Phase != altPhase) // es gab eine Kommutierung im Interrupt |
562 | if(Phase != altPhase) // es gab eine Kommutierung im Interrupt |
559 | { |
563 | { |
560 | MotorGestoppt = 0; |
564 | MotorGestoppt = 0; |
561 | ZeitFuerBerechnungen = 0; // direkt nach einer Kommutierung ist Zeit |
565 | ZeitFuerBerechnungen = 0; // direkt nach einer Kommutierung ist Zeit |
562 | MinUpmPulse = SetDelay(50); // Timeout, falls ein Motor stehen bleibt |
566 | MinUpmPulse = SetDelay(250); // Timeout, falls ein Motor stehen bleibt |
563 | altPhase = Phase; |
567 | altPhase = Phase; |
564 | } |
568 | } |
565 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
569 | // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
566 | if(!PWM) // Sollwert == 0 |
570 | if(!PWM) // Sollwert == 0 |
567 | { |
571 | { |
Line 597... | Line 601... | ||
597 | if(CheckDelay(MittelstromTimer)) |
601 | if(CheckDelay(MittelstromTimer)) |
598 | { |
602 | { |
599 | MittelstromTimer = SetDelay(50); // alle 50ms |
603 | MittelstromTimer = SetDelay(50); // alle 50ms |
600 | if(Mittelstrom < Strom) Mittelstrom++;// Mittelwert des Stroms bilden |
604 | if(Mittelstrom < Strom) Mittelstrom++;// Mittelwert des Stroms bilden |
601 | else if(Mittelstrom > Strom) Mittelstrom--; |
605 | else if(Mittelstrom > Strom) Mittelstrom--; |
602 | - | ||
- | 606 | if(Strom > MAX_STROM) MaxPWM -= MaxPWM / 32; |
|
603 | if(Mittelstrom > LIMIT_STROM)// Strom am Limit? |
607 | if((Mittelstrom > LIMIT_STROM))// Strom am Limit? |
604 | { |
608 | { |
605 | MaxPWM--;// dann die Maximale PWM herunterfahren |
609 | if(MaxPWM) MaxPWM--;// dann die Maximale PWM herunterfahren |
606 | PORTC |= ROT; |
610 | PORTC |= ROT; |
607 | } |
611 | } |
608 | else |
612 | else |
609 | { |
613 | { |
610 | if(MaxPWM < MAX_PWM) MaxPWM++; |
614 | if(MaxPWM < MAX_PWM) MaxPWM++; |
Line 612... | Line 616... | ||
612 | } |
616 | } |
Line 613... | Line 617... | ||
613 | 617 | ||
614 | if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen |
618 | if(CheckDelay(DrehzahlMessTimer)) // Ist-Drehzahl bestimmen |
615 | { |
619 | { |
616 | DrehzahlMessTimer = SetDelay(10); |
620 | DrehzahlMessTimer = SetDelay(10); |
617 | SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2); |
621 | SIO_Drehzahl = CntKommutierungen;//(6 * CntKommutierungen) / (POLANZAHL / 2); |
618 | CntKommutierungen = 0; |
622 | CntKommutierungen = 0; |
619 | if(PPM_Timeout == 0) // keine PPM-Signale |
623 | if(PPM_Timeout == 0) // keine PPM-Signale |
620 | ZeitZumAdWandeln = 1; |
624 | ZeitZumAdWandeln = 1; |
Line -... | Line 625... | ||
- | 625 | } |
|
621 | } |
626 | |
622 | 627 | if(TEST_SCHUB) |
|
623 | 628 | { |
|
624 | if(CheckDelay(TestschubTimer)) |
629 | if(CheckDelay(TestschubTimer)) |
625 | { |
- | |
626 | TestschubTimer = SetDelay(1500); |
- | |
627 | if(TEST_SCHUB) |
630 | { |
628 | { |
631 | TestschubTimer = SetDelay(1500); |
629 | switch(test) |
632 | switch(test) |
630 | { |
633 | { |
631 | case 0: PWM = 50; test++; break; |
634 | case 0: PWM = 50; test++; break; |
632 | case 1: PWM = 130; test++; break; |
635 | case 1: PWM = 130; test++; break; |
633 | case 2: PWM = 60; test++; break; |
636 | case 2: PWM = 60; test++; break; |
634 | case 3: PWM = 140; test++; break; |
637 | case 3: PWM = 140; test++; break; |
635 | case 4: PWM = 150; test = 0; break; |
638 | case 4: PWM = 150; test = 0; break; |
636 | default: test = 0; |
- | |
637 | } |
639 | default: test = 0; |
- | 640 | } |
|
638 | } |
641 | } |
639 | } |
642 | } |
640 | // Motor Stehen geblieben |
643 | // Motor Stehen geblieben |
641 | if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen) |
644 | if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen) |
642 | { |
645 | { |
643 | MotorGestoppt = 1; |
646 | MotorGestoppt = 1; |