电调程序.docx
- 文档编号:4363660
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:17
- 大小:17.88KB
电调程序.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;
PORTC|=ROT;
DebugOut.Analog[6]++;
Strom--;
}
else
{
#ifdef_32KHZ
OCR1A=tmp_pwm;OCR1B=tmp_pwm;OCR2=tmp_pwm;
#endif
#ifdef_16KHZ
OCR1A=tmp_pwm;OCR1B=tmp_pwm;OCR2=tmp_pwm;
#endif
}
}
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();//Interruptsein while(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;//AbschaltenwegenKurzschluss RotBlink(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_STROMGRENZE120 unsignedcharDelayM(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|=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; PORTC&=~ROT; Delay_ms(300*ADR_TAB[MotorAdresse]); DISABLE_SENSE_INT; cli();//GlobaleInterruptsAusschalten uart_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黨rlicherTest Strom=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;//LowBein LOW_C_EIN;//LowCein Strom=0; #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); } FETS_OFF; LOW_A_EIN;//LowAein LOW_C_EIN;//LowCein for(i=0;i<(TONDAUER/SOUND1_A);i++) { HIGH_B_EIN;//TestB Delay(SOUND_E); if(MessAD (1)>50){MosfetOkay|=0x02;}else{MosfetOkay&=~0x02;}; PORTB=0; Delay(SOUND1_A); } FETS_OFF; LOW_A_EIN;//LowAein LOW_B_EIN;//LowBein for(i=0;i<(TONDAUER/SOUND3_A);i++) { HIGH_C_EIN;//TestC Delay(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;//LowAein for(i=0;i<(TONDAUER/SOUND2_A);i++) { HIGH_B_EIN;//TestB Delay(SOUND_E); if(MessAD(0)>128){MosfetOkay&=~0x08;}else{MosfetOkay|=0x08;}; PORTB=0; Delay(SOUND2_A); } //++++++++++++++++++++++++++++++++++++ LOW_C_EIN;//LowCein for(i=0;i<(TONDAUER/SOUND1_A);i++) { HIGH_B_EIN;//TestB Delay(SOUND_E); if(MessAD (2)>128){MosfetOkay&=~0x20;}else{MosfetOkay|=0x20;}; PORTB=0; Delay(SOUND3_A); } FETS_OFF; //++++++++++++++++++++++++++++++++++++ FETS_OFF; LOW_B_EIN;//LowBein for(i=0;i<(TONDAUER/SOUND3_A);i++) { HIGH_C_EIN;//TestC Delay(SOUND_E); if(MessAD (1)>128){MosfetOkay&=~0x10;}else{MosfetOkay|=0x10;}; PORTB=0; Delay(SOUND3_A); } FETS_OFF; } //############################################################################ //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 { if(PINB&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); while(! CheckDelay(MinUpmPulse)) { if(SollwertErmittlung())break; } GRN_ON; PWM=0; SetPWM(); SFIOR=0x08;//AnalogComperatorein ADMUX=1; MinUpmPulse=SetDelay(10); DebugOut.Analog[1]=1; PPM_Signal=0; if(! SollwertErmittlung())MotorTon(); PORTB=0x31;//Pullupswiedereinschalten //zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelung if(TEST_MANUELL)Anwerfen(TEST_MANUELL);//kommtvondortnichtwieder while (1) { if(! 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; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(! PWM)//Sollwert==0 { MotorAnwerfen=0;//keinStartversuch ZeitFuerBerechnungen=0; //nach1,5SekundendenMotoralsgestopptbetrachten if(CheckDelay(MotorGestopptTimer)) { DISABLE_SENSE_INT; MotorGestoppt=1; STEUER_OFF; } } else { if(MotorGestoppt)MotorAnwerfen=1;//Startversuch MotorGestopptTimer=SetDelay(1500); } if(MotorGestoppt&&! TEST_SCHUB)PWM=0; SetPWM(); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(! ZeitFuerBerechnungen++) { if(MotorGestoppt) { //GRN_ON; FastADConvert(); } if(SIO_DEBUG) { DebugAusgaben
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序