Subversion Repositories BL-Ctrl

Rev

Rev 50 | Rev 58 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 ingob 1
/*############################################################################
2
 + Regler für Brushless-Motoren
3
 + ATMEGA8 mit 8MHz
4
 + (c) 01.2007 Holger Buss
5
 + Nur für den privaten Gebrauch
6
 + Keine Garantie auf Fehlerfreiheit
7
 + Kommerzielle Nutzung nur mit meiner Zustimmung
8
 + Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden
9
 + www.mikrocontroller.com
10
/############################################################################*/
11
 
12
#include "main.h"
13
 
14
unsigned int  PWM = 0;
15
unsigned int  Strom = 0; //ca. in 0,1A
16
unsigned char Strom_max = 0;
51 holgerb 17
unsigned char Mittelstrom = 0;
1 ingob 18
unsigned int  Drehzahl = 0;  // in 100UPM  60 = 6000
19
unsigned int  KommutierDelay = 10;
20
unsigned int  I2C_Timeout = 0;
23 ingob 21
unsigned int SIO_Timeout = 0;
1 ingob 22
unsigned int  SollDrehzahl = 0;
23
unsigned int  IstDrehzahl = 0;
24
unsigned int  DrehZahlTabelle[256];//vorberechnete Werte zur Drehzahlerfassung
25
unsigned char ZeitFuerBerechnungen = 1;
26
unsigned char MotorAnwerfen = 0;
27
unsigned char MotorGestoppt = 1;
28
unsigned char MaxPWM = MAX_PWM;
29
unsigned int  CntKommutierungen = 0;
30
unsigned int  SIO_Drehzahl = 0;
31
unsigned char ZeitZumAdWandeln = 1;
24 ingob 32
unsigned char MotorAdresse = 1;
50 holgerb 33
unsigned char PPM_Betrieb = 1;
1 ingob 34
 
35
//############################################################################
36
//
37
void SetPWM(void)
38
//############################################################################
39
{
40
    unsigned char tmp_pwm;
41
    tmp_pwm = PWM;
42
    if(tmp_pwm > MaxPWM)    // Strombegrenzung
43
        {
44
        tmp_pwm = MaxPWM;
45
        PORTC |= ROT;
46
        }
47
    if(Strom > MAX_STROM)   // Strombegrenzung
48
        {
49
        OCR1A = 0; OCR1B = 0; OCR2  = 0;
50
        PORTC |= ROT;
51
        Strom--;
52
        }
53
    else
54
        {
55
        #ifdef  _32KHZ 
56
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
57
        #endif 
58
 
59
        #ifdef  _16KHZ 
50 holgerb 60
        //OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2  = tmp_pwm;
61
        OCR1A =  tmp_pwm; OCR1B =  tmp_pwm; OCR2  = tmp_pwm;
1 ingob 62
        #endif 
63
        }
64
}
65
 
66
//############################################################################
67
//
68
void PWM_Init(void)
69
//############################################################################
70
{
71
    PWM_OFF;
50 holgerb 72
    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (0 << WGM12) |
1 ingob 73
             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
50 holgerb 74
/*    TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) |
75
             (0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
76
*/
1 ingob 77
}
78
 
79
//############################################################################
80
//
81
void Wait(unsigned char dauer)
82
//############################################################################
83
{
84
    dauer = (unsigned char)TCNT0 + dauer;
85
    while((TCNT0 - dauer) & 0x80);
86
}
87
 
88
//############################################################################
89
//
90
void Anwerfen(unsigned char pwm)
91
//############################################################################
92
{
93
    unsigned long timer = 300,i;
94
    DISABLE_SENSE_INT;
95
    PWM = 5;
96
    SetPWM();
97
    Manuell();
98
    Delay_ms(200);
99
    PWM = pwm;
100
    while(1)
101
        {
102
        for(i=0;i<timer; i++)
103
            {
104
            if(!UebertragungAbgeschlossen)  SendUart();
105
            else DatenUebertragung();
106
            Wait(100);  // warten
107
            }
108
        timer-= timer/15+1;
109
        if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }
110
 
111
        Manuell();
112
        Phase++;
113
        Phase %= 6;
114
        AdConvert();
115
        PWM = pwm;
116
        SetPWM();
117
        if(SENSE)
118
            {
119
            PORTD ^= GRUEN;
120
            }
121
        }
