Subversion Repositories BL-Ctrl

Rev

Rev 50 | Rev 58 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 50 Rev 51
Line 12... Line 12...
12
#include "main.h"
12
#include "main.h"
Line 13... Line 13...
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; //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
19
unsigned int  KommutierDelay = 10;
19
unsigned int  KommutierDelay = 10;
20
unsigned int  I2C_Timeout = 0;
20
unsigned int  I2C_Timeout = 0;
21
unsigned int SIO_Timeout = 0;
21
unsigned int SIO_Timeout = 0;
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 100
148
#define TEST_STROMGRENZE 90
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)
155
       {
155
       {
156
        STEUER_OFF;
156
        FETS_OFF;
157
        return(1);
157
        return(1);
158
       }
158
       }
159
  }
159
  }
160
 return(0);  
160
 return(0);  
Line 161... Line 161...
161
}
161
}
162
 
162
 
163
unsigned char Delay(unsigned int timer)
163
unsigned char Delay(unsigned int timer)
164
{
164
{
-
 
165
 while(timer--)
165
 while(timer--)
166
  {
166
  {
167
//   if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
167
  }
168
  }
Line -... Line 169...
-
 
169
 return(0);  
-
 
170
}
-
 
171
 
-
 
172
void ShowSense(void)
-
 
173
{
-
 
174
 if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
-
 
175
 
-
 
176
}
-
 
177
 
-
 
178
#define HIGH_A_EIN PORTB |= 0x08
-
 
179
#define HIGH_B_EIN PORTB |= 0x04
-
 
180
#define HIGH_C_EIN PORTB |= 0x02
Line 168... Line 181...
168
 return(0);  
181
#define LOW_A_EIN  PORTD |= 0x08
169
}
182
#define LOW_B_EIN  PORTD |= 0x10
170
 
183
#define LOW_C_EIN  PORTD |= 0x20
-
 
184
 
171
 
