Subversion Repositories BL-Ctrl

Rev

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;