📄 main.c
字号:
/*#######################################################################################
无刷电机控制系统
#######################################################################################*/
#include "main.h"
unsigned int PWM = 0;
unsigned int Strom = 0,RuheStrom; //0.1A
unsigned char Strom_max = 0;
unsigned char Mittelstrom = 0;
unsigned int Drehzahl = 0; // 100Hz 60 = 6000
unsigned int KommutierDelay = 10;
unsigned int I2C_Timeout = 0;
unsigned int SIO_Timeout = 0;
unsigned int SollDrehzahl = 0;
unsigned int IstDrehzahl = 0;
unsigned int DrehZahlTabelle[256];//转动值
unsigned char ZeitFuerBerechnungen = 1;
unsigned char MotorAnwerfen = 0;
unsigned char MotorGestoppt = 1;
unsigned char MaxPWM = MAX_PWM;
unsigned int CntKommutierungen = 0;
unsigned int SIO_Drehzahl = 0;
unsigned char ZeitZumAdWandeln = 1;
unsigned char MotorAdresse = 1;
unsigned char PPM_Betrieb = 1;
//############################################################################
void SetPWM(void)
//############################################################################
{
unsigned char tmp_pwm;
tmp_pwm = PWM;
if(tmp_pwm > MaxPWM) // 电流限制
{
tmp_pwm = MaxPWM;
PORTC |= ROT;
}
if(Strom > MAX_STROM) // Strombegrenzung
{
OCR1A = 0; OCR1B = 0; OCR2 = 0;
PORTC |= ROT;
Strom--;
}
else
{
#ifdef _32KHZ
OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm;
#endif
#ifdef _16KHZ
//OCR1A = 2 * (int)tmp_pwm; OCR1B = 2 * (int)tmp_pwm; OCR2 = tmp_pwm;
OCR1A = tmp_pwm; OCR1B = tmp_pwm; OCR2 = tmp_pwm;
#endif
}
}
//############################################################################
//
void PWM_Init(void)
//############################################################################
{
PWM_OFF;
TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (0 << WGM12) |
(0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
/* TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) |
(0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
*/
}
//############################################################################
//
void Wait(unsigned char dauer)
//############################################################################
{
dauer = (unsigned char)TCNT0 + dauer;
while((TCNT0 - dauer) & 0x80);
}
//############################################################################
//
void Anwerfen(unsigned char pwm)
//############################################################################
{
unsigned long timer = 300,i;
DISABLE_SENSE_INT;
PWM = 5;
SetPWM();
Manuell();
Delay_ms(200);
PWM = pwm;
while(1)
{
for(i=0;i<timer; i++)
{
if(!UebertragungAbgeschlossen) SendUart();
else DatenUebertragung();
Wait(100); // wait
}
timer-= timer/15+1;
if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; }
Manuell();
Phase++;
Phase %= 6;
AdConvert();
PWM = pwm;
SetPWM();
if(SENSE)
{
PORTD ^= GRUEN;
}
}
}
//**********************故障灯*************************//
void RotBlink(unsigned char anz)
{
sei(); // Interrupts ein
while(anz--)
{
PORTC |= ROT;
Delay_ms(300);
PORTC &= ~ROT;
Delay_ms(300);
}
Delay_ms(1000);
}
#define TEST_STROMGRENZE 120
unsigned char DelayM(unsigned int timer)
{
while(timer--)
{
FastADConvert();
if(Strom > (TEST_STROMGRENZE + RuheStrom))
{
FETS_OFF;
return(1);
}
}
return(0);
}
unsigned char Delay(unsigned int timer)
{
while(timer--)
{
// if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
}
return(0);
}
/*
void ShowSense(void)
{
if(SENSE_H) { PORTC |= ROT; } else { PORTC &= ~ROT;}
}
*/
#define HIGH_A_EIN PORTB |= 0x08
#define HIGH_B_EIN PORTB |= 0x04
#define HIGH_C_EIN PORTB |= 0x02
#define LOW_A_EIN PORTD |= 0x08
#define LOW_B_EIN PORTD |= 0x10
#define LOW_C_EIN PORTD |= 0x20
void MotorTon(void)
//############################################################################
{
unsigned char ADR_TAB[5] = {0,0,2,1,3};
unsigned int timer = 300,i;
unsigned int t = 0;
unsigned char anz = 0,MosfetOkay = 0, grenze = 50;
PORTC &= ~ROT;
Delay_ms(300 * ADR_TAB[MotorAdresse]);
DISABLE_SENSE_INT;
cli();//Globale Interrupts Ausschalten
uart_putchar('\n');
STEUER_OFF;
Strom_max = 0;
DelayM(50);
RuheStrom = Strom_max;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 高端功率管短路测试 +//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Strom = 0;
LOW_B_EIN;
HIGH_A_EIN;
if(DelayM(3))
{
anz = 1;
uart_putchar('1');
}
FETS_OFF;
Delay(1000);
Strom = 0;
LOW_A_EIN;
HIGH_B_EIN;
if(DelayM(3))
{
anz = 2;
uart_putchar('2');
}
FETS_OFF;
Delay(1000);
Strom = 0;
LOW_B_EIN; // Low C ein
HIGH_C_EIN; // High B ein
if(DelayM(3))
{
anz = 3;
uart_putchar('3');
}
FETS_OFF;
Delay(1000);
LOW_A_EIN; // Low A ein; und A gegen C
HIGH_C_EIN; // High C ein
if(DelayM(3))
{
anz = 3;
uart_putchar('7');
}
FETS_OFF;
DelayM(10000);
if(anz) while(1) RotBlink(anz);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 低端功率管短路测试
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(UDR == ' ') {t = 65535; grenze = 40; uart_putchar('_');} else t = 1000;
Strom = 0;
for(i=0;i<t;i++)
{
LOW_A_EIN;
DelayM(1);
FETS_OFF;
Delay(5);
HIGH_A_EIN;
DelayM(1);
FETS_OFF;
if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); break;}
Delay(5);
}
Delay(10000);
Strom = 0;
for(i=0;i<t;i++)
{
LOW_B_EIN;
DelayM(1);
FETS_OFF;
Delay(5);
HIGH_B_EIN;
DelayM(1);
FETS_OFF;
if(Strom > grenze + RuheStrom) {anz = 5; uart_putchar('5'); break;}
Delay(5);
}
Strom = 0;
Delay(10000);
for(i=0;i<t;i++)
{
LOW_C_EIN;
DelayM(1);
FETS_OFF;
Delay(5);
HIGH_C_EIN;
DelayM(1);
FETS_OFF;
if(Strom > grenze + RuheStrom) {anz = 6; uart_putchar('6'); break;}
Delay(5);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ 高端功率管开关测试
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SENSE_A;
FETS_OFF;
LOW_B_EIN; // Low B ein
LOW_C_EIN; // Low C ein
Strom = 0;
#define TONDAUER 40000
#define SOUND_E 2
#define SOUND1_A 300
#define SOUND2_A 330
#define SOUND3_A 360
for(i=0; i< (TONDAUER / SOUND2_A) ; i++)
{
HIGH_A_EIN; // Test A
Delay(SOUND_E);
if(MessAD(0) > 50) { MosfetOkay |= 0x01; } else { MosfetOkay &= ~0x01;};
PORTB = 0;
Delay(SOUND1_A);
}
FETS_OFF;
LOW_A_EIN; // Low A ein
LOW_C_EIN; // Low C ein
for(i=0; i<(TONDAUER / SOUND1_A); i++)
{
HIGH_B_EIN; // Test B
Delay(SOUND_E);
if(MessAD(1) > 50) { MosfetOkay |= 0x02; } else { MosfetOkay &= ~0x02;};
PORTB = 0;
Delay(SOUND1_A);
}
FETS_OFF;
LOW_A_EIN; // Low A ein
LOW_B_EIN; // Low B ein
for(i=0; i<(TONDAUER / SOUND3_A); i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -