/*############################################################################
+ 无刷电机控制器
+ ATMEGA8 At 8MHz
+ (c) 01.2007 Holger Buss
+ 只作私人用途
+ 准确性没有保证
+ 未经我同意不得商业使用
+ 该代码使用BL_Ctrl 1.0版已经开发的硬件
+ www.mikrocontroller.com
/############################################################################*/
#include "main.h"
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<timer; 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) //设定值的测量值
//############################################################################
{
static unsigned int sollwert = 0;
//unsigned int ppm;
if(!I2C_Timeout) // bei Erreichen von 0 ist der Wert ung黮tig
{
if(SIO_Timeout) // es gibt g黮tige SIO-Daten
{
//sollwert = (MAX_PWM * (unsigned int) SIO_Sollwert) / 200; // skalieren auf 0-200 = 0-255
}
else
/*
if(PPM_Timeout) // es gibt g黮tige PPM-Daten
{
ppm = PPM_Signal;
if(ppm > 300) ppm = 0; // ung黮tiges Signal
if(ppm > 200) 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 // Kein g黮tiger Sollwert
{*/
if(!TEST_SCHUB) { if(sollwert) sollwert--; }
PORTC |= ROT;
/*}*/
}
else // I2C-Daten sind g黮tig
{
sollwert = I2C_RXBuffer;
PORTC &= ~ROT;
}
if(sollwert > MAX_PWM) sollwert = MAX_PWM;
return(sollwert);
}
//############################################################################
//主程序
int main (void)
//############################################################################
{
char altPhase = 0;
int test = 0;
unsigned int MinUpmPulse,Blink,TestschubTimer;
unsigned int Blink2,MittelstromTimer,DrehzahlMessTimer,MotorGestopptTimer;
DDRC = 0x08;//PC3输出,控制红色led
PORTC = 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;test<5;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;
// zum Test der Hardware; Motor dreht mit konstanter Drehzahl ohne Regelung///测试硬件,马达转速不受控制
if(TEST_MANUELL) Anwerfen(TEST_MANUELL); // kommt von dort nicht wieder//到再次没有重建时
//Anwerfen:启动,加速
while (1)
{
if(!TEST_SCHUB) PWM = SollwertErmittlung();//额定值计算
//I2C_TXBuffer = PWM; // Antwort 黚er I2C-Bus
if(MANUELL_PWM) PWM =
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
ATMega8制作无感无刷(BLDC)电调全套资料(C源程序固件SCH和PCB).rar (94个子文件)
偶做的电调实物图2.jpg 50KB
IRFR5305.pdf 158KB
AD6格式的电路图和PCB
BLCD-M8.PCBDOC 794KB
BLDC-M8.SCHDOC 398KB
IRFR1205.pdf 146KB
BLDC-M8.pdf 673KB
偶做的电调实物图1.jpg 59KB
Protel99格式的电路图和PCB
BLDC-M8.sch 80KB
BLCD-M8.pcb 509KB
C源程序和固件
V0_31(中文注释)
main.h 2KB
timer0.lst 7KB
BLMC.d 79B
PPM_Decode.h 1KB
twislave.h 742B
BrushLess-Ctrl_V0_31.eep 13B
old_macros.h 726B
main.d 79B
BLMC.h 2KB
twislave.d 95B
analog.d 89B
PPM_Decode.c 2KB
uart.h 2KB
BrushLess-Ctrl_V0_31.elf 17KB
BrushLess-Ctrl_V0_31.sym 3KB
BLMC.c 5KB
analog.c 2KB
PPM_Decode.d 114B
analog.lst 4KB
BrushLess-Ctrl_V0_31.cof 7KB
twislave.o 4KB
BrushLess-Ctrl_V0_31.lss 75KB
PPM_Decode.o 5KB
uart.c 5KB
makefile 10KB
twislave.c 2KB
timer0.c 1KB
main.lst 31KB
BrushLess-Ctrl_V0_31.map 28KB
analog.o 3KB
BrushLess-Ctrl_V0_31.hex 8KB
timer0.h 519B
timer0.d 89B
PPM_Decode.lst 10KB
analog.h 98B
main.o 13KB
twislave.lst 6KB
main.c 13KB
BLMC.lst 19KB
BLMC.o 7KB
timer0.o 5KB
V0_31(德国人的原程序)
main.h 3KB
timer0.lst 8KB
BLMC.d 103B
PPM_Decode.h 1KB
twislave.h 740B
BrushLess-Ctrl_V0_31.eep 13B
old_macros.h 724B
main.d 103B
BLMC.h 2KB
twislave.d 115B
analog.d 109B
PPM_Decode.c 2KB
uart.h 2KB
BrushLess-Ctrl_V0_31.elf 24KB
BrushLess-Ctrl_V0_31.sym 5KB
BLMC.c 4KB
analog.c 1KB
PPM_Decode.d 121B
analog.lst 4KB
uart.o 9KB
BrushLess-Ctrl_V0_31.cof 10KB
twislave.o 4KB
uart.d 103B
BrushLess-Ctrl_V0_31.lss 113KB
PPM_Decode.o 5KB
uart.c 5KB
makefile 10KB
twislave.c 2KB
timer0.c 1KB
main.lst 36KB
BrushLess-Ctrl_V0_31.map 39KB
analog.o 3KB
BrushLess-Ctrl_V0_31.hex 13KB
timer0.h 344B
timer0.d 109B
PPM_Decode.lst 10KB
analog.h 92B
main.o 15KB
twislave.lst 6KB
main.c 11KB
uart.lst 19KB
BLMC.lst 19KB
BLMC.o 7KB
timer0.o 5KB
共 94 条
- 1
资源评论
- HCWS2018-06-13请问下这个是用什么编译的
- Tony_tgr2019-03-21这个可以改成100A的电调吗
- sectionfirst2018-09-09找了很久,终于在这里找到了,谢谢。。。。
- scwangpeng2019-04-06BLDC资料太少了,难得
- PotatoMaxwell2020-09-07内容与标题相符,请问如何下载固件呢
sufrigate
- 粉丝: 34
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功