电调程序.docx

上传人:b****5 文档编号:4363660 上传时间:2022-11-30 格式:DOCX 页数:17 大小:17.88KB
下载 相关 举报
电调程序.docx_第1页
第1页 / 共17页
电调程序.docx_第2页
第2页 / 共17页
电调程序.docx_第3页
第3页 / 共17页
电调程序.docx_第4页
第4页 / 共17页
电调程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

电调程序.docx

《电调程序.docx》由会员分享,可在线阅读,更多相关《电调程序.docx(17页珍藏版)》请在冰豆网上搜索。

电调程序.docx

电调程序

#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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1