航模电调制作及程序
完工效果图 QQ:99246665
电路原理图
PCB布局
C语言程序
/*############################################################################ + 无刷电机控制器 + ATMEGA8 At 8MHz + (c) 01.2007 Holger Buss + 只作私人用途
+ 准确性没有保证
+ 未经我同意不得商业使用
+ 该代码使用BL_Ctrl 1.0版已经开发的硬件
/############################################################################*/
#include \
unsigned int PWM = 0;
unsigned int Strom = 0; //ca. in 0,1A //电流
unsigned char Strom_max = 0; //最大电流 unsigned char Mittelstrom = 0; //平均电流 unsigned int Drehzahl = 0; // in 100UPM 60 = 6000 //转速 unsigned int KommutierDelay = 10; //换向延时 unsigned int I2C_Timeout = 0;
unsigned char SIO_Timeout = 0;
unsigned int SollDrehzahl = 0; //额定转速,计算转速
unsigned int IstDrehzahl = 0; //实际转速
unsigned int DrehZahlTabelle[256];//vorberechnete Werte zur Drehzahlerfassung //转速表 unsigned char ZeitFuerBerechnungen = 1; //计算所用时间 unsigned char MotorAnwerfen = 0; //电机启动,(加速 unsigned char MotorGestoppt = 1; //电机停止
unsigned char MaxPWM = MAX_PWM;
unsigned int CntKommutierungen = 0; //换向计数 unsigned int SIO_Drehzahl = 0; //串口速度
unsigned char ZeitZumAdWandeln = 1; //到AD转换的时间
//############################################################################ //
void SetPWM(void)
//############################################################################ {
unsigned char tmp_pwm; tmp_pwm = PWM;
if(tmp_pwm > MaxPWM) // 电流限制 {
tmp_pwm = MaxPWM;
PORTC |= ROT; //红色LED亮 }
if(Strom > MAX_STROM) // 电流限制 {
OCR1A = 0; OCR1B = 0; OCR2 = 0; PORTC |= ROT; //红色LED亮 Strom--;
}
else {
#ifdef _32KHZ
OCR1A = 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 }
}
//############################################################################ //
void PWM_Init(void) //PWM初始化
//############################################################################ {
PWM_OFF;
TCCR1B = (1 << CS10) | (0 << CS11) | (0 << CS12) | (1 << WGM12) |
(0 << WGM13) | (0<< ICES1) | (0 << ICNC1);
// T/C1 无预分频,下降沿触发输入捕捉,不使用输入捕捉噪声抑制功能, // 9位快速PWM,比较匹配时清零OC1A/OC1B(输出低电平) }
//############################################################################ //
void Wait(unsigned char dauer) //dauer 持续时间
//############################################################################ {
dauer = (unsigned char)TCNT0 + dauer; while((TCNT0 - dauer) & 0x80); }
//############################################################################ //
void Anwerfen(unsigned char pwm) //启动马达
//############################################################################ /*补充注释:
开环启动算法
*/ {
unsigned long timer = 300,i;
DISABLE_SENSE_INT; //关闭模拟比较器中断 PWM = 5;
SetPWM();//T1和T2定时计数器赋值,设置pwm占空比 Manuell();
/*补充注释:
开环顺序换向算法,注意换向时必须同步修改比较器端口及触发沿 以便在反相感生电动势到达切换条件时,自动切换到闭环运转状态 */////////////////////////////////////////////////// Delay_ms(200); PWM = pwm; while(1) {
for(i=0;i //if(!UebertragungAbgeschlossen) SendUart(); //UebertragungAbgeschlossen完成转换 //else DatenUebertragung(); //数据传输 Wait(100); // warten 等待 } timer-= timer/15+1; if(timer < 25) { if(TEST_MANUELL) timer = 25; else return; } Manuell(); Phase++; Phase %= 6; AdConvert(); //测量电流 PWM = pwm; SetPWM(); if(SENSE) //如果模拟比较器中断标志置位,绿灯亮 { PORTD ^= GRUEN; } } } //############################################################################ // unsigned char SollwertErmittlung(void) //设定值的测量值 //############################################################################ {