122
}
123
 
50 holgerb 124
/*
125
#define SENSE_A ADMUX = 0;
126
#define SENSE_B ADMUX = 1;
127
#define SENSE_C ADMUX = 2;
128
 
129
#define ClrSENSE            ACSR |= 0x10
130
#define SENSE               ((ACSR & 0x10))
131
#define SENSE_L             (!(ACSR & 0x20))
132
#define SENSE_H             ((ACSR & 0x20))
133
*/
134
 
135
void RotBlink(unsigned char anz)
136
{
137
sei(); // Interrupts ein
138
 while(anz--)
139
  {
140
   PORTC |= ROT;
141
   Delay_ms(300);    
142
   PORTC &= ~ROT;
143
   Delay_ms(300);    
144
  }
145
   Delay_ms(1000);    
146
}
147
 
51 holgerb 148
#define TEST_STROMGRENZE 90
50 holgerb 149
unsigned char DelayM(unsigned int timer)
150
{
151
 while(timer--)
152
  {
153
   FastADConvert();
154
   if(Strom > TEST_STROMGRENZE)
155
       {
51 holgerb 156
        FETS_OFF;
50 holgerb 157
        return(1);
158
       }
159
  }
160
 return(0);  
161
}
162
 
163
unsigned char Delay(unsigned int timer)
164
{
165
 while(timer--)
166
  {
51 holgerb 167
//   if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
50 holgerb 168
  }
169
 return(0);  
170
}
171
 
51 holgerb 172
void ShowSense(void)
173
{
174
 if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
50 holgerb 175
 
51 holgerb 176
}
177
 
178
#define HIGH_A_EIN PORTB |= 0x08
179
#define HIGH_B_EIN PORTB |= 0x04
180
#define HIGH_C_EIN PORTB |= 0x02
181
#define LOW_A_EIN  PORTD |= 0x08
182
#define LOW_B_EIN  PORTD |= 0x10
183
#define LOW_C_EIN  PORTD |= 0x20
184
 
