/tags/V0.35/BLMC.c |
---|
0,0 → 1,202 |
/*############################################################################ |
+ Regler für Brushless-Motoren |
+ ATMEGA8 mit 8MHz |
+ (c) 01.2007 Holger Buss |
+ Nur für den privaten Gebrauch |
+ Keine Garantie auf Fehlerfreiheit |
+ Kommerzielle Nutzung nur mit meiner Zustimmung |
+ Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden |
+ www.mikrocontroller.com |
############################################################################*/ |
#include "main.h" |
volatile unsigned char Phase = 0,ShadowTCCR1A = 0; |
volatile unsigned char CompFreigabeTimer = 100; |
volatile unsigned char CompInterruptFreigabe = 0; |
//############################################################################ |
// |
SIGNAL(SIG_OVERFLOW2) |
//############################################################################ |
{ |
} |
//############################################################################ |
// + Interruptroutine |
// + Wird durch den Analogkomperator ausgelöst |
// + Dadurch wird das Kommutieren erzeugt |
SIGNAL(SIG_COMPARATOR) |
//############################################################################ |
{ |
unsigned char sense = 0; |
do |
{ |
if(SENSE_H) sense = 1; else sense = 0; |
switch(Phase) |
{ |
case 0: |
STEUER_A_H; |
if(sense) |
{ |
STEUER_C_L; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_FALLING_INT; |
SENSE_B; |
Phase++; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_B_L; |
} |
break; |
case 1: |
STEUER_C_L; |
if(!sense) |
{ |
STEUER_B_H; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_A; |
SENSE_RISING_INT; |
Phase++; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_A_H; |
} |
break; |
case 2: |
STEUER_B_H; |
if(sense) |
{ |
STEUER_A_L; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_C; |
SENSE_FALLING_INT; |
Phase++; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_C_L; |
} |
break; |
case 3: |
STEUER_A_L; |
if(!sense) |
{ |
STEUER_C_H; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_B; |
SENSE_RISING_INT; |
Phase++; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_B_H; |
} |
break; |
case 4: |
STEUER_C_H; |
if(sense) |
{ |
STEUER_B_L; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_A; |
SENSE_FALLING_INT; |
Phase++; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_A_L; |
} |
break; |
case 5: |
STEUER_B_L; |
if(!sense) |
{ |
STEUER_A_H; |
if(!PPM_Betrieb) TCNT1 = 1; |
TCNT2 = 1; |
if(ZeitZumAdWandeln) AdConvert(); |
SENSE_C; |
SENSE_RISING_INT; |
Phase = 0; |
CntKommutierungen++; |
} |
else |
{ |
STEUER_C_H; |
} |
break; |
} |
} |
while((SENSE_L && sense) || (SENSE_H && !sense)); |
ZeitZumAdWandeln = 0; |
} |
//############################################################################ |
// |
void Manuell(void) |
//############################################################################ |
{ |
switch(Phase) |
{ |
case 0: |
STEUER_A_H; |
STEUER_B_L; |
SENSE_C; |
SENSE_RISING_INT; |
break; |
case 1: |
STEUER_A_H; |
STEUER_C_L; |
SENSE_B; |
SENSE_FALLING_INT; |
break; |
case 2: |
STEUER_B_H; |
STEUER_C_L; |
SENSE_A; |
SENSE_RISING_INT; |
break; |
case 3: |
STEUER_B_H; |
STEUER_A_L; |
SENSE_C; |
SENSE_FALLING_INT; |
break; |
case 4: |
STEUER_C_H; |
STEUER_A_L; |
SENSE_B; |
SENSE_RISING_INT; |
break; |
case 5: |
STEUER_C_H; |
STEUER_B_L; |
SENSE_A; |
SENSE_FALLING_INT; |
break; |
} |
} |
/tags/V0.35/BLMC.h |
---|
0,0 → 1,93 |
/*############################################################################ |
############################################################################*/ |
#ifndef BLMC_H_ |
#define BLMC_H_ |
extern volatile unsigned char Phase; |
extern volatile unsigned char ShadowTCCR1A; |
extern volatile unsigned char CompInterruptFreigabe; |
void Blc(void); |
void Manuell(void); |
// anselm |
/* |
#define COM1A ((0 << COM1A0) | (1 << COM1A1)) // COM1A-> OC1A non inverting mode |
#define COM1B ((0 << COM1B0) | (1 << COM1B1)) // COM1B-> OC1B non inverting mode |
#define COM2 ((0 << COM20) | (1 << COM21)) // COM2-> OC2 non inverting mode |
#ifdef _32KHZ |
#define WGM1 ((1 << WGM10) | (0 << WGM11)) // WGM10:13-> fast PWM 8bit |
#define WGMCS2 ((1 << WGM20) | (1 << WGM21) | (1 << CS20)) // WGM20:21-> fast PWM, no prescale |
#endif |
#ifdef _16KHZ |
#define WGM1 ((1 << WGM10) | (0 << WGM11)) // WGM10:13-> phase corr, PWM 8bit |
#define WGMCS2 ((1 << WGM20) | (0 << WGM21) | (1 << CS20)) // WGM20:21-> phase corr. PWM, no prescale |
#endif |
#define PWM_C_ON {TCCR1A = COM1A | WGM1 | COM1B; TCCR2 = WGMCS2; |
DDRB = 0x02;} // Steuer_C+ output |
#define PWM_B_ON {TCCR1A = COM1B | WGM1 | COM1A; TCCR2 = WGMCS2; \ |
DDRB = 0x04;} // Steuer_B+ output |
#define PWM_A_ON {TCCR1A = WGM1; TCCR2 = COM2 | WGMCS2; \ |
DDRB = 0x08;} // Steuer_A+ output |
#define PWM_OFF {TCCR1A = WGM1; \ |
TCCR2 = WGMCS2; \ |
PORTB &= ~0x0E; DDRB = 0x0E;} // OC1x & OC2 disconnected, Steuer_X+ output low |
// anselm |
*/ |
#ifdef _32KHZ |
#define PWM_C_ON {TCCR1A = 0xAD; TCCR2 = 0x49;DDRB = 0x0A;} |
#define PWM_B_ON {TCCR1A = 0xAD; TCCR2 = 0x49;DDRB = 0x0C;} |
#define PWM_A_ON {TCCR1A = 0xAD; TCCR2 = 0x69;DDRB = 0x08;} |
#define PWM_OFF {TCCR1A = 0x0D; TCCR2 = 0x49;PORTC &= ~0x0E;} |
#endif |
#ifdef _16KHZ |
// #define PWM_C_ON {TCCR1A = 0xA2; TCCR2 = 0x41; DDRB = 0x0A;} |
// #define PWM_B_ON {TCCR1A = 0xA2; TCCR2 = 0x41; DDRB = 0x0C;} |
// #define PWM_A_ON {TCCR1A = 0xA2; TCCR2 = 0x61; DDRB = 0x08;} |
#define PWM_C_ON {TCCR2 = 0x41; if(PPM_Betrieb) { TCCR1A = 0xA1;DDRB = 0x0A;} else { TCCR1A = 0x81; DDRB = 0x0E;}} |
#define PWM_B_ON {TCCR2 = 0x41; if(PPM_Betrieb) { TCCR1A = 0xA1;DDRB = 0x0C;} else { TCCR1A = 0x21; DDRB = 0x0E;}} |
#define PWM_A_ON {TCCR2 = 0x61; if(PPM_Betrieb) { TCCR1A = 0xA1;DDRB = 0x08;} else { TCCR1A = 0x01; DDRB = 0x0E;}} |
// #define PWM_C_ON {TCCR1A = 0x82; TCCR2 = 0x41; PORTB &= ~0x04; DDRB = 0x0E;} |
// #define PWM_B_ON {TCCR1A = 0x22; TCCR2 = 0x41; PORTB &= ~0x02; DDRB = 0x0E;} |
// #define PWM_A_ON {TCCR1A = 0x02; TCCR2 = 0x61; PORTB &= ~0x06; DDRB = 0x0E;} |
#define PWM_OFF {TCCR1A = 0x01; TCCR2 = 0x41; DDRB = 0x0E; PORTB &= ~0x0E;} |
#endif |
#define STEUER_A_H {PWM_A_ON} |
#define STEUER_B_H {PWM_B_ON} |
#define STEUER_C_H {PWM_C_ON} |
#define STEUER_A_L {PORTD &= ~0x30; PORTD |= 0x08;} |
#define STEUER_B_L {PORTD &= ~0x28; PORTD |= 0x10;} |
#define STEUER_C_L {PORTD &= ~0x18; PORTD |= 0x20;} |
#define STEUER_OFF {PORTD &= ~0x38; PWM_OFF; } |
#define FETS_OFF {PORTD &= ~0x38; PORTB &= ~0x0E; } |
#define SENSE_A ADMUX = 0; |
#define SENSE_B ADMUX = 1; |
#define SENSE_C ADMUX = 2; |
#define ClrSENSE ACSR |= 0x10 |
#define SENSE ((ACSR & 0x10)) |
#define SENSE_L (!(ACSR & 0x20)) |
#define SENSE_H ((ACSR & 0x20)) |
#define ENABLE_SENSE_INT {CompInterruptFreigabe = 1;ACSR |= 0x0A; } |
#define DISABLE_SENSE_INT {CompInterruptFreigabe = 0; ACSR &= ~0x08; } |
#define SENSE_FALLING_INT ACSR &= ~0x01 |
#define SENSE_RISING_INT ACSR |= 0x03 |
#define SENSE_TOGGLE_INT ACSR &= ~0x03 |
#endif //BLMC_H_ |
/tags/V0.35/BL_Ctrl.pnproj |
---|
0,0 → 1,0 |
<Project name="avr_ctrl"><File path="uart.h"></File><File path="main.c"></File><File path="main.h"></File><File path="makefile"></File><File path="uart.c"></File><File path="timer0.c"></File><File path="timer0.h"></File><File path="analog.h"></File><File path="analog.c"></File><File path="PPM_Decode.c"></File><File path="PPM_Decode.h"></File><File path="twislave.c"></File><File path="twislave.h"></File><File path="BLMC.c"></File><File path="BLMC.h"></File></Project> |
/tags/V0.35/BL_Ctrl.pnps |
---|
0,0 → 1,0 |
<pd><ViewState><e p="avr_ctrl" x="true"></e></ViewState></pd> |
/tags/V0.35/Doku/Bestueckt_BL-Ctrl_V1_1/BootLoader_MEGA8_8MHZ_V0_2.hex |
---|
0,0 → 1,53 |
:101C000011241FBECFE5D4E0DEBFCDBF10E0A0E6BB |
:101C1000B0E0E0E3FFE102C005900D92A036B1070D |
:101C2000D9F710E0A0E6B0E001C01D92A23AB107DA |
:101C3000E1F714C000C008955D9BFECF8CB90895F4 |
:101C40005F9BFECF8CB1992708958DE4F5DF8BE47F |
:101C5000F3DF82E4F1DF8CE4EFDF0895CFE5D4E039 |
:101C6000DEBFCDBFE0E0F0E004917F01992481B7B1 |
:101C7000885081BF90BC80E189B9599A88E18AB9BE |
:101C800086E880BDEF01192D5F9B0BC0113029F450 |
:101C90008CB18A3A49F110E004C08CB18B3109F45F |
:101CA00011E0CE01219684369105C8F00F3F41F036 |
:101CB000002331F0E0916000F091610009950FC0C0 |
:101CC0008AE0BADF8DE0B8DF86E5B6DF80E3B4DF17 |
:101CD0008EE2B2DF82E3B0DF8AE3AEDF05C080E2EE |
:101CE0009EE40197F1F7D0CFB0DFAADF813611F47F |
:101CF00089E51CC1813461F4A3DFE82EFF24FE2CAA |
:101D0000EE249EDF9927E82AF92AF694E794E1C0A9 |
:101D1000823631F489E590DF80E08EDF80E406C111 |
:101D2000823409F070C08CDF8BDFD82E89DF082F5A |
:101D3000B2E6AB2EB0E0BB2E10E0E5010894A11C8A |
:101D4000B11C1D1510F47CDF01C08FEF88831F5F6D |
:101D5000103498F336E7931609F0C9C0063409F039 |
:101D60003CC08FEFE8168BE1F80608F033C0CD2DAC |
:101D7000A70166277727440F551F661F771F6A0143 |
:101D80007B01A2E6B0E011E08D9199272D913327D8 |
:101D9000322F2227822B932B0C01FA01109357002C |
:101DA000E89511244E5F5F4F6F4F7F4FC25061F730 |
:101DB00085E0F60180935700E89507B600FCFDCF5B |
:101DC00081E180935700E8957695679557954795FB |
:101DD0007A017FC080E030DF7CC0053409F079C033 |
:101DE000F7012D2DA2E6B0E0EEBB8F2F99278FBB18 |
:101DF0008D918DBB3196E29AE19AE199FECF215007 |
:101E000099F77F0166C08736B9F51ADF19DFC82F49 |
:101E100017DF863409F5C701AA27BB276C017D01AE |
:101E2000CC0CDD1CEE1CFF1CF60105911491802FDB |
:101E300003DF812F992700DF82E090E0A0E0B0E08F |
:101E4000C80ED91EEA1EFB1EC25071F7F694E79425 |
:101E5000D794C794760149CF853409F046CFEEBABE |
:101E60008F2D99278FBBE09A0894E11CF11C8DB34C |
:101E7000E3DEC150A1F739CF853601F596E7991613 |
:101E800041F580E090E0A0E0B0E023E0FC01209389 |
:101E90005700E89507B600FCFDCF805C9F4FAF4F21 |
:101EA000BF4F8F3F3BE1930730E0A30730E0B3071C |
:101EB00068F381E180935700E8950BC0853459F4AD |
:101EC00088E190E02CE00FB6F894A89581BD0FBE94 |
:101ED00021BD8DE02BC08035E1F38C34D1F3803708 |
:101EE00011F483E523C0843721F486E7A5DE80E082 |
:101EF0001DC0843519F4A4DE982EEBCF8B3109F484 |
:101F0000F3CE8A3A09F4F0CE863521F480E394DEEC |
:101F100082E30CC0833731F487E08EDE83E98CDE08 |
:101F20008EE104C08B3109F4E0CE8FE385DEDDCE97 |
:0400000300001C00DD |
:00000001FF |