Subversion Repositories BL-Ctrl

Compare Revisions

Ignore whitespace Rev 17 → Rev 18

/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
-----------------------------------------
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
#define MAX_STROM 130 // ab ca. 13A PWM ausschalten
#define LIMIT_STROM 65 // ab ca. 6,5A PWM begrenzen
#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;
SioTmp = UDR;
#if X3D_SIO == 1
SioTmp = UDR;
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);
 
167,8 → 220,10
UBRR= (SYSCLK / (BAUD_RATE * 8L) -1 );
//öffnet einen Kanal für printf (STDOUT)
fdevopen (uart_putchar, NULL);
Debug_Timer = SetDelay(200);
UDR = '*';
Debug_Timer = SetDelay(200);
// 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);
}