电调程序.docx
《电调程序.docx》由会员分享,可在线阅读,更多相关《电调程序.docx(17页珍藏版)》请在冰豆网上搜索。
电调程序
#include"main.h"
/******************初始化参数设置*******************************************************/
unsignedintPWM=0;
unsignedintStrom=0,RuheStrom;//静止电流
unsignedcharStrom_max=0;//最大电流
unsignedcharMittelstrom=0;//平均电流
unsignedintDrehzahl=0;//转速
unsignedcharprio_flag=1;
unsignedcharMotorAnwerfen=0;//马达启动
unsignedcharMotorGestoppt=1;//马达停止
unsignedcharMaxPWM=MAX_PWM;
unsignedintCntKommutierungen=0;//换相次数
unsignedcharcurrent_test=1;
unsignedcharMotorAdresse=1;
unsignedcharIntRef=0;//参考电压设置
unsignedintMinUpmPulse;//最小转速脉冲
//############################################################################
//
voidSetPWM(void)
{
unsignedchartmp_pwm;
tmp_pwm=PWM;
if(tmp_pwm>MaxPWM)
tmp_pwm=MaxPWM;
PORTC|=ROT;
}
if(Strom>MAX_STROM)
OCR1A=0;OCR1B=0;OCR2=0;
PORTD&=~0x38;
DebugOut.Analog[6]++;
Strom--;
else
#ifdef_32KHZ
OCR1A=tmp_pwm;OCR1B=tmp_pwm;OCR2=tmp_pwm;
#endif
#ifdef_16KHZ
voidDebugAusgaben(void)
DebugOut.Analog[0]=Strom;
DebugOut.Analog[1]=Mittelstrom;
DebugOut.Analog[2]=PPM_Signal;
DebugOut.Analog[3]=OCR2;
voidPWM_Init(void)
PWM_OFF;
TCCR1B=(1<(0<}//############################################################################//voidWait(unsignedchardauer)//############################################################################{dauer=(unsignedchar)TCNT0+dauer;while((TCNT0-dauer)&0x80);}voidRotBlink(unsignedcharanz){sei();//Interruptseinwhile(anz--){PORTC|=ROT;Delay_ms(300);PORTC&=~ROT;Delay_ms(300);}Delay_ms(1000);}//############################################################################//charAnwerfen(unsignedcharpwm)//############################################################################{unsignedlongtimer=300,i;DISABLE_SENSE_INT;PWM=5;SetPWM();Manuell();MinUpmPulse=SetDelay(300);while(!CheckDelay(MinUpmPulse)){FastADConvert();if(Strom>120){STEUER_OFF;RotBlink(10);return(0);}}PWM=pwm;while(1){for(i=0;i{if(!UebertragungAbgeschlossen)SendUart();elseDatenUebertragung();Wait(100);//warten}DebugAusgaben();FastADConvert();if(Strom>60){STEUER_OFF;//AbschaltenwegenKurzschlussRotBlink(10);return(0);}timer-=timer/15+1;if(timer<25){if(TEST_MANUELL)timer=25;elsereturn(1);}Manuell();Phase++;Phase%=6;AdConvert();PWM=pwm;SetPWM();if(SENSE){PORTD^=GRUEN;}}}#defineTEST_STROMGRENZE120unsignedcharDelayM(unsignedinttimer){while(timer--){FastADConvert();if(Strom>(TEST_STROMGRENZE+RuheStrom)){FETS_OFF;return(1);}}return(0);}unsignedcharDelay(unsignedinttimer){while(timer--){}return(0);}#defineHIGH_A_EINPORTB|=0x08#defineHIGH_B_EINPORTB|=0x04#defineHIGH_C_EINPORTB|=0x02#defineLOW_A_EINPORTD|=0x08#defineLOW_B_EINPORTD|=0x10#defineLOW_C_EINPORTD|=0x20voidMotorTon(void)//############################################################################{unsignedcharADR_TAB[9]={0,0,2,1,3,4,5,6,7};unsignedinttimer=300,i;unsignedintt=0;unsignedcharanz=0,MosfetOkay=0,grenze=50;PORTC&=~ROT;Delay_ms(300*ADR_TAB[MotorAdresse]);DISABLE_SENSE_INT;cli();//GlobaleInterruptsAusschaltenuart_putchar('\n');STEUER_OFF;Strom_max=0;DelayM(50);RuheStrom=Strom_max;Strom=0;if(UDR==''){t=65535;grenze=40;uart_putchar('_');}elset=1000;//Ausf黨rlicherTestStrom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Delay(10000);Strom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Strom=0;Delay(10000);for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
(0<}//############################################################################//voidWait(unsignedchardauer)//############################################################################{dauer=(unsignedchar)TCNT0+dauer;while((TCNT0-dauer)&0x80);}voidRotBlink(unsignedcharanz){sei();//Interruptseinwhile(anz--){PORTC|=ROT;Delay_ms(300);PORTC&=~ROT;Delay_ms(300);}Delay_ms(1000);}//############################################################################//charAnwerfen(unsignedcharpwm)//############################################################################{unsignedlongtimer=300,i;DISABLE_SENSE_INT;PWM=5;SetPWM();Manuell();MinUpmPulse=SetDelay(300);while(!CheckDelay(MinUpmPulse)){FastADConvert();if(Strom>120){STEUER_OFF;RotBlink(10);return(0);}}PWM=pwm;while(1){for(i=0;i{if(!UebertragungAbgeschlossen)SendUart();elseDatenUebertragung();Wait(100);//warten}DebugAusgaben();FastADConvert();if(Strom>60){STEUER_OFF;//AbschaltenwegenKurzschlussRotBlink(10);return(0);}timer-=timer/15+1;if(timer<25){if(TEST_MANUELL)timer=25;elsereturn(1);}Manuell();Phase++;Phase%=6;AdConvert();PWM=pwm;SetPWM();if(SENSE){PORTD^=GRUEN;}}}#defineTEST_STROMGRENZE120unsignedcharDelayM(unsignedinttimer){while(timer--){FastADConvert();if(Strom>(TEST_STROMGRENZE+RuheStrom)){FETS_OFF;return(1);}}return(0);}unsignedcharDelay(unsignedinttimer){while(timer--){}return(0);}#defineHIGH_A_EINPORTB|=0x08#defineHIGH_B_EINPORTB|=0x04#defineHIGH_C_EINPORTB|=0x02#defineLOW_A_EINPORTD|=0x08#defineLOW_B_EINPORTD|=0x10#defineLOW_C_EINPORTD|=0x20voidMotorTon(void)//############################################################################{unsignedcharADR_TAB[9]={0,0,2,1,3,4,5,6,7};unsignedinttimer=300,i;unsignedintt=0;unsignedcharanz=0,MosfetOkay=0,grenze=50;PORTC&=~ROT;Delay_ms(300*ADR_TAB[MotorAdresse]);DISABLE_SENSE_INT;cli();//GlobaleInterruptsAusschaltenuart_putchar('\n');STEUER_OFF;Strom_max=0;DelayM(50);RuheStrom=Strom_max;Strom=0;if(UDR==''){t=65535;grenze=40;uart_putchar('_');}elset=1000;//Ausf黨rlicherTestStrom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Delay(10000);Strom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Strom=0;Delay(10000);for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
voidWait(unsignedchardauer)
dauer=(unsignedchar)TCNT0+dauer;
while((TCNT0-dauer)&0x80);
voidRotBlink(unsignedcharanz)
sei();//Interruptsein
while(anz--)
Delay_ms(300);
PORTC&=~ROT;
Delay_ms(1000);
charAnwerfen(unsignedcharpwm)
unsignedlongtimer=300,i;
DISABLE_SENSE_INT;
PWM=5;
SetPWM();
Manuell();
MinUpmPulse=SetDelay(300);
while(!
CheckDelay(MinUpmPulse))
FastADConvert();
if(Strom>120)
STEUER_OFF;
RotBlink(10);
return(0);
PWM=pwm;
while
(1)
for(i=0;i{if(!UebertragungAbgeschlossen)SendUart();elseDatenUebertragung();Wait(100);//warten}DebugAusgaben();FastADConvert();if(Strom>60){STEUER_OFF;//AbschaltenwegenKurzschlussRotBlink(10);return(0);}timer-=timer/15+1;if(timer<25){if(TEST_MANUELL)timer=25;elsereturn(1);}Manuell();Phase++;Phase%=6;AdConvert();PWM=pwm;SetPWM();if(SENSE){PORTD^=GRUEN;}}}#defineTEST_STROMGRENZE120unsignedcharDelayM(unsignedinttimer){while(timer--){FastADConvert();if(Strom>(TEST_STROMGRENZE+RuheStrom)){FETS_OFF;return(1);}}return(0);}unsignedcharDelay(unsignedinttimer){while(timer--){}return(0);}#defineHIGH_A_EINPORTB|=0x08#defineHIGH_B_EINPORTB|=0x04#defineHIGH_C_EINPORTB|=0x02#defineLOW_A_EINPORTD|=0x08#defineLOW_B_EINPORTD|=0x10#defineLOW_C_EINPORTD|=0x20voidMotorTon(void)//############################################################################{unsignedcharADR_TAB[9]={0,0,2,1,3,4,5,6,7};unsignedinttimer=300,i;unsignedintt=0;unsignedcharanz=0,MosfetOkay=0,grenze=50;PORTC&=~ROT;Delay_ms(300*ADR_TAB[MotorAdresse]);DISABLE_SENSE_INT;cli();//GlobaleInterruptsAusschaltenuart_putchar('\n');STEUER_OFF;Strom_max=0;DelayM(50);RuheStrom=Strom_max;Strom=0;if(UDR==''){t=65535;grenze=40;uart_putchar('_');}elset=1000;//Ausf黨rlicherTestStrom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Delay(10000);Strom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Strom=0;Delay(10000);for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
if(!
UebertragungAbgeschlossen)SendUart();
elseDatenUebertragung();
Wait(100);//warten
DebugAusgaben();
if(Strom>60)
STEUER_OFF;//AbschaltenwegenKurzschluss
timer-=timer/15+1;
if(timer<25){if(TEST_MANUELL)timer=25;elsereturn
(1);}
Phase++;
Phase%=6;
AdConvert();
if(SENSE)
PORTD^=GRUEN;
#defineTEST_STROMGRENZE120
unsignedcharDelayM(unsignedinttimer)
while(timer--)
if(Strom>(TEST_STROMGRENZE+RuheStrom))
FETS_OFF;
return
(1);
unsignedcharDelay(unsignedinttimer)
#defineHIGH_A_EINPORTB|=0x08
#defineHIGH_B_EINPORTB|=0x04
#defineHIGH_C_EINPORTB|=0x02
#defineLOW_A_EINPORTD|=0x08
#defineLOW_B_EINPORTD|=0x10
#defineLOW_C_EINPORTD|=0x20
voidMotorTon(void)
unsignedcharADR_TAB[9]={0,0,2,1,3,4,5,6,7};
unsignedinttimer=300,i;
unsignedintt=0;
unsignedcharanz=0,MosfetOkay=0,grenze=50;
Delay_ms(300*ADR_TAB[MotorAdresse]);
cli();//GlobaleInterruptsAusschalten
uart_putchar('\n');
Strom_max=0;
DelayM(50);
RuheStrom=Strom_max;
Strom=0;
if(UDR==''){t=65535;grenze=40;uart_putchar('_');}elset=1000;//Ausf黨rlicherTest
for(i=0;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');FETS_OFF;break;}Delay(5);}Delay(10000);Strom=0;for(i=0;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');FETS_OFF;break;}Delay(5);}Strom=0;Delay(10000);for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
LOW_A_EIN;
DelayM
Delay(5);
HIGH_A_EIN;
if(Strom>grenze+RuheStrom){anz=4;uart_putchar('4');FETS_OFF;break;}
Delay(10000);
for(i=0;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');FETS_OFF;break;}Delay(5);}Strom=0;Delay(10000);for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
LOW_B_EIN;
HIGH_B_EIN;
if(Strom>grenze+RuheStrom){anz=5;uart_putchar('5');FETS_OFF;break;}
for(i=0;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');FETS_OFF;break;}Delay(5);}if(anz)while(1)RotBlink(anz);//beiKurzschlussnichtstarten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+High-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++SENSE_A;FETS_OFF;LOW_B_EIN;//LowBeinLOW_C_EIN;//LowCeinStrom=0;#defineTONDAUER40000#defineSOUND_E1//1#defineSOUND1_A300#defineSOUND2_A330#defineSOUND3_A360for(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_A_EIN;//TestADelay(SOUND_E);if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};PORTB=0;Delay(SOUND1_A);}FETS_OFF;LOW_A_EIN;//LowAeinLOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};PORTB=0;Delay(SOUND2_A);}FETS_OFF;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+Low-MosfetsaufSchaltentesten//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//SENSE_B;LOW_A_EIN;//LowAeinfor(i=0;i<(TONDAUER/SOUND2_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};PORTB=0;Delay(SOUND2_A);}//++++++++++++++++++++++++++++++++++++LOW_C_EIN;//LowCeinfor(i=0;i<(TONDAUER/SOUND1_A);i++){HIGH_B_EIN;//TestBDelay(SOUND_E);if(MessAD(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;//++++++++++++++++++++++++++++++++++++FETS_OFF;LOW_B_EIN;//LowBeinfor(i=0;i<(TONDAUER/SOUND3_A);i++){HIGH_C_EIN;//TestCDelay(SOUND_E);if(MessAD(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};PORTB=0;Delay(SOUND3_A);}FETS_OFF;}//############################################################################//Hauptprogrammintmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintBlink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;PORTC=0x08;DDRD=0x3A;PORTD=0x00;DDRB=0x0E;PORTB=0x31;#defineADRESSOFFSET0#if(MOTORADRESSE==0)PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahlfor(test=0;test<500;test++);if(PINB&ADR1){if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;elseMotorAdresse=2+ADRESSOFFSET;}else{if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;elseMotorAdresse=4+ADRESSOFFSET;}HwVersion=11;#elseMotorAdresse=MOTORADRESSE;HwVersion=10;#endifif(PIND&0x80){HwVersion=12;IntRef=0xc0;}DDRD=0xBA;UART_Init();Timer0_Init();sei();//GlobaleInterruptsEinschaltenPWM_Init();InitIC2_Slave(0x50);InitPPM();Blink=SetDelay(101);Blink2=SetDelay(102);MinUpmPulse=SetDelay(103);MittelstromTimer=SetDelay(254);DrehzahlMessTimer=SetDelay(1005);TestschubTimer=SetDelay(1006);while(!CheckDelay(MinUpmPulse)){if(SollwertErmittlung())break;}GRN_ON;PWM=0;SetPWM();SFIOR=0x08;//AnalogComperatoreinADMUX=1;MinUpmPulse=SetDelay(10);DebugOut.Analog[1]=1;PPM_Signal=0;if(!SollwertErmittlung())MotorTon();PORTB=0x31;//Pullupswiedereinschalten//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelungif(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwiederwhile(1){if(!TEST_SCHUB)PWM=SollwertErmittlung();//I2C_TXBuffer=PWM;//Antwort黚erI2C-Busif(MANUELL_PWM)PWM=MANUELL_PWM;//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(Phase!=altPhase)//esgabeineKommutierungimInterrupt{MotorGestoppt=0;ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeitMinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibtaltPhase=Phase;}//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!PWM)//Sollwert==0{MotorAnwerfen=0;//keinStartversuchZeitFuerBerechnungen=0;//nach1,5SekundendenMotoralsgestopptbetrachtenif(CheckDelay(MotorGestopptTimer)){DISABLE_SENSE_INT;MotorGestoppt=1;STEUER_OFF;}}else{if(MotorGestoppt)MotorAnwerfen=1;//StartversuchMotorGestopptTimer=SetDelay(1500);}if(MotorGestoppt&&!TEST_SCHUB)PWM=0;SetPWM();//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++if(!ZeitFuerBerechnungen++){if(MotorGestoppt){//GRN_ON;FastADConvert();}if(SIO_DEBUG){DebugAusgaben
LOW_C_EIN;
HIGH_C_EIN;
if(Strom>grenze+RuheStrom){anz=6;uart_putchar('6');FETS_OFF;break;}
if(anz)while
(1)RotBlink(anz);//beiKurzschlussnichtstarten
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+High-MosfetsaufSchaltentesten
SENSE_A;
LOW_B_EIN;//LowBein
LOW_C_EIN;//LowCein
#defineTONDAUER40000
#defineSOUND_E1//1
#defineSOUND1_A300
#defineSOUND2_A330
#defineSOUND3_A360
for(i=0;i<(TONDAUER/SOUND2_A);i++)
HIGH_A_EIN;//TestA
Delay(SOUND_E);
if(MessAD(0)>50){MosfetOkay|=0x01;}else{MosfetOkay&=~0x01;};
PORTB=0;
Delay(SOUND1_A);
LOW_A_EIN;//LowAein
for(i=0;i<(TONDAUER/SOUND1_A);i++)
HIGH_B_EIN;//TestB
if(MessAD
(1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;};
for(i=0;i<(TONDAUER/SOUND3_A);i++)
HIGH_C_EIN;//TestC
(2)>50){MosfetOkay|=0x04;}else{MosfetOkay&=~0x04;};
Delay(SOUND2_A);
//+Low-MosfetsaufSchaltentesten
//SENSE_B;
if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;};
//++++++++++++++++++++++++++++++++++++
(2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;};
Delay(SOUND3_A);
(1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;};
//Hauptprogramm
intmain(void)
charaltPhase=0;
inttest=0;
unsignedintBlink,TestschubTimer;
unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;
DDRC=0x08;
PORTC=0x08;
DDRD=0x3A;
PORTD=0x00;
DDRB=0x0E;
PORTB=0x31;
#defineADRESSOFFSET0
#if(MOTORADRESSE==0)
PORTB|=(ADR1+ADR2);//Pullupsf黵Adresswahl
for(test=0;test<500;test++);
if(PINB&ADR1)
if(PINB&ADR2)MotorAdresse=1+ADRESSOFFSET;
elseMotorAdresse=2+ADRESSOFFSET;
if(PINB&ADR2)MotorAdresse=3+ADRESSOFFSET;
elseMotorAdresse=4+ADRESSOFFSET;
HwVersion=11;
#else
MotorAdresse=MOTORADRESSE;
HwVersion=10;
if(PIND&0x80){HwVersion=12;IntRef=0xc0;}
DDRD=0xBA;
UART_Init();
Timer0_Init();
sei();//GlobaleInterruptsEinschalten
PWM_Init();
InitIC2_Slave(0x50);
InitPPM();
Blink=SetDelay(101);
Blink2=SetDelay(102);
MinUpmPulse=SetDelay(103);
MittelstromTimer=SetDelay(254);
DrehzahlMessTimer=SetDelay(1005);
TestschubTimer=SetDelay(1006);
if(SollwertErmittlung())break;
GRN_ON;
PWM=0;
SFIOR=0x08;//AnalogComperatorein
ADMUX=1;
MinUpmPulse=SetDelay(10);
DebugOut.Analog[1]=1;
PPM_Signal=0;
SollwertErmittlung())MotorTon();
PORTB=0x31;//Pullupswiedereinschalten
//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelung
if(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwieder
TEST_SCHUB)PWM=SollwertErmittlung();
//I2C_TXBuffer=PWM;//Antwort黚erI2C-Bus
if(MANUELL_PWM)PWM=MANUELL_PWM;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(Phase!
=altPhase)//esgabeineKommutierungimInterrupt
MotorGestoppt=0;
ZeitFuerBerechnungen=0;//direktnacheinerKommutierungistZeit
MinUpmPulse=SetDelay(250);//Timeout,fallseinMotorstehenbleibt
altPhase=Phase;
PWM)//Sollwert==0
MotorAnwerfen=0;//keinStartversuch
ZeitFuerBerechnungen=0;
//nach1,5SekundendenMotoralsgestopptbetrachten
if(CheckDelay(MotorGestopptTimer))
MotorGestoppt=1;
if(MotorGestoppt)MotorAnwerfen=1;//Startversuch
MotorGestopptTimer=SetDelay(1500);
if(MotorGestoppt&&!
TEST_SCHUB)PWM=0;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ZeitFuerBerechnungen++)
if(MotorGestoppt)
//GRN_ON;
if(SIO_DEBUG)
DebugAusgaben
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1