185
void MotorTon(void)
172
void MotorTon(void)
186
//############################################################################
173
//############################################################################
187
{
-
 
188
    unsigned char ADR_TAB[5] = {0,0,2,1,3};
-
 
189
    unsigned int timer = 300,i;
-
 
190
    unsigned int t = 0;
174
{
191
    unsigned char MosfetKurzschluss = 0, MosfetOkay = 0,anz = 0;
175
    unsigned int timer = 300,i;
192
 
176
    unsigned int t;
-
 
177
    unsigned char MosfetKurzschluss = 0, MosfetOkay = 0,anz = 0;
-
 
178
    DISABLE_SENSE_INT;
-
 
179
    cli();//Globale Interrupts Ausschalten
193
    PORTC &= ~ROT;
180
    PORTC &= ~ROT;
194
    Delay_ms(300 * ADR_TAB[MotorAdresse]);    
181
    PWM = 0;
-
 
182
    SetPWM();
-
 
183
    uart_putchar('\n');
-
 
-
 
195
    DISABLE_SENSE_INT;
184
    STEUER_OFF;
196
    cli();//Globale Interrupts Ausschalten
185
//#define  STEUER_A_L {PORTD &= ~0x30; PORTD |= 0x08;}
197
    uart_putchar('\n');
186
//#define  STEUER_B_L {PORTD &= ~0x28; PORTD |= 0x10;}
198
    STEUER_OFF;
187
//#define  STEUER_C_L {PORTD &= ~0x18; PORTD |= 0x20;}
199
 
188
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
200
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
189
//+ High-Mosfets auf Kurzschluss testen
-
 
190
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
201
//+ High-Mosfets auf Kurzschluss testen
191
    Strom = 0;
202
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
192
    PORTD |= 0x08; // Low  A ein
203
    Strom = 0;
193
    PORTB |= 0x04; // High B ein; und A gegen B
-
 
194
//PORTB |= 0x08; // Test A
204
    LOW_B_EIN;
195
    if(DelayM(3))
205
    HIGH_A_EIN;
196
       {
206
    if(DelayM(3))
197
        MosfetKurzschluss = 0x01;
207
       {
198
        anz = 1;
208
        anz = 1;
199
        uart_putchar('A');
209
        uart_putchar('1');
200
       }
210
       }
201
    STEUER_OFF;
211
    FETS_OFF;
202
    DelayM(100);
-
 
203
    Strom = 0;
212
    Delay(1000);
204
    PORTD |= 0x10; // Low B ein
213
    Strom = 0;
205
    PORTB |= 0x02; // High C ein
214
    LOW_A_EIN;
206
//PORTB |= 0x04; // Test B
-
 
207
    if(DelayM(3))
215
    HIGH_B_EIN;
208
       {
216
    if(DelayM(3))
209
        anz = 2;
217
       {
210
        MosfetKurzschluss = 0x02;
218
        anz = 2;
211
        uart_putchar('B');
219
        uart_putchar('2');
212
       }
220
       }
213
    STEUER_OFF;
221
    FETS_OFF;
214
    DelayM(100);
-
 
215
    Strom = 0;
-
 
216
    PORTD |= 0x20; // Low C ein
222
    Delay(1000);
217
    PORTB |= 0x04; // High B ein
223
    Strom = 0;
218
    //PORTB |= 0x0C; // High A+B ein
224
    LOW_B_EIN; // Low C ein
219
//PORTB |= 0x02; // Test C
-
 
220
    if(DelayM(3))
225
    HIGH_C_EIN; // High B ein
221
       {
226
    if(DelayM(3))
222
        anz = 3;
227
       {
223
        MosfetKurzschluss = 0x04;
228
        anz = 3;
224
        uart_putchar('C');
229
        uart_putchar('3');
225
       }
230
       }
226
    STEUER_OFF;
-
 
227
    DelayM(100);
231
    FETS_OFF;
228
    PORTD |= 0x08; // Low  A ein; und A gegen C
232
    Delay(1000);
229
    PORTB |= 0x02; // High C ein
233
    LOW_A_EIN; // Low  A ein; und A gegen C
230
//PORTB |= 0x08; // Test A
234
    HIGH_C_EIN; // High C ein
231
    if(DelayM(3))
235
    if(DelayM(3))
232
       {
236
       {
233
        anz = 3;
237
        anz = 3;
234
        MosfetKurzschluss = 0x01;
238
        MosfetKurzschluss = 0x01;
235
        uart_putchar('C');
239
        uart_putchar('7');
-
 
240
       }
236
       }
241
    FETS_OFF;
237
    STEUER_OFF;
242
    DelayM(10000);
238
    DelayM(100);
243
if(anz) while(1) RotBlink(anz);  // bei Kurzschluss nicht starten
-
 
244
 
239
 if(anz) while(1) RotBlink(anz);
245
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
240
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
246
//+ LOW-Mosfets auf Schalten und Kurzschluss testen
-
 
247
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
241
//+ Low-Mosfets auf Kurzschluss testen
248
 if(UDR == ' ') {t = 65535; uart_putchar('_');} else t = 1000; // Ausführlicher Test
242
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
249
 Strom = 0;
243
    Strom = 0;
250
 for(i=0;i<t;i++)
244
    PORTB |= 0x08; // Test A
251
 {
-
 
252
  LOW_A_EIN;
245
//PORTD |= 0x08; // Low A ein   
253
  DelayM(1);
-
 
254
  FETS_OFF;
246
    if(DelayM(3))
255
  Delay(5);
247
       {
256
  HIGH_A_EIN;
-
 
257
  DelayM(1);
248
        anz = 4;
258
  FETS_OFF;
-
 
259
  if(Strom > 40) {anz = 4; uart_putchar('4'); break;}
249
        MosfetKurzschluss = 0x01;
260
  Delay(5);
250
        uart_putchar('a');
261
 }
-
 
262
 Delay(10000);
251
       }
263
 
252
    STEUER_OFF;
264
 Strom = 0;
253
    Strom = 0;
265
 for(i=0;i<t;i++)
254
    PORTB |= 0x04; // Test B
266
 {
255
//PORTD |= 0x10; // Low B ein
267
  LOW_B_EIN;
256
    if(DelayM(3))
268
  DelayM(1);
257
       {
269
  FETS_OFF;
-
 
270
  Delay(5);
258
        anz = 5;
271
  HIGH_B_EIN;
-
 
272
  DelayM(1);
-
 
273
  FETS_OFF;
259
        MosfetKurzschluss = 0x02;
274
  if(Strom > 40) {anz = 5; uart_putchar('5'); break;}
260
        uart_putchar('b');
275
  Delay(5);
-
 
276
 }
261
       }
277
 
-
 
278
 Strom = 0;
-
 
279
 Delay(10000);
262
    STEUER_OFF;
280
 
263
    Strom = 0;
281
 for(i=0;i<t;i++)
264
    PORTB |= 0x02; // Test C
282
 {
265
//PORTD |= 0x20; // Low C ein
283
  LOW_C_EIN;
266
    if(DelayM(3))
284
  DelayM(1);
267
       {
285
  FETS_OFF;
-
 
286
  Delay(5);
268
        anz = 6;
287
  HIGH_C_EIN;
269
        MosfetKurzschluss = 0x04;
288
  DelayM(1);
270
        uart_putchar('c');
-
 
Line 271... Line 289...
271
       }
289
  FETS_OFF;
272
    STEUER_OFF;
290
  if(Strom > 40) {anz = 6; uart_putchar('6'); break;}
273
 
291
  Delay(5);
274
 if(anz) while(1) RotBlink(anz);
292
 }
275
 
293
 
276
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
294
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
277
//+ High-Mosfets auf Schalten testen
295
//+ High-Mosfets auf Schalten testen
278
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
296
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
279
    SENSE_A;
297
    SENSE_A;
280
    STEUER_OFF;
298
    FETS_OFF;
-
 
299
    LOW_B_EIN; // Low B ein
281
    PORTD |= 0x10; // Low B ein
300
    LOW_C_EIN; // Low C ein
-
 
301
    Strom = 0;
-
 
302
#define TONDAUER  40000    
282
    PORTD |= 0x20; // Low C ein
303
#define SOUND_E 2
283
    Strom = 0;
304
#define SOUND1_A 300
284
#define TONDAUER  100000    
305
#define SOUND2_A 330
285
#define SOUND_E 5
306
#define SOUND3_A 360
286
#define SOUND2_A 500
307
 
287
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
308
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
288
     {
309
     {
289
      PORTB |= 0x08; // Test A
310
      HIGH_A_EIN; // Test A
290
      Delay(SOUND_E);
311
      Delay(SOUND_E);
291
      if(SENSE_L) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;}
312
      if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;};
292
      PORTB = 0;
313
      PORTB = 0;
293
      Delay(SOUND2_A);
314
      Delay(SOUND1_A);
294
     }
-
 
295
    STEUER_OFF;
315
     }
