电调程序Word文档格式.docx
《电调程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《电调程序Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
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<
<
CS10)|(0<
CS11)|(0<
CS12)|(0<
WGM12)|
(0<
WGM13)|(0<
ICES1)|(0<
ICNC1);
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();
120)
STEUER_OFF;
RotBlink(10);
return(0);
PWM=pwm;
while
(1)
for(i=0;
i<
timer;
i++)
if(!
UebertragungAbgeschlossen)SendUart();
elseDatenUebertragung();
Wait(100);
//warten
DebugAusgaben();
60)
//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--)
(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;
_'
}elset=1000;
//Ausf黨rlicherTest
t;
i++)
LOW_A_EIN;
DelayM
(1);
Delay(5);
HIGH_A_EIN;
grenze+RuheStrom){anz=4;
4'
break;
Delay(10000);
LOW_B_EIN;
HIGH_B_EIN;
grenze+RuheStrom){anz=5;
5'
break;
LOW_C_EIN;
HIGH_C_EIN;
grenze+RuheStrom){anz=6;
6'
if(anz)while
(1)RotBlink(anz);
//beiKurzschlussnichtstarten
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+High-MosfetsaufSchaltentesten
SENSE_A;
//LowBein
//LowCein
#defineTONDAUER40000
#defineSOUND_E1//1
#defineSOUND1_A300
#defineSOUND2_A330
#defineSOUND3_A360
i<
(TONDAUER/SOUND2_A);
i++)
//TestA
Delay(SOUND_E);
if(MessAD(0)>
50){MosfetOkay|=0x01;
}else{MosfetOkay&
=~0x01;
};
PORTB=0;
Delay(SOUND1_A);
//LowAein
(TONDAUER/SOUND1_A);
//TestB
if(MessAD
(1)>
50){MosfetOkay|=0x02;
=~0x02;
(TONDAUER/SOUND3_A);
//TestC
if(MessAD
(2)>
50){MosfetOkay|=0x04;
=~0x04;
Delay(SOUND2_A);
//+Low-MosfetsaufSchaltentesten
//SENSE_B;
128){MosfetOkay&
=~0x08;
}else{MosfetOkay|=0x08;
//++++++++++++++++++++++++++++++++++++
=~0x20;
}else{MosfetOkay|=0x20;
Delay(SOUND3_A);
=~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;
else
ADR2)MotorAdresse=3+ADRESSOFFSET;
elseMotorAdresse=4+ADRESSOFFSET;
HwVersion=11;
#else
MotorAdresse=MOTORADRESSE;
HwVersion=10;
#endif
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);
CheckDelay(MinUpmPulse))
if(SollwertErmittlung())break;
GRN_ON;
PWM=0;
SFIOR=0x08;
//AnalogComperatorein
ADMUX=1;
MinUpmPulse=SetDelay(10);
DebugOut.Analog[1]=1;
PPM_Signal=0;
SollwertErmittlung())MotorTon();
//Pullupswiedereinschalten
//zumTestderHardware;
MotordrehtmitkonstanterDrehzahlohneRegelung
if(TEST_MANUELL)Anwerfen(TEST_MANUELL);
//kommtvondortnichtwieder
while
(1)
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
//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