50 holgerb 185
void MotorTon(void)
1 ingob 186
//############################################################################
50 holgerb 187
{
51 holgerb 188
    unsigned char ADR_TAB[5] = {0,0,2,1,3};
50 holgerb 189
    unsigned int timer = 300,i;
51 holgerb 190
    unsigned int t = 0;
50 holgerb 191
    unsigned char MosfetKurzschluss = 0, MosfetOkay = 0,anz = 0;
51 holgerb 192
 
193
    PORTC &= ~ROT;
194
    Delay_ms(300 * ADR_TAB[MotorAdresse]);    
50 holgerb 195
    DISABLE_SENSE_INT;
196
    cli();//Globale Interrupts Ausschalten
197
    uart_putchar('\n');
198
    STEUER_OFF;
51 holgerb 199
 
50 holgerb 200
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
201
//+ High-Mosfets auf Kurzschluss testen
202
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
203
    Strom = 0;
51 holgerb 204
    LOW_B_EIN;
205
    HIGH_A_EIN;
50 holgerb 206
    if(DelayM(3))
207
       {
208
        anz = 1;
51 holgerb 209
        uart_putchar('1');
50 holgerb 210
       }
51 holgerb 211
    FETS_OFF;
212
    Delay(1000);
50 holgerb 213
    Strom = 0;
51 holgerb 214
    LOW_A_EIN;
215
    HIGH_B_EIN;
50 holgerb 216
    if(DelayM(3))
217
       {
218
        anz = 2;
51 holgerb 219
        uart_putchar('2');
50 holgerb 220
       }
51 holgerb 221
    FETS_OFF;
222
    Delay(1000);
50 holgerb 223
    Strom = 0;
51 holgerb 224
    LOW_B_EIN; // Low C ein
225
    HIGH_C_EIN; // High B ein
50 holgerb 226
    if(DelayM(3))
227
       {
228
        anz = 3;
51 holgerb 229
        uart_putchar('3');
50 holgerb 230
       }
51 holgerb 231
    FETS_OFF;
232
    Delay(1000);
233
    LOW_A_EIN; // Low  A ein; und A gegen C
234
    HIGH_C_EIN; // High C ein
50 holgerb 235
    if(DelayM(3))
236
       {
237
        anz = 3;
238
        MosfetKurzschluss = 0x01;
51 holgerb 239
        uart_putchar('7');
50 holgerb 240
       }
51 holgerb 241
    FETS_OFF;
242
    DelayM(10000);
243
if(anz) while(1) RotBlink(anz);  // bei Kurzschluss nicht starten
244
 
50 holgerb 245
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51 holgerb 246
//+ LOW-Mosfets auf Schalten und Kurzschluss testen
50 holgerb 247
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51 holgerb 248
 if(UDR == ' ') {t = 65535; uart_putchar('_');} else t = 1000; // Ausführlicher Test
249
 Strom = 0;
250
 for(i=0;i<t;i++)
251
 {
252
  LOW_A_EIN;
253
  DelayM(1);
254
  FETS_OFF;
255
  Delay(5);
256
  HIGH_A_EIN;
257
  DelayM(1);
258
  FETS_OFF;
259
  if(Strom > 40) {anz = 4; uart_putchar('4'); break;}
260
  Delay(5);
261
 }
262
 Delay(10000);
50 holgerb 263
 
51 holgerb 264
 Strom = 0;
265
 for(i=0;i<t;i++)
266
 {
267
  LOW_B_EIN;
268
  DelayM(1);
269
  FETS_OFF;
270
  Delay(5);
271
  HIGH_B_EIN;
272
  DelayM(1);
273
  FETS_OFF;
274
  if(Strom > 40) {anz = 5; uart_putchar('5'); break;}
275
  Delay(5);
276
 }
50 holgerb 277
 
51 holgerb 278
 Strom = 0;
279
 Delay(10000);
280
 
281
 for(i=0;i<t;i++)
282
 {
283
  LOW_C_EIN;
284
  DelayM(1);
285
  FETS_OFF;
286
  Delay(5);
287
  HIGH_C_EIN;
288
  DelayM(1);
289
  FETS_OFF;
290
  if(Strom > 40) {anz = 6; uart_putchar('6'); break;}
291
  Delay(5);
292
 }
293
 
50 holgerb 294
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
295
//+ High-Mosfets auf Schalten testen
296
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
297
    SENSE_A;
51 holgerb 298
    FETS_OFF;
299
    LOW_B_EIN; // Low B ein
300
    LOW_C_EIN; // Low C ein
50 holgerb 301
    Strom = 0;
51 holgerb 302
#define TONDAUER  40000    
303
#define SOUND_E 2
304
#define SOUND1_A 300
305
#define SOUND2_A 330
306
#define SOUND3_A 360
307
 
50 holgerb 308
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
309
     {
51 holgerb 310
      HIGH_A_EIN; // Test A
50 holgerb 311
      Delay(SOUND_E);
51 holgerb 312
      if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;};
50 holgerb 313
      PORTB = 0;
51 holgerb 314
      Delay(SOUND1_A);
50 holgerb 315
     }
51 holgerb 316
    FETS_OFF;
317
 
318
    LOW_A_EIN; // Low A ein
319
    LOW_C_EIN; // Low C ein
50 holgerb 320
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
321
     {
51 holgerb 322
      HIGH_B_EIN; // Test B
50 holgerb 323
      Delay(SOUND_E);
51 holgerb 324
      if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;};
50 holgerb 325
      PORTB = 0;
326
      Delay(SOUND1_A);
327
     }
328
 
51 holgerb 329
    FETS_OFF;
330
    LOW_A_EIN; // Low A ein
331
    LOW_B_EIN; // Low B ein
50 holgerb 332
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
333
     {
51 holgerb 334
      HIGH_C_EIN; // Test C
50 holgerb 335
      Delay(SOUND_E);
51 holgerb 336
      if(MessAD(2) > 50) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;};
50 holgerb 337
      PORTB = 0;
51 holgerb 338
      Delay(SOUND2_A);
50 holgerb 339
     }
51 holgerb 340
    FETS_OFF;
50 holgerb 341
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
342
//+ Low-Mosfets auf Schalten testen
343
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
344
    SENSE_B;
51 holgerb 345
    LOW_A_EIN; // Low A ein
50 holgerb 346
#define SOUND2_A 500
347
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
348
     {
51 holgerb 349
      HIGH_B_EIN; // Test B
50 holgerb 350
      Delay(SOUND_E);
51 holgerb 351
      if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;};