296
    SENSE_B;
316
    FETS_OFF;
297
    PORTD |= 0x08; // Low A ein
317
 
298
    PORTD |= 0x20; // Low C ein
318
    LOW_A_EIN; // Low A ein
299
#define SOUND1_A 600
319
    LOW_C_EIN; // Low C ein
300
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
320
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
301
     {
321
     {
302
      PORTB |= 0x04; // Test B
322
      HIGH_B_EIN; // Test B
Line 303... Line 323...
303
      Delay(SOUND_E);
323
      Delay(SOUND_E);
304
      if(SENSE_L) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;}
-
 
305
      PORTB = 0;
324
      if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;};
306
      Delay(SOUND1_A);
325
      PORTB = 0;
307
     }
-
 
308
 
326
      Delay(SOUND1_A);
309
    STEUER_OFF;
327
     }
310
    SENSE_C;
328
 
311
    PORTD |= 0x08; // Low A ein
329
    FETS_OFF;
312
    PORTD |= 0x10; // Low B ein
330
    LOW_A_EIN; // Low A ein
313
#define SOUND3_A  700
331
    LOW_B_EIN; // Low B ein
314
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
332
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
315
     {
333
     {
316
      PORTB |= 0x02; // Test C
334
      HIGH_C_EIN; // Test C
317
      Delay(SOUND_E);
335
      Delay(SOUND_E);
318
      if(SENSE_L) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;}
336
      if(MessAD(2) > 50) { MosfetOkay |= 0x04; } else { MosfetOkay &= ~0x04;};
319
      PORTB = 0;
337
      PORTB = 0;
320
      Delay(SOUND3_A);
338
      Delay(SOUND2_A);
321
     }
339
     }
322
    STEUER_OFF;
340
    FETS_OFF;
