航模电调制作及程序完工效果图QQ:99246665电路原理图PCB布局C语言程序/*############################################################################+无刷电机控制器+ATMEGA8At8MHz+(c)01.2007HolgerBuss+只作私人用途+准确性没有保证+未经我同意不得商业使用+该代码使用BL_Ctrl1.0版已经开发的硬件/############################################################################*/#includemain.hunsignedintPWM=0;unsignedintStrom=0;//ca.in0,1A//电流unsignedcharStrom_max=0;//最大电流unsignedcharMittelstrom=0;//平均电流unsignedintDrehzahl=0;//in100UPM60=6000//转速unsignedintKommutierDelay=10;//换向延时unsignedintI2C_Timeout=0;unsignedcharSIO_Timeout=0;unsignedintSollDrehzahl=0;//额定转速,计算转速unsignedintIstDrehzahl=0;//实际转速unsignedintDrehZahlTabelle[256];//vorberechneteWertezurDrehzahlerfassung//转速表unsignedcharZeitFuerBerechnungen=1;//计算所用时间unsignedcharMotorAnwerfen=0;//电机启动,(加速unsignedcharMotorGestoppt=1;//电机停止unsignedcharMaxPWM=MAX_PWM;unsignedintCntKommutierungen=0;//换向计数unsignedintSIO_Drehzahl=0;//串口速度unsignedcharZeitZumAdWandeln=1;//到AD转换的时间//############################################################################//voidSetPWM(void)//############################################################################{unsignedchartmp_pwm;tmp_pwm=PWM;if(tmp_pwmMaxPWM)//电流限制{tmp_pwm=MaxPWM;PORTC|=ROT;//红色LED亮}if(StromMAX_STROM)//电流限制{OCR1A=0;OCR1B=0;OCR2=0;PORTC|=ROT;//红色LED亮Strom--;}else{#ifdef_32KHZOCR1A=tmp_pwm;OCR1B=tmp_pwm;OCR2=tmp_pwm;#endif#ifdef_16KHZ//16kHZ时T1用的是9位快速的pwm,所以赋值要加倍,T2用的是相位修正,不用加倍OCR1A=2*(int)tmp_pwm;OCR1B=2*(int)tmp_pwm;OCR2=tmp_pwm;#endif}}//############################################################################//voidPWM_Init(void)//PWM初始化//############################################################################{PWM_OFF;TCCR1B=(1CS10)|(0CS11)|(0CS12)|(1WGM12)|(0WGM13)|(0ICES1)|(0ICNC1);//T/C1无预分频,下降沿触发输入捕捉,不使用输入捕捉噪声抑制功能,//9位快速PWM,比较匹配时清零OC1A/OC1B(输出低电平)}//############################################################################//voidWait(unsignedchardauer)//dauer持续时间//############################################################################{dauer=(unsignedchar)TCNT0+dauer;while((TCNT0-dauer)&0x80);}//############################################################################//voidAnwerfen(unsignedcharpwm)//启动马达//############################################################################/*补充注释:开环启动算法*/{unsignedlongtimer=300,i;DISABLE_SENSE_INT;//关闭模拟比较器中断PWM=5;SetPWM();//T1和T2定时计数器赋值,设置pwm占空比Manuell();/*补充注释:开环顺序换向算法,注意换向时必须同步修改比较器端口及触发沿以便在反相感生电动势到达切换条件时,自动切换到闭环运转状态*///////////////////////////////////////////////////Delay_ms(200);PWM=pwm;while(1){for(i=0;itimer;i++){//if(!UebertragungAbgeschlossen)SendUart();//UebertragungAbgeschlossen完成转换//elseDatenUebertragung();//数据传输Wait(100);//warten等待}timer-=timer/15+1;if(timer25){if(TEST_MANUELL)timer=25;elsereturn;}Manuell();Phase++;Phase%=6;AdConvert();//测量电流PWM=pwm;SetPWM();if(SENSE)//如果模拟比较器中断标志置位,绿灯亮{PORTD^=GRUEN;}}}//############################################################################//unsignedcharSollwertErmittlung(void)//设定值的测量值//############################################################################{staticunsignedintsollwert=0;//unsignedintppm;if(!I2C_Timeout)//beiErreichenvon0istderWertung黮tig{if(SIO_Timeout)//esgibtg黮tigeSIO-Daten{//sollwert=(MAX_PWM*(unsignedint)SIO_Sollwert)/200;//skalierenauf0-200=0-255}else/*if(PPM_Timeout)//esgibtg黮tigePPM-Daten{ppm=PPM_Signal;if(ppm300)ppm=0;//ung黮tigesSignalif(ppm200)ppm=200;if(ppm=MIN_PPM)sollwert=0;else{sollwert=(int)MIN_PWM+((MAX_PWM-MIN_PWM)*(ppm-MIN_PPM))/(190-MIN_PPM);}PORTC&=~ROT;}else//Keing黮tigerSollwert{*/if(!TEST_SCHUB){if(sollwert)sollwert--;}PORTC|=ROT;/*}*/}else//I2C-Datensindg黮tig{sollwert=I2C_RXBuffer;PORTC&=~ROT;}if(sollwertMAX_PWM)sollwert=MAX_PWM;return(sollwert);}//############################################################################//主程序intmain(void)//############################################################################{charaltPhase=0;inttest=0;unsignedintMinUpmPulse,Blink,TestschubTimer;unsignedintBlink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;DDRC=0x08;//PC3输出,控制红色ledPORTC=0x08;//PC3输出高电平,红色led亮DDRD=0xBA;//10111010A-B-C-配置为输出,TXD,LED_GRN(PD7)配置为输出,MITTEL/RXD/INT0为输入PORTD=0x80;//LED_GRN高电平,绿色灯亮DDRB=0x0E;////A+B+C+配置为输出,其他为输入,ppm的ICP为输入PORTB=0x31;//I2C总线(SDA/SCL)为高电平,ICP上拉电阻使能,其他低电平,因为有三极管截止,所以p沟道不导通//UART_Init();Timer0_Init();sei();//打开全局中断//绿灯闪烁次数标识的电机地址,用于4轴的4个电调判断for(test=0;test5;test++){if(test==MOTORADRESSE)PORTD|=GRUEN;//绿灯亮Delay_ms(150);PORTD&=~GRUEN;//绿灯灭Delay_ms(250);}Delay_ms(500);//UART_Init();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));PORTD|=GRUEN;//LED_GRN高电平,绿灯亮PWM=0;SetPWM();SFIOR=0x08;//模拟比较器多路复用器使能ADMUX=1;//ADC1作为模拟比较器的输入负极MinUpmPulse=SetDelay(10);//DebugOut.Analog[1]=1;//PPM_Signal=0;//zumTestderHardware;MotordrehtmitkonstanterDrehzahlohneRegelung///测试硬件,马达转速不受控制if(TEST_M