50 holgerb 352
      PORTB = 0;
353
      Delay(SOUND2_A);
354
     }
51 holgerb 355
 
356
//++++++++++++++++++++++++++++++++++++
357
    LOW_C_EIN; // Low C ein
358
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
50 holgerb 359
     {
51 holgerb 360
      HIGH_B_EIN; // Test B
50 holgerb 361
      Delay(SOUND_E);
51 holgerb 362
      if(MessAD(2) > 50) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;};
50 holgerb 363
      PORTB = 0;
364
      Delay(SOUND3_A);
365
     }
51 holgerb 366
    FETS_OFF;
367
//++++++++++++++++++++++++++++++++++++
368
    FETS_OFF;
369
    LOW_B_EIN; // Low B ein
370
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
50 holgerb 371
     {
51 holgerb 372
      HIGH_C_EIN; // Test C
50 holgerb 373
      Delay(SOUND_E);
51 holgerb 374
      if(MessAD(1) > 50) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;};
50 holgerb 375
      PORTB = 0;
51 holgerb 376
      Delay(SOUND3_A);
50 holgerb 377
     }
51 holgerb 378
    FETS_OFF;
379
//++++++++++++++++++++++++++++++++++++
50 holgerb 380
 
51 holgerb 381
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
50 holgerb 382
    sei();//Globale Interrupts Einschalten
51 holgerb 383
//    Delay_ms(250 * MotorAdresse);    
384
/*
385
    LOW_A_EIN; // Low B ein
50 holgerb 386
#define SOUND8_A 650
387
    for(i=0; i<(TONDAUER / SOUND8_A); i++)
388
     {
51 holgerb 389
      HIGH_B_EIN; // Test B
390
      Delay(SOUND_E);
391
      PORTB = 0;
392
      Delay(SOUND8_A);
50 holgerb 393
     }
51 holgerb 394
*/
50 holgerb 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'); }  
51 holgerb 401
 Delay_ms(300 * (4-ADR_TAB[MotorAdresse]));    
50 holgerb 402
 
403
 if(MosfetOkay != 0x3f) Delay_ms(1000);
404
 
51 holgerb 405
 RotBlink(anz);
406
 uart_putchar('.');
50 holgerb 407
}
408
 
409
//############################################################################
1 ingob 410
//
411
unsigned char SollwertErmittlung(void)
412
//############################################################################
413
{
414
    static unsigned int sollwert = 0;
415
    unsigned int ppm;
416
    if(!I2C_Timeout)   // bei Erreichen von 0 ist der Wert ungültig
417
        {
418
        if(SIO_Timeout)  // es gibt gültige SIO-Daten
419
            {
50 holgerb 420
             sollwert =  (MAX_PWM * (unsigned int) SIO_Sollwert) / 200;  // skalieren auf 0-200 = 0-255
421
             PPM_Betrieb = 0;
422
             ICP_INT_DISABLE;
423
             PORTC &= ~ROT;
1 ingob 424
            }
425
        else
50 holgerb 426
            if(anz_ppm_werte > 20)  // es gibt gültige PPM-Daten
1 ingob 427
                {
50 holgerb 428
                PPM_Betrieb = 1;
1 ingob 429
                ppm = PPM_Signal;
430
                if(ppm > 300) ppm =   0;  // ungültiges Signal
431
                if(ppm > 200) ppm = 200;
432
                if(ppm <= MIN_PPM) sollwert = 0;
433
                else
434
                    {
435
                    sollwert = (int) MIN_PWM + ((MAX_PWM - MIN_PWM) * (ppm - MIN_PPM)) / (190 - MIN_PPM);
436
                    }
437
                PORTC &= ~ROT;
438
                }
439
            else   // Kein gültiger Sollwert
440
                {
50 holgerb 441
                 if(!TEST_SCHUB) { if(sollwert) sollwert--; }  
442
                 PORTC |= ROT;
1 ingob 443
                }
444
        }
445
    else // I2C-Daten sind gültig
446
        {
447
        sollwert = I2C_RXBuffer;
50 holgerb 448
        PPM_Betrieb = 0;
1 ingob 449
        PORTC &= ~ROT;
50 holgerb 450
        ICP_INT_DISABLE;
1 ingob 451
        }
452
    if(sollwert > MAX_PWM) sollwert = MAX_PWM;
453
    return(sollwert);
454
}
455
 