323
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
341
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
324
//+ Low-Mosfets auf Schalten testen
342
//+ Low-Mosfets auf Schalten testen
325
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
343
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
326
    SENSE_B;
344
    SENSE_B;
327
    PORTD |= 0x08; // Low A ein
345
    LOW_A_EIN; // Low A ein
328
#define SOUND2_A 500
346
#define SOUND2_A 500
329
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
347
    for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
330
     {
348
     {
331
      PORTB |= 0x04; // Test B
349
      HIGH_B_EIN; // Test B
332
      Delay(SOUND_E);
350
      Delay(SOUND_E);
333
      if(SENSE_L) { MosfetOkay |= 0x08; } else { MosfetOkay &= ~0x08;}    
-
 
334
      PORTB = 0;
351
      if(MessAD(0) > 50) { MosfetOkay &= ~0x08;} else { MosfetOkay |= 0x08;};
335
      Delay(SOUND2_A);
352
      PORTB = 0;
336
     }
353
      Delay(SOUND2_A);
337
 
354
     }
338
    STEUER_OFF;
355
 
339
    SENSE_C;
356
//++++++++++++++++++++++++++++++++++++
340
    PORTD |= 0x10; // Low B ein
357
    LOW_C_EIN; // Low C ein
341
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
358
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
342
     {
359
     {
343
      PORTB |= 0x02; // Test C
-
 
344
      Delay(SOUND_E);
360
      HIGH_B_EIN; // Test B
-
 
361
      Delay(SOUND_E);
345
      if(SENSE_L) { MosfetOkay |= 0x10; } else { MosfetOkay &= ~0x10;}    
362
      if(MessAD(2) > 50) { MosfetOkay &= ~0x20;} else { MosfetOkay |= 0x20;};
346
      PORTB = 0;
363
      PORTB = 0;
347
      Delay(SOUND3_A);
364
      Delay(SOUND3_A);
348
     }
365
     }
349
 
366
    FETS_OFF;
350
    STEUER_OFF;
367
//++++++++++++++++++++++++++++++++++++
351
    SENSE_B;
368
    FETS_OFF;
352
    PORTD |= 0x20; // Low C ein
369
    LOW_B_EIN; // Low B ein
353
    for(i=0; i<(TONDAUER / SOUND1_A); i++)
370
    for(i=0; i<(TONDAUER / SOUND3_A); i++)
354
     {
371
     {
-
 
372
      HIGH_C_EIN; // Test C
-
 
373
      Delay(SOUND_E);
Line -... Line 374...
-
 
374
      if(MessAD(1) > 50) { MosfetOkay &= ~0x10;} else { MosfetOkay |= 0x10;};
355
      PORTB |= 0x04; // Test B
375
      PORTB = 0;
356
      Delay(SOUND_E);
376
      Delay(SOUND3_A);
357
      if(SENSE_L) { MosfetOkay |= 0x20; } else { MosfetOkay &= ~0x20;}      
377
     }
358
      PORTB = 0;
378
    FETS_OFF;
359
      Delay(SOUND1_A);
379
//++++++++++++++++++++++++++++++++++++
360
     }
380
 
361
 
381
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
362
    sei();//Globale Interrupts Einschalten
382
    sei();//Globale Interrupts Einschalten
-
 
383
//    Delay_ms(250 * MotorAdresse);    
-
 
384
/*
363
    Delay_ms(250 * MotorAdresse);    
385
    LOW_A_EIN; // Low B ein
364
 
386
#define SOUND8_A 650
365
#define SOUND8_E 7
387
    for(i=0; i<(TONDAUER / SOUND8_A); i++)
366
#define SOUND8_A 650
388
     {
367
    for(i=0; i<(TONDAUER / SOUND8_A); i++)
389
      HIGH_B_EIN; // Test B
368
     {
390
      Delay(SOUND_E);
369
      for(timer = 0; timer < SOUND8_E; timer++) PORTB |= 0x04; // Test B
391
      PORTB = 0;
370
      for(timer = 0; timer < SOUND8_A; timer++) PORTB = 0;
392
      Delay(SOUND8_A);
371
     }
393
     }
372
 
394
*/
Line 373... Line 395...
373
 if(!(MosfetOkay & 0x01))  { anz = 1; uart_putchar('A'); } else
