/trunk/Doku/_BL_Ctrl_History.txt |
---|
28,4 → 28,9 |
- Es hatte sich ein Fehler in der Umrechnung des seriellen Wertes (X-3D) eingeschlichen; das ist hier behoben |
Mittels eines PC-Programms (SimTxData.exe) kann das X-3D-Protokoll simuliert und so die Motoren angefahren werden |
V0.32 22.8.2007 - IB |
- Serielle Empfangsroutine eingefügt |
es wird das Resetkommando für ein Bootloader-Update ausgeführt |
- Timerabfragen korrigiert (Wiederanlauf) |
- Versionsausgabe beim Start |
- Screenshot für PonyProg aktualisert (jetzt mit 2,7V Brownout) |
/trunk/Doku/_Files.txt |
---|
1,12 → 1,16 |
Files: |
BrushLess-Ctrl_16kHz_Vx_xx.hex --> Software für 16kHz |
BrushLess-Ctrl_32kHz_Vx_xx.hex --> Software für 32kHz |
BrushLess-Ctrl_16kHz_ADRy_Vx_xx.hex --> Software für I2C und für X3D mit serieller Ausgabe 38400Bd (Motoradresse = y) |
Dateien: |
-------- |
BootLoader_MEGA8_8MHZ_Vx_y.hex --> Bootloader für BL-Ctrl (Fusebits beachten !) |
BrushLess-Ctrl_16kHz_ADR_Vx_xx.hex --> Software für ADR=Motorposition(1 bis 4) (16kHz-PWM) |
Testprogramme (Achtung: Motor läuft an!) |
----------------------------------------- |
Test_Manuell_BrushLess-Ctrl_Vx_xx.hex --> Regler läuft ungeregelt mit fester Frequenz |
Test_Schub_BrushLess-Ctrl_Vx_xx.hex --> Regler läuft mit unterschiedlichen Leistungen |
Test_Sollwert_Fix_BrushLess-Ctrl_Vx_xx.hex --> Regler läuft fix mit 7,8% PWM |
Sonstiges: |
Fuses_Mega8_8MHZ_Intern.gif --> Fusebits von Ponyprog |
---------- |
Fuses_Mega8_8MHZ_*.gif --> Fusebits von Ponyprog (mit und ohne Bootloader) |
/trunk/main.c |
---|
198,7 → 198,7 |
Delay_ms(500); |
UART_Init(); |
// UART_Init(); // war doppelt |
PWM_Init(); |
InitIC2_Slave(0x50); |
246,7 → 246,7 |
MotorAnwerfen = 0; // kein Startversuch |
ZeitFuerBerechnungen = 0; |
// nach 1,5 Sekunden den Motor als gestoppt betrachten |
if(CheckDelay(DrehzahlMessTimer)) |
if(CheckDelay(MotorGestopptTimer)) |
{ |
DISABLE_SENSE_INT; |
MotorGestoppt = 1; |
339,7 → 339,9 |
SetPWM(); |
MinUpmPulse = SetDelay(200); |
while(!CheckDelay(MinUpmPulse)); // kurz Durchstarten |
MinUpmPulse = SetDelay(1000); |
// Drehzahlmessung wieder aufsetzen |
DrehzahlMessTimer = SetDelay(50); |
altPhase = 7; |
} |
} |
/trunk/main.h |
---|
12,17 → 12,23 |
#define FILTER_PPM 7 // wie stark soll das PPM-Signal gefiltert werden (Werte: 0-30)? |
#define SIO_DEBUG 0 // Testwertausgaben auf der seriellen Schnittstelle |
#define X3D_SIO 1 // serielles Protokoll des X3D (38400Bd) Achtung: dann muss SIO_DEBUG = 0 sein |
#define X3D_SIO 0 // serielles Protokoll des X3D (38400Bd) Achtung: dann muss SIO_DEBUG = 0 sein |
#define _16KHZ // Schaltfrequenz -- die gewünschte einkommentieren |
//#define _32KHZ // Schaltfrequenz -- die gewünschte einkommentieren |
#define FDD6637_IRLR7843 0 // bessere MosFet bestückt? bewirkt höhere Stromgrenzen |
#ifdef _16KHZ |
#ifdef FDD6637_IRLR7843 // bessere Fets = mehr Strom zulassen |
#define MAX_STROM 200 // ab ca. 20A PWM ausschalten |
#define LIMIT_STROM 120 // ab ca. 12A PWM begrenzen |
#else |
#define MAX_STROM 130 // ab ca. 13A PWM ausschalten |
#define LIMIT_STROM 65 // ab ca. 6,5A PWM begrenzen |
#endif |
#endif |
#ifdef _32KHZ |
#define MAX_STROM 130 // ab ca. 13A PWM ausschalten |
/trunk/makefile |
---|
3,7 → 3,7 |
MCU = atmega8 |
#------------------------------------------------------------------- |
HAUPT_VERSION = 0 |
NEBEN_VERSION = 31 |
NEBEN_VERSION = 32 |
#------------------------------------------------------------------- |
# Output format. (can be srec, ihex, binary) |
/trunk/uart.c |
---|
60,8 → 60,9 |
SIGNAL(INT_VEC_RX) |
{ |
static unsigned char serPacketCounter = 100; |
#if X3D_SIO == 1 |
SioTmp = UDR; |
#if X3D_SIO == 1 |
if(SioTmp == 0xF5) // Startzeichen |
{ |
serPacketCounter = 0; |
78,6 → 79,58 |
if(serPacketCounter > 100) serPacketCounter = 100; |
} |
} |
#else |
static unsigned int crc; |
static unsigned char crc1,crc2,buf_ptr; |
static unsigned char UartState = 0; |
unsigned char CrcOkay = 0; |
SioTmp = UDR; |
if(buf_ptr >= MAX_EMPFANGS_BUFF) UartState = 0; |
if(SioTmp == '\r' && UartState == 2) |
{ |
UartState = 0; |
crc -= RxdBuffer[buf_ptr-2]; |
crc -= RxdBuffer[buf_ptr-1]; |
crc %= 4096; |
crc1 = '=' + crc / 64; |
crc2 = '=' + crc % 64; |
CrcOkay = 0; |
if((crc1 == RxdBuffer[buf_ptr-2]) && (crc2 == RxdBuffer[buf_ptr-1])) CrcOkay = 1; else { CrcOkay = 0; }; |
if(!NeuerDatensatzEmpfangen && CrcOkay) // Datensatz schon verarbeitet |
{ |
NeuerDatensatzEmpfangen = 1; |
RxdBuffer[buf_ptr] = '\r'; |
if(/*(RxdBuffer[1] == MeineSlaveAdresse || (RxdBuffer[1] == 'a')) && */(RxdBuffer[2] == 'R')) wdt_enable(WDTO_250MS); // Reset-Commando |
} |
} |
else |
switch(UartState) |
{ |
case 0: |
if(SioTmp == '#' && !NeuerDatensatzEmpfangen) UartState = 1; // Startzeichen und Daten schon verarbeitet |
buf_ptr = 0; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc = SioTmp; |
break; |
case 1: // Adresse auswerten |
UartState++; |
RxdBuffer[buf_ptr++] = SioTmp; |
crc += SioTmp; |
break; |
case 2: // Eingangsdaten sammeln |
RxdBuffer[buf_ptr] = SioTmp; |
if(buf_ptr < MAX_EMPFANGS_BUFF) buf_ptr++; |
else UartState = 0; |
crc += SioTmp; |
break; |
default: |
UartState = 0; |
break; |
} |
#endif |
}; |
157,9 → 210,9 |
// UART Double Speed (U2X) |
USR |= (1<<U2X); |
// RX-Interrupt Freigabe |
#if X3D_SIO == 1 |
UCSRB |= (1<<RXCIE); // serieller Empfangsinterrupt |
#endif |
// TX-Interrupt Freigabe |
// UCSRB |= (1<<TXCIE); |
168,7 → 221,9 |
//öffnet einen Kanal für printf (STDOUT) |
fdevopen (uart_putchar, NULL); |
Debug_Timer = SetDelay(200); |
UDR = '*'; |
// Version beim Start ausgeben (nicht schön, aber geht... ) |
uart_putchar ('\n');uart_putchar ('B');uart_putchar ('L');uart_putchar (':'); |
uart_putchar ('V');uart_putchar (0x30 + VERSION_HAUPTVERSION);uart_putchar ('.');uart_putchar (0x30 + VERSION_NEBENVERSION/10); uart_putchar (0x30 + VERSION_NEBENVERSION%10); |
} |