456
void DebugAusgaben(void)
457
{
458
    DebugOut.Analog[0] = Strom;
459
    DebugOut.Analog[1] = Mittelstrom;
460
    DebugOut.Analog[2] = SIO_Drehzahl;
461
    DebugOut.Analog[3] = PPM_Signal;
462
}
463
 
464
 
465
//############################################################################
466
//Hauptprogramm
467
int main (void)
468
//############################################################################
469
{
470
    char altPhase = 0;
471
    int test = 0;
472
    unsigned int MinUpmPulse,Blink,TestschubTimer;
473
    unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;
474
 
475
    DDRC  = 0x08;
476
    PORTC = 0x08;
477
    DDRD  = 0xBA;
26 ingob 478
    PORTD = 0x00;
1 ingob 479
    DDRB  = 0x0E;
480
    PORTB = 0x31;
24 ingob 481
 
482
#if (MOTORADRESSE == 0)
483
    PORTB |= (ADR1 + ADR2);   // Pullups für Adresswahl
43 holgerb 484
    for(test=0;test<500;test++);
24 ingob 485
    if (PINB & ADR1)
486
         {
487
           if (PINB & ADR2) MotorAdresse = 1;
488
            else MotorAdresse = 2;
489
         }
490
         else
491
         {
492
           if (PINB & ADR2) MotorAdresse = 3;
493
            else MotorAdresse = 4;
494
         }
495
#else
496
    MotorAdresse  = MOTORADRESSE;
497
#endif
1 ingob 498
 
499
    UART_Init();
500
    Timer0_Init();
50 holgerb 501
    sei();//Globale Interrupts Einschalten
1 ingob 502
 
503
    // Am Blinken erkennt man die richtige Motoradresse
50 holgerb 504
/*
1 ingob 505
    for(test=0;test<5;test++)
506
        {
24 ingob 507
        if(test == MotorAdresse) PORTD |= GRUEN;
1 ingob 508
        Delay_ms(150);
509
        PORTD &= ~GRUEN;
510
        Delay_ms(250);
511
        }      
512
 
513
    Delay_ms(500);
50 holgerb 514
*/  
18 ingob 515
   // UART_Init();  // war doppelt
1 ingob 516
    PWM_Init();
517
 
518
    InitIC2_Slave(0x50);                           
519
    InitPPM();
520
 
521
    Blink             = SetDelay(101);    
522
    Blink2            = SetDelay(102);
523
    MinUpmPulse       = SetDelay(103);
524
    MittelstromTimer  = SetDelay(254);
525
    DrehzahlMessTimer = SetDelay(1005);
526
    TestschubTimer    = SetDelay(1006);
50 holgerb 527
    while(!CheckDelay(MinUpmPulse))
528
    {
529
     if(SollwertErmittlung()) break;
530
    }
531
    ;
1 ingob 532
    PORTD |= GRUEN;
533
    PWM = 0;
534
 
535
    SetPWM();
536
 
537
    SFIOR = 0x08;  // Analog Comperator ein
538
    ADMUX = 1;
539
 
540
    MinUpmPulse = SetDelay(10);
541
    DebugOut.Analog[1] = 1;
542
    PPM_Signal = 0;
543
 
50 holgerb 544
    if(!SollwertErmittlung()) MotorTon();
545
 
1 ingob 546
    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
547
    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder
548
 
549
    while (1)
550
        {
51 holgerb 551
//ShowSense();
552
 
1 ingob 553
        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
554
        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
555
        if(MANUELL_PWM)   PWM = MANUELL_PWM;
556
 
557
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
558
        if(Phase != altPhase)   // es gab eine Kommutierung im Interrupt
559
            {
560
            MotorGestoppt = 0;
561
            ZeitFuerBerechnungen = 0;    // direkt nach einer Kommutierung ist Zeit 
562
            MinUpmPulse = SetDelay(50);  // Timeout, falls ein Motor stehen bleibt
563
            altPhase = Phase;
564
            }
565
        // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
566
        if(!PWM)    // Sollwert == 0
567
            {
568
            MotorAnwerfen = 0;      // kein Startversuch
569
            ZeitFuerBerechnungen = 0;
570
            // nach 1,5 Sekunden den Motor als gestoppt betrachten 
18 ingob 571
            if(CheckDelay(MotorGestopptTimer))
1 ingob 572
                {
573
                DISABLE_SENSE_INT;
574
                MotorGestoppt = 1;  
575
                STEUER_OFF;
576
                }
577
            }
578
        else
579
            {
580
            if(MotorGestoppt) MotorAnwerfen = 1;        // Startversuch
581
            MotorGestopptTimer = SetDelay(1500);
582
            }
583
 
584
        if(MotorGestoppt && !TEST_SCHUB) PWM = 0;
585
        SetPWM();
586
        // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
587
        if(!ZeitFuerBerechnungen++)
588
            {
589
            if(MotorGestoppt) PORTD |= GRUEN; //else PORTD &= ~GRUEN;
590
            if(SIO_DEBUG)
591
                {
592
                DebugAusgaben();  // welche Werte sollen angezeigt werden?
593
                if(!UebertragungAbgeschlossen)  SendUart();
594
                else DatenUebertragung();
595
                }
596
            // Berechnen des Mittleren Stroms zur (langsamen) Strombegrenzung
597
            if(CheckDelay(MittelstromTimer))  
598
                {
599
                MittelstromTimer = SetDelay(50); // alle 50ms
600
                if(Mittelstrom <  Strom) Mittelstrom++;// Mittelwert des Stroms bilden
601
                else if(Mittelstrom >  Strom) Mittelstrom--;
602
 
603
                if(Mittelstrom > LIMIT_STROM)// Strom am Limit?
604
                    {
605
                    MaxPWM--;// dann die Maximale PWM herunterfahren
606
                    PORTC |= ROT;
607
                    }
608
                else
609
                    {
610
                    if(MaxPWM < MAX_PWM) MaxPWM++;
611
                    }
612
                }
613
 
614
            if(CheckDelay(DrehzahlMessTimer))   // Ist-Drehzahl bestimmen
615
                {
616
                DrehzahlMessTimer = SetDelay(10);
617
                SIO_Drehzahl = (6 * CntKommutierungen) / (POLANZAHL / 2);
618
                CntKommutierungen = 0;
619
                if(PPM_Timeout == 0) // keine PPM-Signale
620
                ZeitZumAdWandeln = 1;
621
                }
622
 
623
 
624
            if(CheckDelay(TestschubTimer))  
625
                {
626
                TestschubTimer = SetDelay(1500);
627
                if(TEST_SCHUB)
628
                    {
629
                    switch(test)
630
                        {
631
                        case 0: PWM = 50; test++; break;
632
                        case 1: PWM = 130; test++; break;
633
                        case 2: PWM = 60;  test++; break;
634
                        case 3: PWM = 140; test++; break;
635
                        case 4: PWM = 150; test = 0; break;
636
                        default: test = 0;
637
                        }
638
                    }
639
                }
640
            // Motor Stehen geblieben
641
            if((CheckDelay(MinUpmPulse) && SIO_Drehzahl == 0) || MotorAnwerfen)
642
                {
643
                MotorGestoppt = 1;    
644
                DISABLE_SENSE_INT;
645
                MinUpmPulse = SetDelay(100);        
646
                if(MotorAnwerfen)
647
                    {
648
                    PORTC &= ~ROT;
649
                    MotorAnwerfen = 0;
650
                    Anwerfen(10);
651
                    PORTD |= GRUEN;
652
                    MotorGestoppt = 0;    
653
                    Phase--;
654
                    PWM = 1;
655
                    SetPWM();
656
                    SENSE_TOGGLE_INT;
657
                    ENABLE_SENSE_INT;
43 holgerb 658
                    MinUpmPulse = SetDelay(20);
1 ingob 659
                    while(!CheckDelay(MinUpmPulse)); // kurz Synchronisieren
43 holgerb 660
                    PWM = 15;
1 ingob 661
                    SetPWM();
43 holgerb 662
                    MinUpmPulse = SetDelay(300);
1 ingob 663
                    while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten
18 ingob 664
 
665
                                    // Drehzahlmessung wieder aufsetzen
666
                    DrehzahlMessTimer = SetDelay(50);
1 ingob 667
                    altPhase = 7;
668
                    }
669
                }
670
            } // ZeitFuerBerechnungen
671
        } // while(1) - Hauptschleife
672
}
673