395
 if(!(MosfetOkay & 0x01))  { anz = 1; uart_putchar('A'); } else
Line 374... Line -...
374
 if(!(MosfetOkay & 0x02))  { anz = 2; uart_putchar('B'); } else
-
 
375
 if(!(MosfetOkay & 0x04))  { anz = 3; uart_putchar('C'); } else
-
 
376
 if(!(MosfetOkay & 0x08))  { anz = 4; uart_putchar('a'); } else
-
 
377
 if(!(MosfetOkay & 0x10))  { anz = 5; uart_putchar('b'); } else
-
 
378
 if(!(MosfetOkay & 0x20))  { anz = 6; uart_putchar('c'); }  
396
 if(!(MosfetOkay & 0x02))  { anz = 2; uart_putchar('B'); } else
379
 Delay_ms(250 * (4-MotorAdresse));    
-
 
380
 
-
 
381
 if(MosfetOkay != 0x3f) Delay_ms(1000);
-
 
382
 
-
 
383
#define TONDAUER  80000    
-
 
384
#define SOUND9_E 20
-
 
385
#define SOUND9_A 500
-
 
386
 
-
 
387
 while(anz--)
-
 
388
  {
-
 
389
   PORTC |= ROT;
-
 
390
    if(!(MosfetOkay & 0x04) || !(MosfetOkay & 0x20))  // Schalter C defekt
-
 
391
     {
-
 
392
     PORTD |= 0x10; // Low B ein
-
 
393
     for(i=0; i< (TONDAUER / SOUND9_A) ; i++)
-
 
394
      {
-
 
395
       for(timer = 0; timer < SOUND9_E; timer++) PORTB |= 0x08; // Test A
-
 
396
       for(timer = 0; timer < SOUND9_A; timer++) PORTB = 0;
-
 
397
      }
-
 
398
     }
-
 
399
    else
-
 
400
    if(!(MosfetOkay & 0x02) || !(MosfetOkay & 0x10)) // Schalter B defekt
-
 
401
     {
-
 
402
     PORTD |= 0x20; // Low C ein
-
 
403
     for(i=0; i< (TONDAUER / SOUND9_A) ; i++)
-
 
404
      {
-
 
405
       for(timer = 0; timer < SOUND9_E; timer++) PORTB |= 0x08; // Test A
-
 
406
       for(timer = 0; timer < SOUND9_A; timer++) PORTB = 0;
-
 
407
      }
-
 
408
     }
-
 
409
    else
-
 
410
    if(!(MosfetOkay & 0x01) || !(MosfetOkay & 0x08)) // Schalter A defekt
-
 
411
     {
397
 if(!(MosfetOkay & 0x04))  { anz = 3; uart_putchar('C'); } else
412
     PORTD |= 0x20; // Low C ein
-
 
413
     for(i=0; i< (TONDAUER / SOUND9_A) ; i++)
398
 if(!(MosfetOkay & 0x08))  { anz = 4; uart_putchar('a'); } else
Line 414... Line 399...
414
      {
399
 if(!(MosfetOkay & 0x10))  { anz = 5; uart_putchar('b'); } else
415
       for(timer = 0; timer < SOUND9_E; timer++) PORTB |= 0x04; // Test B
400
 if(!(MosfetOkay & 0x20))  { anz = 6; uart_putchar('c'); }  
416
       for(timer = 0; timer < SOUND9_A; timer++) PORTB = 0;
401
 Delay_ms(300 * (4-ADR_TAB[MotorAdresse]));    
Line 561... Line 546...
561
    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
546
    // zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung
562
    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder
547
    if(TEST_MANUELL)    Anwerfen(TEST_MANUELL);  // kommt von dort nicht wieder
Line 563... Line 548...
563
 
548
 
564
    while (1)
549
    while (1)
-
 
550
        {
-
 
551
//ShowSense();
565
        {
552
 
566
        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
553
        if(!TEST_SCHUB)   PWM = SollwertErmittlung();
567
        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
554
        //I2C_TXBuffer = PWM; // Antwort über I2C-Bus
Line 568... Line 555...
568
        if(MANUELL_PWM)   PWM = MANUELL_PWM;
555
        if(MANUELL_PWM)   PWM = MANUELL_PWM;