Subversion Repositories BL-Ctrl

Compare Revisions

Ignore whitespace Rev 48 → Rev 52

/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