当前位置:文档之家› 无刷直流电机控制器设计程序

无刷直流电机控制器设计程序

无刷直流电机控制器设计程序
无刷直流电机控制器设计程序

#include

#include

#include

#include

#include

#include

#define led_bit XBYTE[0x88ff] /*LED寻位地址*/

#define led_data XBYTE[0x09ff] /*LED数据地址*/

#define key_row XBYTE[0x0Aff] /*键盘行地址*/

#define key_col XBYTE[0x0Cff] /*键盘列地址*/

#define TIMER0_CONTROL TR0 /*定时器0控制位*/

#define TIMER1_CONTROL TR1 /*定时器1控制位*/

#define TIMER2_CONTROL TR2 /*定时器2控制位*/

#define i_a_limit 0x0D /*电枢限流0.5A*/

/*定义共阳极LED显示段码*/

static struct {char ascii;char stroke;}

code led_strokes[27]={

{'0',0xc0},{'1',0xf9},{'2',0xa4},{'3',0xb0},{'4',0x99},{'5',0x92}, {'6',0x82},{'7',0xf8},{'8',0x80},{'9',0x90},{'A',0x88},{'b',0x83}, {'c',0xc6},{'d',0xa1},{'E',0x86},{'F',0x8e},{'.',0x7f},{'P',0x8c}, {'U',0xc1},{'T',0xce},{'y',0x91},{'o',0xa3},{'-',0xbf},{'=',0xb7}, {'r',0xaf},{0x00,0x00},{0xff,0xff}

};

/*定义PI控制器参数*/

float Proportion; //比例常数Proportional Const

float Integral; //积分常数Integral Const

float Derivative; //微分常数Derivative Const

int LastError; //E[k-1]

int PrrevError;//E[k-2]

/*定义全局函数和变量*/

void init_system(void);

void key_monitor(void);

void set_refled_buf(unsigned char a,int pos,int len);

void put_on_refleds(void);

void set_fdbled_buf(unsigned char a,int pos,int len);

void put_on_fdbleds(void);

void asr_pid(unsigned int na,unsigned int nb);

bit kbd_hit(void);

unsigned char get_char(void);

unsigned char *get_str(unsigned char *str,unsigned int len); unsigned char get_strokes(unsigned char c);

void adc0804_start(void);

unsigned int adc0804_read(void);

unsigned int n_test(void);

unsigned int i_a_test(void);

unsigned read_nref(void);

extern void delay(int);1

sfr AUXR=0x8e;

sbit PWM_OUT=P1^6; /*PWM信号输出位*/

bit n_ref_select_flag=0;//给定选择标识位

unsigned int n_feedback=0;

unsigned int n_ref=0;

unsigned int pwm_positive;//脉宽范围0~65536us,定时器0工作在方式1 unsigned int pwm_negtive;

float pwm_lou;//PWM占空比

unsigned int n_ref_key;

unsigned int n_ref_pot;

unsigned int motor_i_a;

unsigned char refled_buf[4];

unsigned char fdbled_buf[4];

unsigned char str[4];

main()

{

init_system();

while(1)

{

key_monitor();

put_on_refleds();

put_on_fdbleds();

}

}

/*系统初始化函数*/

void init_system(void)

{

AUXR=0xff;

TMOD=0x11;//T0,T1均工作在方式1

T2CON=0x03;//T2工作方式:计数器,捕获

pwm_positive=pwm_negtive=25000;//PWM占空比初始值0.5

TH0=(65536-pwm_positive)/256;//T0的计数初始值

TL0=(65536-pwm_positive)%256;//

EA=1;//开所有中断

ET0=1;//开PWM输出中断

TR0=1;//开PWM输出定时器

IP=0x0a;//设置中断优先级T0,T1高优先级

TH1=(65536-10000)/256;//T1的计数初始值10ms

TL1=(65536-10000)%256;

TR1=0;//关转速调节定时器

ET1=0;//关转速调节中断

ET2=0;//关测速计数器溢出中断

EX0=0;//关INT0中断

IT0=1;//INT0负边沿触发;

IT1=1;//INT1负边沿触发;

set_refled_buf('0',0,4);

set_fdbled_buf('0',0,4);

LastError=0; //Error[-1]

Proportion=0.000001; //比例常数Proportional Const Integral=0.00001; //积分常数Integral Const

pwm_lou=0.5;

str[0]='3';str[1]='0';str[2]='0';str[3]='0';

ET1=1;//开转速调节中断

}

/*段码查找函数*/

unsigned char get_strokes(unsigned char c)

{

unsigned char i=0;

while (led_strokes[i].ascii!=c) i++;

return (led_strokes[i].stroke);

}

/*将当前给定显示缓冲区字符显示到LED上*/ void put_on_refleds(void)

{

unsigned char pos;

unsigned char ledbit=0xfe;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

}

/*将当前转速反馈显示缓冲区字符显示到LED上*/ void put_on_fdbleds(void)

{

unsigned char pos;

unsigned char ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

}

/*若有键按下,对相应命令进行解释并转相应处理子程序*/

void key_monitor(void)

{

unsigned char key;

if (kbd_hit())

{

key=get_char();

switch (key)

{

case 'A': n_ref_key=atoi(str);TIMER1_CONTROL=1;break;

case 'B': n_ref_select_flag=~n_ref_select_flag;break;//切换

case 'C': pwm_positive=10000;pwm_negtive=10000;n_ref_key=3000;

TIMER1_CONTROL=1;break;//启动,开转速调节定时器case 'D': n_ref_select_flag=0;n_ref_key+=100;break;//加速

case 'E': n_ref_select_flag=0;n_ref_key-=100;break;//减速

case 'F': pwm_positive=10000;pwm_negtive=10000;n_ref_key=0;

set_refled_buf('0',0,4);set_fdbled_buf('0',0,4);

TIMER1_CONTROL=0;break;//停止,关转速调节定时器case '0': get_str(str,4);break;

default: ;

}

}

else

return;

}

/*判断是否有键按下函数*/

bit kbd_hit(void)

{

key_row=0x00;//往键盘行输出0

if ((key_col&0xff)==0xff)//检测列线

return((bit)0);

delay(8);//延时8ms消抖

if ((key_col&0xff)==0xff)//再次检测确认

return((bit)0);

else

return((bit)1);

}

/*等待按键函数*/

unsigned char get_char(void)

{

unsigned char row=0,col=0;

unsigned char key_value;

unsigned char scan_rowbyrow=0xfe;

/*分析按键行号*/

key_row=scan_rowbyrow;

while ((key_col&0xff)==0xff&&scan_rowbyrow>0xef) {

++row;

scan_rowbyrow=_crol_(scan_rowbyrow,1);

key_row=scan_rowbyrow;

}

/*分析按键列号*/

key_value=key_col&0xff;

scan_rowbyrow=0x01;

while (key_value&scan_rowbyrow)

{

++col;

scan_rowbyrow=_crol_(scan_rowbyrow,1);

}

/*等按键释放*/

while ((key_col&0xff)!=0xff);

delay(8);//延时8ms消抖

if ((key_col&0xff)==0xff)//再次检测确认

{

key_row=0xff;

/*计算按键值*/

key_value=row*4+col;

if (key_value<9)

key_value+='0'+1;

else if (key_value==9)

key_value='0';

else

key_value+='A'-10;

}

return(key_value);

}

/*取键盘字符串函数*/

unsigned char *get_str(unsigned char *str,unsigned int len) {

unsigned char i;

unsigned char ch;

unsigned char keyboard_buf[4];//键盘缓冲区unsigned char keybuf_pos=0;

TIMER1_CONTROL=0;

set_refled_buf('0',0,4);

while (keybuf_pos

{

put_on_refleds();

if (kbd_hit())

{

ch=get_char();

///*如果接收一个字符成功,将显示缓冲区原字符向左滚动一位,并将新字符放末尾,且送到键盘缓冲区*///

if (ch<'A')

{

for (i=0;i<3;i++) refled_buf[i]=refled_buf[i+1];

refled_buf[3]=ch;

put_on_refleds();

keyboard_buf[keybuf_pos]=ch;

keybuf_pos++;

}

}

}

memcpy(str,keyboard_buf,len);

return(str);

}

/*填充给定显示缓冲区*/

void set_refled_buf(unsigned char a,int pos,int len)

{

unsigned char ledbuf_pos;

for (ledbuf_pos=pos;len>0;len--)

{

refled_buf[ledbuf_pos]=((islower(a))?(toupper(a)):(a));

ledbuf_pos++;

if (ledbuf_pos>=4) ledbuf_pos=0;

}

}

/*填充转速反馈显示缓冲区*/

void set_fdbled_buf(unsigned char a,int pos,int len)

{

unsigned char ledbuf_pos;

for (ledbuf_pos=pos;len>0;len--)

{

fdbled_buf[ledbuf_pos]=((islower(a))?(toupper(a)):(a));

ledbuf_pos++;

if (ledbuf_pos>=4) ledbuf_pos=0;

};

}

/*PWM定时产生中断服务函数*/

void timer0(void) interrupt 1 using 1

{

PWM_OUT=~PWM_OUT;

if (PWM_OUT==0)

{

TH0=(65536-pwm_negtive)/256;

TL0=(65536-pwm_negtive)%256;

}

else

{

TH0=(65536-pwm_positive)/256;

TL0=(65536-pwm_positive)%256;

}

TIMER0_CONTROL=1;

return;

}

/* T1定时转速调节中断服务函数*/

void timer1(void) interrupt 3 using 1

{

/////刷新显示的变量/////

unsigned char pos;

unsigned char ledbit=0xfe;

//测速

n_feedback=n_test();

/*把整型数转换为字符型******************************/ if (n_feedback<10)

{

fdbled_buf[0] = (n_feedback+48);

fdbled_buf[1] = 48;

fdbled_buf[2] = 48;

fdbled_buf[3] = 48;

}

if (n_feedback<100)

{

fdbled_buf[0] = (n_feedback / 10+48);

fdbled_buf[1] = (n_feedback % 10+48);

fdbled_buf[2] = 48;

fdbled_buf[3] = 48;

}

if (n_feedback<1000)

{

fdbled_buf[0] = (n_feedback / 100 + 48);

fdbled_buf[1] = (n_feedback % 100 / 10 + 48);

fdbled_buf[2] = (n_feedback % 10 + 48);

fdbled_buf[3] = 48;

}

if (n_feedback < 10000)

{

fdbled_buf[0] = (n_feedback / 1000 + 48);

fdbled_buf[1] = (n_feedback % 1000 / 100 + 48);

fdbled_buf[2] = (n_feedback % 100 / 10 + 48);

fdbled_buf[3] = (n_feedback % 10 + 48);

}

else

{

fdbled_buf[0] = (n_feedback / 10000 + 48);

fdbled_buf[1] = (n_feedback % 10000 / 1000 + 48);

fdbled_buf[2] = (n_feedback % 1000 / 100 + 48);

fdbled_buf[3] = (n_feedback % 100 / 10 + 48);

}

/////刷新显示/////

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

//测电枢电流

motor_i_a=i_a_test();

///*****************///****************///*****************///************ ***///

if (motor_i_a>i_a_limit)//若过流则停止

{

pwm_positive=25000;

pwm_negtive=25000;

}

else///*****************///****************///

{

n_ref=read_nref();//读入转速给定

/*把整型数转换为字符型******************************/ if (n_ref<10)

{

refled_buf[0] = (n_ref+48);

refled_buf[1] = 48;

refled_buf[2] = 48;

refled_buf[3] = 48;

}

if (n_ref<100)

{

refled_buf[0] = (n_ref / 10+48);

refled_buf[1] = (n_ref % 10+48);

refled_buf[2] = 48;

refled_buf[3] = 48;

}

if (n_ref<1000)

{

refled_buf[0] = (n_ref / 100 + 48);

refled_buf[1] = (n_ref % 100 / 10 + 48);

refled_buf[2] = (n_ref % 10 + 48);

refled_buf[3] = 48;

}

if (n_ref < 10000)

{

refled_buf[0] = (n_ref / 1000 + 48);

refled_buf[1] = (n_ref % 1000 / 100 + 48);

refled_buf[2] = (n_ref % 100 / 10 + 48);

refled_buf[3] = (n_ref % 10 + 48);

}

else

{

refled_buf[0] = (n_ref / 10000 + 48);

refled_buf[1] = (n_ref % 10000 / 1000 + 48);

refled_buf[2] = (n_ref % 1000 / 100 + 48);

refled_buf[3] = (n_ref % 100 / 10 + 48);

}

/////刷新显示/////

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

/*PID控制算法调节PWM占空比以调节输出平均电压*/ //调节占空比

asr_pid(n_ref,n_feedback);

if (pwm_lou>0.99)

pwm_lou=0.99;

else if (pwm_lou<0.5005)

pwm_lou=0.5005;

pwm_positive=50000*pwm_lou;

pwm_negtive=50000-pwm_positive;

//存储误差,用于下次计算

//LastError=n_ref-n_feedback;

}

TH1=(65536-60000)/256;

TL1=(65536-60000)%256;

TIMER2_CONTROL=1;//启动定时器2,开始测速脉冲计数TIMER1_CONTROL=1;

return;

}

/*PID控制算法调节PWM占空比以调节输出平均电压*/ void asr_pid(unsigned int na,unsigned int nb)

{

int err=na-nb;

float delta_lou;

delta_lou = mptr->Proportion*err //E[k]项

-mptr->Integral*mptr->LastError //E[k-1]项

+mptr->Derivative*mptr->PrevError;//E[k-2]项

//调节占空比

pwm_lou+=delta_lou;

if (pwm_lou>1)

pwm_lou=1;

else if (pwm_lou<0)

pwm_lou=0;

pwm_positive=30000*pwm_lou;

pwm_negtive=30000-pwm_positive;

//存储误差,用于下次计算

mptr->PrevError = mptr->LastError;

mptr->LastError = err;

mptr->SumError+=err;

}

/*测速函数*/

unsigned int n_test(void)

{

unsigned int n_f;

unsigned int M1;

TIMER2_CONTROL=0;//停定时器2

M1=TH2*256+TL2;

n_f=60*M1;//*转速定时调节时间Tc=65ms,n_f=60*M1/16*Tc TH2=0;

TL2=0;

return(n_f);//返回转速

}

#include

#include

#include

#include

#include

#include

#define led_bit XBYTE[0x88ff] /*LED寻位地址*/

#define led_data XBYTE[0x09ff] /*LED数据地址*/

#define key_row XBYTE[0x0Aff] /*键盘行地址*/

#define key_col XBYTE[0x0Cff] /*键盘列地址*/

#define TIMER0_CONTROL TR0 /*定时器0控制位*/

#define TIMER1_CONTROL TR1 /*定时器1控制位*/

#define TIMER2_CONTROL TR2 /*定时器2控制位*/

#define i_a_limit 0x0D /*电枢限流0.5A*/

/*定义共阳极LED显示段码*/

struct {char ascii;char stroke;}led_strokes[27]={

{'0',0xc0},{'1',0xf9},{'2',0xa4},{'3',0xb0},{'4',0x99},{'5',0x92}, {'6',0x82},{'7',0xf8},{'8',0x80},{'9',0x90},{'A',0x88},{'b',0x83}, {'c',0xc6},{'d',0xa1},{'E',0x86},{'F',0x8e},{'.',0x7f},{'P',0x8c}, {'U',0xc1},{'T',0xce},{'y',0x91},{'o',0xa3},{'-',0xbf},{'=',0xb7}, {'r',0xaf},{0x00,0x00},{0xff,0xff}

};

/*定义PI控制器参数*/

float Proportion; //比例常数Proportional Const

float Integral; //积分常数Integral Const

float Derivative; //微分常数Derivative Const

int LastError; //E[k-1]

int PrrevError;//E[k-2]

/*定义全局函数和变量*/

void init_system(void);

void key_monitor(void);

void set_refled_buf(unsigned char a,int pos,int len);

void put_on_refleds(void);

void set_fdbled_buf(unsigned char a,int pos,int len);

void put_on_fdbleds(void);

void asr_pid(unsigned int na,unsigned int nb);

bit kbd_hit(void);

unsigned char get_char(void);

unsigned char *get_str(unsigned char *str,unsigned int len); unsigned char get_strokes(unsigned char c);

void adc0804_start(void);

unsigned int adc0804_read(void);

unsigned int n_test(void);

unsigned int i_a_test(void);

unsigned read_nref(void);

extern void delay(int);

sfr AUXR=0x8e;

sbit PWM_OUT=P1^6; /*PWM信号输出位*/

bit n_ref_select_flag=0;//给定选择标识位

unsigned int n_feedback=0;

unsigned int n_ref=0;

unsigned int pwm_positive;//脉宽范围0~65536us,定时器0工作在方式1 unsigned int pwm_negtive;

float pwm_lou;//PWM占空比

unsigned int n_ref_key;

unsigned int n_ref_pot;

unsigned int motor_i_a;

unsigned char refled_buf[4];

unsigned char fdbled_buf[4];

unsigned char str[4];

struct {int PrevError;int LastError;int SumError;

int Proportion; int Integral; int Derivative;}*mptr;

main()

{

init_system();

while(1)

{

key_monitor();

put_on_refleds();

put_on_fdbleds();

}

}

/*系统初始化函数*/

void init_system(void)

{

AUXR=0xff;

TMOD=0x11;//T0,T1均工作在方式1

T2CON=0x03;//T2工作方式:计数器,捕获

pwm_positive=pwm_negtive=25000;//PWM占空比初始值0.5

TH0=(65536-pwm_positive)/256;//T0的计数初始值

TL0=(65536-pwm_positive)%256;//

EA=1;//开所有中断

ET0=1;//开PWM输出中断

TR0=1;//开PWM输出定时器

IP=0x0a;//设置中断优先级T0,T1高优先级

TH1=(65536-10000)/256;//T1的计数初始值10ms

TL1=(65536-10000)%256;

TR1=0;//关转速调节定时器

ET1=0;//关转速调节中断

ET2=0;//关测速计数器溢出中断

EX0=0;//关INT0中断

IT0=1;//INT0负边沿触发;

IT1=1;//INT1负边沿触发;

set_refled_buf('0',0,4);

set_fdbled_buf('0',0,4);

LastError=0; //Error[-1]

Proportion=0.000001; //比例常数Proportional Const Integral=0.00001; //积分常数Integral Const

pwm_lou=0.5;

str[0]='3';str[1]='0';str[2]='0';str[3]='0';

ET1=1;//开转速调节中断

}

/*段码查找函数*/

unsigned char get_strokes(unsigned char c)

{

unsigned char i=0;

while (led_strokes[i].ascii!=c) i++;

return (led_strokes[i].stroke);

}

/*将当前给定显示缓冲区字符显示到LED上*/

void put_on_refleds(void)

{

unsigned char pos;

unsigned char ledbit=0xfe;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

}

/*将当前转速反馈显示缓冲区字符显示到LED上*/

void put_on_fdbleds(void)

{

unsigned char pos;

unsigned char ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

}

/*若有键按下,对相应命令进行解释并转相应处理子程序*/

void key_monitor(void)

{

unsigned char key;

if (kbd_hit())

{

key=get_char();

switch (key)

{

case 'A': n_ref_key=atoi(str);TIMER1_CONTROL=1;break;

case 'B': n_ref_select_flag=~n_ref_select_flag;break;//切换

case 'C': pwm_positive=10000;pwm_negtive=10000;n_ref_key=3000;

TIMER1_CONTROL=1;break;//启动,开转速调节定时器case 'D': n_ref_select_flag=0;n_ref_key+=100;break;//加速

case 'E': n_ref_select_flag=0;n_ref_key-=100;break;//减速

case 'F': pwm_positive=10000;pwm_negtive=10000;n_ref_key=0;

set_refled_buf('0',0,4);set_fdbled_buf('0',0,4);

TIMER1_CONTROL=0;break;//停止,关转速调节定时器case '0': get_str(str,4);break;

default: ;

}

}

else

return;

}

/*判断是否有键按下函数*/

bit kbd_hit(void)

{

key_row=0x00;//往键盘行输出0

if ((key_col&0xff)==0xff)//检测列线

return((bit)0);

delay(8);//延时8ms消抖

if ((key_col&0xff)==0xff)//再次检测确认

return((bit)0);

else

return((bit)1);

}

/*等待按键函数*/

unsigned char get_char(void)

{

unsigned char row=0,col=0;

unsigned char key_value;

unsigned char scan_rowbyrow=0xfe;

/*分析按键行号*/

key_row=scan_rowbyrow;

while ((key_col&0xff)==0xff&&scan_rowbyrow>0xef) {

++row;

scan_rowbyrow=_crol_(scan_rowbyrow,1);

key_row=scan_rowbyrow;

}

/*分析按键列号*/

key_value=key_col&0xff;

scan_rowbyrow=0x01;

while (key_value&scan_rowbyrow)

{

++col;

scan_rowbyrow=_crol_(scan_rowbyrow,1);

}

/*等按键释放*/

while ((key_col&0xff)!=0xff);

delay(8);//延时8ms消抖

if ((key_col&0xff)==0xff)//再次检测确认

{

key_row=0xff;

/*计算按键值*/

key_value=row*4+col;

if (key_value<9)

key_value+='0'+1;

else if (key_value==9)

key_value='0';

else

key_value+='A'-10;

}

return(key_value);

}

/*取键盘字符串函数*/

unsigned char *get_str(unsigned char *str,unsigned int len) {

unsigned char i;

unsigned char ch;

unsigned char keyboard_buf[4];//键盘缓冲区unsigned char keybuf_pos=0;

TIMER1_CONTROL=0;

set_refled_buf('0',0,4);

while (keybuf_pos

{

put_on_refleds();

if (kbd_hit())

ch=get_char();

///*如果接收一个字符成功,将显示缓冲区原字符向左滚动一位,并将新字符放末尾,且送到键盘缓冲区*///

if (ch<'A')

{

for (i=0;i<3;i++) refled_buf[i]=refled_buf[i+1];

refled_buf[3]=ch;

put_on_refleds();

keyboard_buf[keybuf_pos]=ch;

keybuf_pos++;

}

}

}

memcpy(str,keyboard_buf,len);

return(str);

}

/*填充给定显示缓冲区*/

void set_refled_buf(unsigned char a,int pos,int len)

{

unsigned char ledbuf_pos;

for (ledbuf_pos=pos;len>0;len--)

{

refled_buf[ledbuf_pos]=((islower(a))?(toupper(a)):(a));

ledbuf_pos++;

if (ledbuf_pos>=4) ledbuf_pos=0;

}

}

/*填充转速反馈显示缓冲区*/

void set_fdbled_buf(unsigned char a,int pos,int len)

{

unsigned char ledbuf_pos;

for (ledbuf_pos=pos;len>0;len--)

{

fdbled_buf[ledbuf_pos]=((islower(a))?(toupper(a)):(a));

ledbuf_pos++;

if (ledbuf_pos>=4) ledbuf_pos=0;

};

}

/*PWM定时产生中断服务函数*/

void timer0(void) interrupt 1 using 1

{

PWM_OUT=~PWM_OUT;

if (PWM_OUT==0)

TH0=(65536-pwm_negtive)/256;

TL0=(65536-pwm_negtive)%256;

}

else

{

TH0=(65536-pwm_positive)/256;

TL0=(65536-pwm_positive)%256;

}

TIMER0_CONTROL=1;

return;

}

/* T1定时转速调节中断服务函数*/

void timer1(void) interrupt 3 using 1

{

/////刷新显示的变量/////

unsigned char pos;

unsigned char ledbit=0xfe;

//测速

n_feedback=n_test();

/*把整型数转换为字符型******************************/ if (n_feedback<10)

{

fdbled_buf[0] = (n_feedback+48);

fdbled_buf[1] = 48;

fdbled_buf[2] = 48;

fdbled_buf[3] = 48;

}

if (n_feedback<100)

{

fdbled_buf[0] = (n_feedback / 10+48);

fdbled_buf[1] = (n_feedback % 10+48);

fdbled_buf[2] = 48;

fdbled_buf[3] = 48;

}

if (n_feedback<1000)

{

fdbled_buf[0] = (n_feedback / 100 + 48);

fdbled_buf[1] = (n_feedback % 100 / 10 + 48);

fdbled_buf[2] = (n_feedback % 10 + 48);

fdbled_buf[3] = 48;

}

if (n_feedback < 10000)

{

fdbled_buf[0] = (n_feedback / 1000 + 48);

fdbled_buf[1] = (n_feedback % 1000 / 100 + 48);

fdbled_buf[2] = (n_feedback % 100 / 10 + 48);

fdbled_buf[3] = (n_feedback % 10 + 48);

}

else

{

fdbled_buf[0] = (n_feedback / 10000 + 48);

fdbled_buf[1] = (n_feedback % 10000 / 1000 + 48);

fdbled_buf[2] = (n_feedback % 1000 / 100 + 48);

fdbled_buf[3] = (n_feedback % 100 / 10 + 48);

}

/////刷新显示/////

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

//测电枢电流

motor_i_a=i_a_test();

///*****************///****************///*****************///***************/// if (motor_i_a>i_a_limit)//若过流则停止

{

pwm_positive=25000;

pwm_negtive=25000;

}

else///*****************///****************///

{

n_ref=read_nref();//读入转速给定

/*把整型数转换为字符型******************************/

if (n_ref<10)

{

refled_buf[0] = (n_ref+48);

refled_buf[1] = 48;

refled_buf[2] = 48;

refled_buf[3] = 48;

}

if (n_ref<100)

{

refled_buf[0] = (n_ref / 10+48);

refled_buf[1] = (n_ref % 10+48);

refled_buf[2] = 48;

refled_buf[3] = 48;

}

if (n_ref<1000)

{

refled_buf[0] = (n_ref / 100 + 48);

refled_buf[1] = (n_ref % 100 / 10 + 48); refled_buf[2] = (n_ref % 10 + 48);

refled_buf[3] = 48;

}

if (n_ref < 10000)

{

refled_buf[0] = (n_ref / 1000 + 48);

refled_buf[1] = (n_ref % 1000 / 100 + 48); refled_buf[2] = (n_ref % 100 / 10 + 48); refled_buf[3] = (n_ref % 10 + 48);

}

else

{

refled_buf[0] = (n_ref / 10000 + 48);

refled_buf[1] = (n_ref % 10000 / 1000 + 48); refled_buf[2] = (n_ref % 1000 / 100 + 48); refled_buf[3] = (n_ref % 100 / 10 + 48);

}

/////刷新显示/////

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(refled_buf[pos]); delay(1);//延时1ms

ledbit=_crol_(ledbit,1);

}

ledbit=0xef;

for (pos=0;pos<4;pos++)

{

led_bit=ledbit;

led_data=get_strokes(fdbled_buf[pos]);

直流电机设计开发培训资料

一、馬達型號介紹 二、微型DC馬達之應用 一般地,微型DC馬達的使用範圍相當之廣泛.根據其使用用途,大致可分為以下幾方面: 三、成品編號系統 四、DC馬達性能曲線圖之理解方法 4.1 從DC馬達之性能曲線圖,可確定在不同工作點上之馬達性能,現簡述其專用符號: No:空載轉速(rpm) Ts:堵轉力矩(g.cm)

Io:空載電流(A) Is:堵轉電流(A)

輸出功率曲線理論上是 2 Ts 為功率最大,並中心對稱. 任意一點輸出功率方程為:97500 ) .()()(cm g T rpm N W P ?= 4.2.3效率曲線: 100%I(輸入功率/W) V P(輸出功率/W) η(%)??= 4.3 性能曲線圖判定其工作點性能方法 a) 當力矩已知時,在橫軸力矩點上劃作垂直線,在與N,I,η相交點取各數值. b) 當力矩為未知值時,先用電流表量出馬達動作時之工作電流,並將該值點上電流線上,以該點劃出垂直線和力矩刻度為其工作點力矩,其餘數值同a)方法找出. 五、直流馬達的性能調節 V →端子電壓;R →馬達電阻; 5.1 改變馬達端子電壓調節性能 5.2 改變馬達電阻調節性能 5.3 改變馬達磁力強度調節性能 下面就此三種方式對馬達性能的影響進行簡要的分析: 5.1 改變馬達端子電壓調節性能 5.1.1 如果供電電源是恆壓電源,那麼改變馬達端子電壓,則馬達機械特性曲線(即速度曲線)將平行移動.改變電壓前後的馬達空載轉速比,堵轉扭力比,堵轉電流比均與電壓比成正比,而空載電流可近視認為相等。 Io o I ≈' V V Is s I '? =' V V Ts s T '? =' 最高效率max max ηη?' 注以上電壓的改變量須在馬達性能的承受的範圍內. 5.1.2 No o N ='V V No o N '? ='V Io I ='

无刷直流电机驱动器说明书

无刷直流电机驱动器说 明书 -CAL-FENGHAI.-(YICAI)-Company One1

无刷驱动器DBLS-02 一概述: 本控制驱动器为闭环速度型控制器,采用最近型IGBT和MOS功率器,利用直流无刷电机的霍尔信号进行倍频后进行闭环速度控制,控制环节设有PID速度调节器,系统控制稳定可靠,尤其是在低速下总能达到最大转矩,速度控制范围150~10000rpm。 二产品特征: 1、 PID速度、电流双环调节器 2、高性能低价格 3、 20KHZ斩波频率 4、电气刹车功能,使电机反应迅速 5、过载倍数大于2,在低速下转矩总能达到最大 6、具有过压、欠压、过流、过温、霍尔信号非法等故障报警功能 三电气指标 标准输入电压:24VDC~48VDC,最大电压不超过60VDC。 最大输入过载保护电流:15A、30A两款 连续输出电流:15A加速时间常数出厂值:秒其他可定制 四端子接口说明 : 1、电源输入端: 引角序号引角名中文定义 1V+直流+24~48VDC输入 2GND GND输入 引角序号引角名中文定义 1MA电机A相

2MB电机B相 3MC电机C相 4GND地线 5HA霍尔信号A相输入端 6HB霍尔信号B相输入端 7HC霍尔信号C相输入端 8+5V霍尔信号的电源线 GND:信号地F/R:正、反转控制,接GND反转,不接正转,正反转切换时,应先关断ENEN:使能控制:EN接地,电机转(联机状态),EN不接,电机不转(脱机状态)BK:刹车控制:当不接地正常工作,当接地时,电机电气刹车,当负载惯量较大时,应采用脉宽信号方式,通过调整脉宽幅值来控制刹车效果。SV ADJ:外部速度衰减:可以衰减从0~100%,当外部速度指令接时,通过该电位器可以调速试机PG:电机速度脉冲输出:当极对数为P时,每转输出6P个脉冲(OC门输入)ALM:报警输出:当电路处于报警状态时,输出低电平(OC门输出)+5V:调速电压输出,可用电位器在SV和GND形成连续可调内置电位器:调节电机速度增益,可以从0~100%范围内调速。 五驱动器与无刷电机接线图

直流电机设计程序

直流电机设计程序 3.1 主要指标 1. 额定电压 2. 额定功率 3. 额定转速 4. 额定效率 3.2 主要尺寸的确定 5. 结构型式的选择 6. 永磁材料的选择 选用烧结钕铁硼 7. 极弧系数 8. 电负荷 9. 长径比 10. 计算功率 11. 电枢直径 12. 极数 p=4 13. 极距 14. 电枢长度 cm D L a a 5.10157.0=?==λW P p N N N 76678.0378.021321'=??+=+=ηηcm D cm n B A p D a N i a 151.157.06006.0906.0766101.6'''101.63333==??????=??=取 λαδcm p D 89.54 21514.32=??==πτ

15. 气隙 δ=0.06cm 16. 电枢计算长度 3.3 绕组设计 17. 绕组形式 选用单叠绕组 18. 绕组并联支路对数 a=p=4 19. 槽数 20. 槽距 21. 预计气隙磁通 22. 电枢电动势 23. 预计导体总数 24. 每槽导体数 25. 每槽元件匝数 式中 每槽元件数 u=2 26. 实际每槽导体数 cm L L a ef 62.1006.025.102=?+=+=δ45 1533=?==a D Q cm Q D t a 05.145 1514.32=?==πwb B L ef i 34 4 1025.2106.062.1089.56.010''-?=????=?=ΦδταδV U E N N a 48.203 78 .021321=?+=+=η910 600 1025.2448 .20460'60'3=?????=Φ= -N a n p aE N δ2 .2045 910''===Q N N s 5 05.52 22.202''==?== s s W u N W 取20 5222=??==s s uW N

无刷直流电机的驱动及控制

无刷直流电机驱动 James P. Johnson, Caterpiller公司 本章的题目是无刷直流电动机及其驱动。无刷直流电动机(BLDC)的运行仿效了有刷并励直流电动机或是永磁直流电动机的运行。通过将原直流电动机的定子、转子内外对调—变成采用包含电枢绕组的交流定子和产生磁场的转子使得该仿效得以可能。正如本章中要进一步讨论的,输入到BLDC定子绕组中的交流电流必须与转子位置同步更变,以便保持磁场定向,或优化定子电流与转子磁通的相互作用,类似于有刷直流电动机中换向器、电刷对绕组的作用。该原理的实际运用只能在开关电子学新发展的今天方可出现。BLDC电机控制是今天世界上发展最快的运动控制技术。可以预见,随着BLDC的优点愈益被大家所熟知且燃油成本持续增加,BLDC必然会进一步广泛运用。 2011-01-30 23.1 BLDC基本原理 在众文献中无刷直流电动机有许多定义。NEMA标准《运动/定位控制电动机和控制》中对“无刷直流电动机”的定义是:“无刷直流电动机是具有永久磁铁转子并具有转轴位置监测来实施电子换向的旋转自同步电机。不论其驱动电子装置是否与电动机集成在一起还是彼此分离,只要满足这一定义均为所指。”

图23.1 无刷直流电机构形 2011-01-31 若干类型的电机和驱动被归类于无刷直流电机,它们包括: 1 永磁同步电机(PMSMs); 2 梯形反电势(back - EMF)表面安装磁铁无刷直流电机; 3 正弦形表面安装磁铁无刷直流电机; 4 内嵌式磁铁无刷直流电机; 5 电机与驱动装置组合式无刷直流电机; 6 轴向磁通无刷直流电机。 图23.1给出了几种较常见的无刷直流电机的构形图。永磁同步电机反电势是正弦形的,其绕组如同其他交流电机一样通常不是满距,或是接近满距的集中式绕组。许多无刷直流电

直流电机控制系统设计

直流电机控制系统设计

XX大学 课程设计 (论文) 题目直流电机控制系统设计 班级 学号 学生姓名 指导教师

沈阳航空航天大学 课程设计任务书 课程名称专业基础课程设计 院(系)自动化学院专业测控技术与仪器 班级学号姓名 课程设计题目直流电机控制系统设计 课程设计时间: 2012年7 月9 日至2012年7 月20 日 课程设计的内容及要求: 1.内容 利用51单片机开发板设计并制作一个直流电机控制系统。系统能够实时控制电机的正转、反转、启动、停止、加速、减速等。 2.要求 (1)掌握直流电机的工作原理及编程方法。 (2)掌握直流电机驱动电路的设计方法。 (3)制定设计方案,绘制系统工作框图,给出系统电路原理图。 (4)用汇编或C语言进行程序设计与调试。 (5)完成系统硬件电路的设计。 (6)撰写一篇7000字左右的课程设计报告。 指导教师年月日 负责教师年月日

学生签字年月日 目录 0 前言 (1) 1 总体方案设计 (2) 1.1 系统方案 (2) 1.2 系统构成 (2) 1.3 电路工作原理 (2) 1.4 方案选择 (3) 2 硬件电路设计 (3) 2.1 系统分析与硬件设计 (3) 2.2 单片机AT89C52 (3) 2.3 复位电路和时钟电路 (4) 2.4 直流电机驱动电路设计 (4) 2.5 键盘电路设计 (4) 3软件设计 (5) 3.1 应用软件的编制和调试 (5) 3.2 程序总体设计 (5) 3.3 仿真图形 (7) 4 调试分析 (9) 5 结论及进一步设想 (9) 参考文献 (10) 课设体会 (11) 附录1 电路原理图 (12) 附录2 程序清单 (13)

无刷直流永磁电动机设计流程和实例

无刷直流永磁电动机设计实例 .主要技术指标 1. 额定功率:P N=30W 2. 额定电压:U N =48V,直流 3. 额定电流:l N:::1A 3. 额定转速:n N =10000r/min 4. 工作状态:短期运行 5. 设计方式:按方波设计 6. 外形尺寸:0.036 0.065m ?主要尺寸的确定 1. 预取效率—-0.63、 2. 计算功率p 直流电动机P' - =0.85 30-40.48W ,按陈世坤书 n N 0.63 长期运行P u丄丄P N 3叩 短期运行P -?丄P N 4们 3. 预取线负荷A =11000A/m 4?预取气隙磁感应强度B§=0.55T 5. 预取计算极弧系数:-=0.8 6. 预取长径比(L/D)入’=2

7 ?计算电枢内径 根据计算电枢内径取电枢内径值 。衬=1.4 10 ° m 8. 气隙长度:=0.7 10 "m 9. 电枢外径 D j =2.95 10,m 10. 极对数p=1 11. 计算电枢铁芯长 L 、,D i1=2 1.4 10^ =2.8 10^m 根据计算电枢铁芯长取电枢铁芯长 L= 2.8 10^m 2 ■ Di1 3.14 1.4 10 T = ---------------------------------- = 2p 2 13.输入永磁体轴向长Lm =L =2.8 10,m ?定子结构 1. 齿数 Z=6 2. 齿距 3 "「 4 10 J .733 10% 3. 槽形选择 梯形口扇形槽, 见下 图。 4. 预估齿宽:b t = d 』 733 汩 °. 55 7294 10讣,B t 可由 1.43 0.96 BZ 5. 设计者经验得 1.43T , b t 由工艺取 0.295 10'm 预估轭高:h j1 礙 22 0.8 O. 55 = O .323 10,m 2IB j1K Fe 2K Fe B j1 2 0.96 1.56 B j1可由设计者经验得1.53T , h j1由工艺取0.325 10'm 根据齿宽和轭高作出下图,得到具体槽形尺寸 6.1P 「 6.1 40.48 ‘■: ?工 i A s B/ n N 3 10.8 11000 0.55 2 10000 = 1.37 10-m 12.极距 __2 = 2.2 10 m 3

无刷直流电机软件的设计

4.3 控制器软件设计 软件设计是控制系统最重要的一个组成部分,软件设计的好坏直接关系着整个控制系统性能的优良,控制系统的软件设计一定要具备实时性、可靠性和易维护性,对此,选择一款简单、方便的开发环境对于系统软件的整体优化以及提高整个系统的开发效率有很大的影响。目前支持STM 32系列控制芯片且应用比较广泛的主要有IAR EWARM和KEIL MDK这两个集成开发环境,本文采用的开发环境是KEIL MDK,它是ARM 公司推出的嵌入式微控制器开发软件,集成了业界领先的Vision 4开发平台,具有良好的性能,是ARM开发工具中的最好的选择,适合于不同层次的开发人员使用,尤其是它与我们经常使用的51单片机开发环境Keil C51的整体布局和使用方法类似,只有一些地方不同,操作起来比较熟练,很容易上手,极大的减小了开发人员的使用难度,缩短了开发周期,提高了开发效率,因此这款KEIL MDK得到了很多人的认可。 STM 32的软件开发主要开发方式有2种,就是基于寄存器的开发和基于库函数的开发,其中基于寄存器的开发方式就更51单片机的开发差不多,它是通过直接操作芯片内部的各个寄存器来达到控制芯片的目地,这种方式较直观,程序运行占用的资源少,但对于STM 32这种寄存器数目非常多的芯片来说,采用寄存器的开发方式会减慢开发速度,还让程序可读性降低。而基于库函数的开发方式则是对寄存器的封装,它向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口,这种方式大大降低了使用STM 32的条件,不仅提高了开发效率,而且程序还具有很好的可读性和移植性,因此本文采用的是基于库函数的开发方式,编程语言全采用 C 语言。

无刷直流电机驱动器原理精编版

图1 第2章 无刷直流电机的驱动原理 2.1 驱动方式的理论分析 一、主要器件MOSFET MOSFET 又称金属-氧化物半导体场效应晶体管,可分为N 型和P 型两种,又被称为 NMOSFET 与PMOSFET 。 如图1所示,一块P 型硅 半导体材料作衬底, 在其面上扩散了两个N 型区,再在上面覆盖一层二氧 化硅(SiO2)绝缘层,最后在N 区上方用腐蚀的方法 做成两个孔,用金属化的方法分别在绝缘层上及两个 孔内做成三个电极:G(栅极)、S (源极)及D (漏极), 如图所示。在驱动器上用到的MOSFET 是在其上反并 联一个二极管,该二极管通常被称为寄生二极管。由 于添加了二极管的缘故,从而使其没有了反向电压阻 断的能力。一般使用时在栅源极间施加一个-5V 的反向偏执电压,目的是为了保证是器件导通,噪声电压必须阈值门控(栅 极)电压和负偏置电压之和。 MOSFET 的使用方法和三极管的使用方法几乎类似,都是采用小电 流的方式来控制大电流,这在模拟电路中经常用到。如图2所示,在 无刷电机驱动器中使用MOSFET 主要是在MOSFET 的栅源极施加一个寄 生二极管。 二、单相半波逆变器原理 如图3所示是单相半波逆变器的原理图。对其工 作状态分析如下: 第一个工作状态,v1导通,负载电压等于Ud/2,从而 使负载电流与电压同向。 第二个工作状态,v2关短后,负载电流流向vd2,使 得负载上的电压变为-Ud/2。但随着时间的推移会使 负载的电流最终变为0。 第三个工作状态,v2导通,使得负载中出现了负电 压和负电流。 第四个工作状态,v2关断造成vd2正向偏置,得负 载电压变为Ud/2。 如果电压为横坐标u ,电流为竖坐标i 的话,那 么通过上面四个状态就可以是电流和电压在四个象限内轮流工作。因此,采用一定的方法通过控制v1 和v2的导通时间就可以达到控制负载上电流和电压按照一定的频率来轮换着工作。 但是上面的变换有一些缺点。例如,在任何时刻加载在负载上的电压都是全部电压的一半。假如咋某个时刻对于功率额定的器件,电压减半后会使电流变为原来的两倍,同时又欧姆定律可知这时的发热会变为原来的次方倍。这对于器件来说会造成更大的风险。另外电压只能在最大电压的一半,没办法为0V ,那就会是器件造成更大的波纹度。 图2 图3 图2

直流电机控制原理及C程序

项目八键盘控制电机方向和转速 【教学目标】 终极目标 能利用AT89S52单片机及独立键盘,通过C语言程序实现键盘控制步进电机和直流电机的速度和方向,完成单片机输入输出控制系统的设计、运行及调试。 促成目标 1. 了解单片机产品开发的流程; 2. 了解步进电机和直流电机结构和工作原理; 3. 掌握步进电机和直流电机速度、方向控制关键技术; 4. 掌握头文件的编写方法; 5. 掌握电机速度、方向控制的电路设计和编程的方法; 6. 会利用单片机I/O口实现电机速度、方向控制。 8.1 单片机产品开发 单片机产品开发是为完成某项任务而研制开发的单片机应用系统,是以单片机为核心,配以外围电路和软件,能实现确定任务、功能的实际应用系统。根据不同的用途和要求,单片机产品的系统配置及软件也有所不同,但它们的开发流程和方法大致相同。 8.1.1 单片机产品的结构 单片机产品是由硬件和软件组成。硬件是指单片机、扩展的存储器、输入输出设备等硬件部件组成的,软件是各种工作程序的总称。一个典型单片机产品结构如图8-1所示。 图8-1典型单片机产品结构

从图8-1不难看出单片机产品所需要的一般配置: (1)单片机。如AT89C51、AT89C52、AT89S51以及AT89S52等单片机。 (2)人机交流设备。输入设备有键盘和按键,输出设备有数码管、液晶显示模块和指示灯等。 (3)信号采集的输入通道。如出租车的测距、测速装置,温控系统的温度传感器、洗衣机的水位测量等设备。 (4)向操作对象发出各种控制信号的输出通道。如空调启动压缩机的开关电路,控制彩电的频道切换、颜色、音量等的接口电路。 (5)与其他计算机系统或智能设备实现信息交换,还需配置通信接口电路。如RS-232、RS-485等。 (6)有时还需扩展外部RAM、EEPROM用于存放数据。如彩电遥控系统中存放系统数据的存储器。 8.1.2 单片机产品开发流程 1.确定功能技术指标 单片机产品开发流程是以确定产品的功能和技术指标开始的。 首先要细致分析、研究实际问题,明确各项任务与要求,综合考虑系统的先进性、可靠性、可维护性以及成本、经济效益,拟订出合理可行的技术性能指标。 2.单片机产品总体设计 在对单片机产品进行总体设计时,应根据单片机产品提出的各项技术性能指标,拟订出性价比最高的一套方案。 首先,应根据任务的繁杂程度和技术指标要求选择机型。选定机型后,再选择产品中要用到的其它外围元器件,如传感器、执行器件等。 在总体方案设计过程中,对软件和硬件进行分工是一个首要的环节。原则上,能够由软件来完成的任务就尽可能用软件来实现,以降低硬件成本,简化硬件结构。同时,还要求大致规定各接口电路的地址、软件的结构和功能、上下位机的通信协议、程序的驻留区域及工作缓冲区等。总体方案一旦确定,系统的大致规模及软件的基本框架就确定了。 3.硬件设计 硬件设计是指应用系统的电路设计,包括主机、控制电路、存储器、I/O接口、A/D和D/A转换电路等。硬件设计时,应考虑留有充分余量,电路设计力求正确无误,因为在系统调试中不易修改硬件结构。硬件电路设计时应注意以下几个问题: (1)程序存储器 一般可选用容量较大的EPROM芯片,如27128(16 KB)、27256(32 KB)或27512(64 KB)等。尽量避免用小容量的芯片组合扩充成大容量的存储器,程序存储器容量大些,则编程空间宽裕些,价格相差也不会太多。 (2)数据存储器和I/O接口 根据系统功能的要求,如果需要扩展外部RAM或I/O口,那么RAM芯片可选用6116(2 KB)、6264(8 KB)或62256(32 KB),原则上应尽量减少芯片数量,使译码电路简单。 I/O接口芯片一般选用8155(带有256 KB静态RAM)或8255。这类芯片具有口线多、硬件逻辑简单等特点。若口线要求很少,且仅需要简单的输入或输出功能,则可用不可编程的TTL电路或CMOS电路。

无刷电机驱动器

常州工学院 课程设计报告 课题:无刷电机驱动器 班级: 姓名: 学号: 指导老师:王雁平

目录 1 直流无刷无霍尔电机原理 (1) 2 总体设计方案 (3) 3 硬件设计 (4) 3.1 电源模块 (4) 3.2 驱动电路 (5) 4 心得体会 (6) 5 附录 (6) 5.1 元件清单 (6) 5.2 原理图 (7) 5.3 PCB图 (9)

1、直流无刷无霍尔电机原理 无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。电动机的定子绕组多做成三相对称星形接法,同三相异步电动机十分相似。电动机的转子上粘有已充磁的永磁体,为了检测电动机转子的极性,在电动机内装有位置传感器。驱动器由功率电子器件和集成电路等构成,其功能是:接受电动机的启动、停止、制动信号,以控制电动机的启动、停止和制动;接受位置传感器信号和正反转信号,用来控制逆变桥各功率管的通断,产生连续转矩;接受速度指令和速度反馈信号,用来控制和调整转速;提供保护和显示等等。普通直流电动机的电枢在转子上,而定子产生固定不动的磁场。为了使直流电动机旋转,需要通过换向器和电刷不断改变电枢绕组中电流的方向,使两个磁场的方向始终保持相互垂直,从而产生恒定的转矩驱动电动机不断旋转。无刷直流电动机为了去掉电刷,将电枢放到定子上去,而转子制成永磁体,这样的结构正好和普通直流电动机相反;然而,即使这样改变还不够,因为定子上的电枢通过直流电后,只能产生不变的磁场,电动机依然转不起来。为了使电动机转起来,必须使定子电枢各相绕组不断地换相通电,这样才能使定子磁场随着转子的位置在不断地变化,使定子磁场与转子永磁磁场始终保持左右的空间角,产生转矩推动转子旋转。

永磁直流电机设计

永磁直流電機設計 1.電機主要尺寸與功率,轉速的關系: 與異步電機相似,直流電機的功率,轉速之間的關系是: D22*Lg=6.1*108*p’/(αP*A*Bg*Ky*n) (1) D2 電樞直徑(cm) 電机初設計時的主要尺寸 Lg 電樞計算長度(cm) 根據電机功率和實際需要確定 p’計算功率(w) p’=E*Ia=(1+2η)*P N/3η E=Ce*Φ*n*Ky=(P*N/60*a)*Φ2*n*Ky*10-8 Ce 電勢系數 a 支路數在小功率電機中取a=2 p 极數在小功率電機中取p=2 N 電樞總導体數 n 電机額定轉速 Ky 電樞繞組短矩系數小功率永磁電机p=2時,采用單疊繞組Ky=Sin[(y1/τ)*π/2] y1繞組第一節矩 αP 極弧系數一般取αP=0.6~0.75 正弦分布時αP=0.637 Φ每極磁通Φ=αP*τ*Lg*Bg τ極矩(cm) τ=π*D2/P Bg 氣隙磁密(Gs) 又稱磁負荷對鋁鎳Bg=(0.5~0.7) Br 對鐵氧体Bg=(0.7~0.85) Br, Br為剩磁密度 A 電樞線負荷 A=Ia*N/(a*π*D2)Ia電樞額定電流對連續運行的永磁電動机,一般取A=(30~80)A/cm另外電機負荷Δ= Ia/(a*Sd),其中Sd=π*d2/4 d為導線直徑.為了保証發熱因子A*Δ≦1400 (A/cm*A/mm2 )通常以電樞直徑D2和電樞外徑La作為電机主要尺寸,而把電動機的輸出功率和轉睦為電机的主要性能,在主要尺寸和主要性能的基礎上,我們就可以設計電機了. 在(1)式的基礎上經過變換可為:

D22*Lg*n/P’=(6.1*108/π2)*1/(αP*Bg*A)=C A 由上式可以看, C A的值並不取決於電機的容量和轉速,也不直接與電樞直徑和長度有關,它 僅取決於氣隙的平均磁密及電樞線負荷,而Bg和A的變化很小,它近似為常數,通常稱為電機 常數,它的導數K A=1/C A=(p’/n)/(D22* Lg)∞αP*Bg*A 稱為電機利用系數,它是正比於單位電 樞有效体積產生的電磁轉矩的一個比例常數. 2.直流電機定子的確定 2.1磁鋼內徑 根據電機電樞外徑D2確定磁鋼內徑 Dmi=D2+2g+2Hp 其中g為氣隙長度,小功率直流電機g=0.02-0.06cm ,鐵氧體時g可取得大些,鋁鎳鈷磁 鋼電機可取得較小,因鐵氧體H C較大.氣隙對電機的性能有很大的影響,較小的g可以使電樞 反應引起的氣隙磁場畸變加劇,使電機的換向不良加劇,及電機運行不穩定,主極表面損耗和 噪音加劇,以及電樞撓度加大,較大的氣隙,使電機效率下降,溫升提高. 有時電機磁鋼采用極靴,這樣可以起聚磁作用,提高氣隙磁密,還可稠節極靴 形狀以改善空載氣隙磁場波形,負載時交軸電樞反應磁通經極靴閉,合對永磁磁 極的影響較小.但這樣會使磁鋼結構复雜,制造成本增加,漏磁系數較大,外形尺 寸增加,負載時氣隙磁場的畸變較大.而無極靴時永磁體直接面向氣隙,漏磁系數小,能產生較多的磁通,材料利用率高,氣隙磁場畸變,而且結構簡單,便於生產. 其缺點是容易引起不可逆退磁現象. Hp 極靴高(cm) 無極靴結構時Hp=0 2.2磁鋼外徑 Dm0=Dmi+2Hm (瓦片形結構) Hm 永磁體磁路長度,它的尺寸應從滿足(1)有足夠的氣隙磁密(產生不可逆退磁),(2)在要求的任何情運行狀態下會形成永久性退磁等方面來確定,一般Hm=(5~15)g Hm越大,則氣隙磁密也越大,否則,則氣隙磁密也越小. 2.3磁鋼截面積Sm 對于鐵氧體由于Br小,則Sm取較大值,而對于鋁鎳鈷來說, Br較大,則Sm取小值. 環形鐵氧體磁鋼截面積: Sm=αP*π*(Dmi+Hm)Lg/P (cm)

无刷直流电机控制系统的设计

1引言无刷直流电机最本质的特征是没有机械换向器和电刷所构成的机械接触式换向机构。现在,无刷直流电机定义有俩种:一种是方波/梯形波直流电机才可以被称为无刷直流电机,而正弦波直流电机则被认为是永磁同步电机。另一种是方波/梯形波直流电机和正弦波直流电机都是无刷直流电机。国际电器制造业协会在1987年将无刷直流电机定义为“一种转子为永磁体,带转子位置信号,通过电子换相控制的自同步旋转电机”,其换相电路可以是独立的或集成于电机本体上的。本次设计采用第一种定义,把具有方波/梯形波无刷直流电机称为无刷直流电机。从20世纪90年代开始,由于人们生活水平的不断提高和现代化生产、办公自动化的发展,家用电器、工业机器人等设备都向着高效率化、小型化及高智能化发展,电机作为设备的重要组成部分,必须具有精度高、速度快、效率高等优点,因此无刷直流电机的应用也发展迅速[1]。 1.1 无刷直流电机的发展概况 无刷直流电动机是由有刷直流电动机的基础上发展过来的。 19世纪40年代,第一台直流电动机研制成功,经过70多年不断的发展,直流电机进入成熟阶段,并且运用广泛。 1955年,美国的D.Harrison申请了用晶体管换相线路代替有刷直流电动机的机械电刷的专利,形成了现代无刷直流电动机的雏形。 在20世纪60年代初,霍尔元件等位置传感器和电子换向线路的发现,标志着真正的无刷直流电机的出现。 20世纪70年代初,德国人Blaschke提出矢量控制理论,无刷直流电机的性能控制水平得到进一步的提高,极大地推动了电机在高性能领域的应用。 1987年,在北京举办的德国金属加工设备展览会上,西门子和博世两公司展出了永磁自同步伺服系统和驱动器,引起了我国有关学者的注意,自此我国开始了研制和开发电机控制系统和驱动的热潮。目前,我国无刷直流电机的系列产品越来越多,形成了生产规模。 无刷直流电动机的发展主要取决于电子电力技术的发展,无刷直流电机发展的初期,由于大功率开关器件的发展处于初级阶段,性能差,价格贵,而且受永磁材料和驱动控制技术的约束,这让无刷直流电动机问世以后的很长一段时间内,都停

无刷直流永磁电动机设计流程和实例

无刷直流永磁电动机设计实例 一. 主要技术指标 1. 额定功率:W 30P N = 2. 额定电压:V U N 48=,直流 3. 额定电流:A I N 1< 3. 额定转速:m in /10000r n N = 4. 工作状态:短期运行 5. 设计方式:按方波设计 6. 外形尺寸:m 065.0036.0?φ 二. 主要尺寸的确定 1. 预取效率63.0='η、 2. 计算功率i P ' 直流电动机 W P K P N N m i 48.4063 .030 85.0'=?= = η,按陈世坤书。 长期运行 N i P P ?'' += 'ηη321 短期运行 N i P P ?'' += 'η η431 3. 预取线负荷m A A s /11000'= 4. 预取气隙磁感应强度T B 55.0'=δ 5. 预取计算极弧系数8.0=i α 6. 预取长径比(L/D )λ′=2

7.计算电枢内径 m n B A P D N s i i i 233 11037.110000 255.0110008.048 .401.61.6-?=?????=''''='λαδ 根据计算电枢内径取电枢内径值m D i 21104.1-?= 8. 气隙长度m 3107.0-?=δ 9. 电枢外径m D 211095.2-?= 10. 极对数p=1 11. 计算电枢铁芯长 m D L i 221108.2104.12--?=??='='λ 根据计算电枢铁芯长取电枢铁芯长L= m 2108.2-? 12. 极距 m p D i 22 1 102.22 104.114.32--?=??==πτ 13. 输入永磁体轴向长m L L m 2108.2-?== 三.定子结构 1. 齿数 Z=6 2. 齿距 m z D t i 22 1 10733.06 104.114.3--?=??==π 3. 槽形选择 梯形口扇形槽,见下图。 4. 预估齿宽: m K B tB b Fe t t 2210294.096 .043.155 .010733.0--?=???==δ ,t B 可由 设计者经验得1.43T ,t b 由工艺取m 210295.0-? 5. 预估轭高: m B K B a K lB h j Fe i Fe j j 211110323.056 .196.0255 .08.02.222-?=????=≈Φ= δδτ

直流电机控制系统设计范本

直流电机控制系统 设计

XX大学 课程设计 (论文)题目直流电机控制系统设计 班级 学号 学生姓名 指导教师

沈阳航空航天大学 课程设计任务书 课程名称专业基础课程设计 院(系)自动化学院专业测控技术与仪器 班级学号姓名 课程设计题目直流电机控制系统设计 课程设计时间: 7 月 9 日至 7 月 20 日 课程设计的内容及要求: 1.内容 利用51单片机开发板设计并制作一个直流电机控制系统。系统能够实时控制电机的正转、反转、启动、停止、加速、减速等。 2.要求 (1)掌握直流电机的工作原理及编程方法。 (2)掌握直流电机驱动电路的设计方法。 (3)制定设计方案,绘制系统工作框图,给出系统电路原理图。 (4)用汇编或C语言进行程序设计与调试。 (5)完成系统硬件电路的设计。 (6)撰写一篇7000字左右的课程设计报告。

指导教师年月日 负责教师年月日 学生签字年月日 目录 0 前言...................................................................................... 错误!未定义书签。 1 总体方案设计 ...................................................................... 错误!未定义书签。 1.1 系统方案 ...................................................................... 错误!未定义书签。 1.2 系统构成 ...................................................................... 错误!未定义书签。 1.3 电路工作原理............................................................... 错误!未定义书签。 1.4 方案选择 ...................................................................... 错误!未定义书签。 2 硬件电路设计 ...................................................................... 错误!未定义书签。 2.1 系统分析与硬件设计................................................... 错误!未定义书签。 2.2 单片机AT89C52............................................................ 错误!未定义书签。 2.3 复位电路和时钟电路................................................... 错误!未定义书签。 2.4 直流电机驱动电路设计 ............................................... 错误!未定义书签。 2.5 键盘电路设计............................................................... 错误!未定义书签。 3 软件设计 ............................................................................ 错误!未定义书签。 3.1 应用软件的编制和调试 ............................................... 错误!未定义书签。 3.2 程序总体设计............................................................... 错误!未定义书签。 3.3 仿真图形 ...................................................................... 错误!未定义书签。 4 调试分析 .............................................................................. 错误!未定义书签。

(完整版)无刷直流电机经典换相方式

1、引言 你希望在你的新产品中使用无刷伺服电机吗?平时,我们可能也常碰到一些关键词,例如“梯形波式”,“正弦波式”和“矢量控制”。只有当你了解了他们的真正含义,才能在你的新设计中选择正确的产品。 在过去的十年甚至二十年中,伺服电机市场已经从有刷伺服转变成无刷伺服的市场,这主要是由无刷伺服的低维修率和高稳定性所决定的。在这十几年中,驱动部分在电路和系统方面的技术已发展的非常完善。控制方式也已经完全可以实现那些关键词所描述的功能。 大部分的高性能的伺服系统都采用一个内部控制环来控制力矩。这个内部的力矩环通过和外部的速度环和位置环的配合以达到不同的控制效果。外部控制环的设计是与匹配的电机没有关系的,而内部的力矩环的设计则与所匹配的电机的性能息息相关。 有刷电机的力矩控制是非常简单的,因为有刷电机自身可完成换相工作。所输出的力矩是和有刷电机两极输入的直流电压成正比的。力矩也可通过P-I控制回路轻松地得到控制。P-I控制回路的主要功能就是通过检测电机实际电流和控制电流之间的偏差,实时地调整电机的输入电压。 图1 由于无刷电机自身没有换相功能,所以相对应的控制方式就比较复杂。无刷电机有三组线圈,有别于有刷电机的两组线圈。为了获得有效的力矩,无刷电机的三组线圈必须根据转子的实际位置进行相互独立的控制。这种驱动方式就充分地说明了对无刷电机控制的复杂性。 2、无刷电机基础 简单来说,无刷电机主要由旋转的永磁体(转子)和三组均匀分布的线圈(定子)组成,线圈包围着定子被固定在外部。电流流经线圈产生磁场,三组磁场相互叠加形成一个矢量磁场。通过分别控制三组线圈上的电流大小,我们可以使定子产生任意方向和大小的磁场。同时,通过定子和转子磁场之间的相互吸引和排斥,力矩便可自由地得到控制。

小型永磁直流电机设计

小型永磁直流电机设计(部分) Ap1008331谢志恒 1.电机主要尺寸与功率,转速的关系: 与异步电机相似,直流电机的功率,转速之间的关系是: D22*Lg=6.1*108*p’/(αP*A*Bg*Ky*n) (1) D2 电枢直径(cm) 电机初设计时的主要尺寸 Lg 电枢计算长度(cm) 根据电机功率和实际需要确定 p’计算功率(w) p’=E*Ia=(1+2η)*P N/3η E=Ce*Φ*n*Ky=(P*N/60*a)*Φ2*n*Ky*10-8 Ce 电势系数 a 支路数在小功率电机中取a=2 p 极数在小功率电机中取p=2 N 电枢总导体数 n 电机额定转速 Ky 电枢绕组短矩系数小功率永磁电机p=2时,采用单叠绕组Ky=Sin[(y1/τ)*π/2] y1绕组第一节矩 P 极弧系数一般取αP=0.6~0.75 正弦分布時αP=0.637 Φ每极磁通Φ=αP*τ*Lg*Bg τ极矩(cm) τ=π*D2/P Bg气隙磁密(Gs) 又称磁负荷,对铝镍Bg=(0.5~0.7) Br,对铁氧体Bg=(0.7~0.85) Br, Br为剩磁密度 A 电枢线负荷A=Ia*N/(a*π*D2)Ia电枢额定电流对连续运行的永磁电动机,一般取A=(30~80)A/cm另外电机负荷Δ= Ia/(a*Sd),其中Sd=π*d2/4,d为导线直径。为了保证发热因子A*Δ≦1400 (A/cm*A/mm2 )通常以电枢直径D2和电枢外径La作为电机主要尺寸,而把电动机的输出功率和转速为电机的主要性能,在主要尺寸和主要性能的基础上,我们就可以设计电机了。

在(1)式的基础上经过变换可为: D22*Lg*n/P’=(6.1*108/π2)*1/(αP*Bg*A)=C A 由上式可以看, CA的值并不取决於电机的容量和转速,也不直接与电枢直径和长度有关,它仅取决於气隙的平均磁密及电枢线负荷,而Bg和A的变化很小,它近似为常数,通常称为电机常数,它的导数K A=1/C A=(p’/n)/(D22* Lg)∞αP*Bg*A称为电机利用系数,它是正比於单位电枢有效体积产生的电磁转矩的一个比例常数。 2.磁钢的选择: 2.1磁钢的材质 在永磁直流电机中,磁钢相当于串激电中的定子线圈中,它在定子铁壳中产生磁场,它和其它电机一样,是利用电磁感应原理在磁场媒质中进行能量转换的,磁场在能量转换过程中起媒介作用,在永磁直流电机中产生磁场的磁源是充过磁的永磁体,也叫磁钢,充过磁的磁石性能对电机的性能有很大的影响。 在现代电机制造中,磁钢的材料有下列几种:铁氧体.铝镍鈷合金,稀士合金,釹铁硼等.由于各种材料自身特点和本公司的实际,一般选用铁氧体作为永磁材料。 2.2永磁材料的磁性能 磁钢的退磁曲线如下: 永磁材料的磁性能可以用磁滞回线来反映和描述.即用B=f(H)曲线来反映永磁体的磁感应强度随磁场强度来降改变的特性,该回线包含的面积随最大充磁磁场强度HMAX增大而增大,当HMAX达到HS时回线面积渐近地达到一个最大值,而且这时磁性能也较稳定,面积最大的回线被称为磁滞回线. 磁滞回线在第二象限的部分称为退磁曲线,它是永磁材料的基本特性曲线,退磁曲线中磁感应强度Bm 为正值而磁场强度Hm为负值,在退磁曲线过程中,永磁体相当于一个磁源.退磁

什么是无刷电机的矢量控制技术

什么是矢量控制?它有什么优点? 你希望在你的新产品中使用无刷伺服电机吗?平时,我们可能也常碰到一些关键词,例如“梯形波式”,“弦波式”和“矢量控制”。只有当你了解了他们的真正含义,才能在你的新设计中选择正确的产品。 在过去的十年甚至二十年中,伺服电机市场已经从有刷伺服转变成无刷伺服的市场,这主要是由无刷伺服的低维修率和高稳定性所决定的。在这十几年中,驱动部分在电路和系统方面的技术已发展的非常完善。控制方式也已经完全可以实现那些关键词所描述的功能。 大部分的高性能的伺服系统都采用一个内部控制环来控制力矩。这个内部的力矩环通过和外部的速度环和位置环的配合以达到不同的控制效果。外部控制环的设计是与匹配的电机没有关系的,而内部的力矩环的设计则与所匹配的电机的性能息息相关。 有刷电机的力矩控制是非常简单的,因为有刷电机自身可完成换相工作。所输出的力矩是和有刷电机两极输入的直流电压成正比的。力矩也可通过P-I控制回路轻松地得到控制。P-I 控制回路的主要功能就是通过检测电机实际电流和控制电流之间的偏差,实时地调整电机的输入电压。 图一 由于无刷电机自身没有换相功能,所以相对应的控制方式就比较复杂。无刷电机有三组线圈,有别于有刷电机的两组线圈。为了获得有效的力矩,无刷电机的三组线圈必须根据转子的实际位置进行相互独立的控制。这种驱动方式就充分地说明了对无刷电机控制的复杂性。 无刷电机基础 简单来说,无刷电机主要由旋转的永磁体(转子)和三组均匀分布的线圈(定子)组成,线圈包围着定子被固定在外部。电流流经线圈产生磁场,三组磁场相互叠加形成一个矢量磁场。通过分别控制三组线圈上的电流大小,我们可以使定子产生任意方向和大小的磁场。同时,通过定子和转子磁场之间的相互吸引和排斥,力矩便可自由地得到控制。

直流无刷电机及驱动器介绍

技术部 直流无刷电机及驱动器介绍 ---培训讲义 编制/整理:徐兴强 日期:2010-5-5

一、产品技术特点 1)既具有AC电机的优点:结构简单,运行可靠,维护方便等; 2)又具有DC电机的优点:调速性能好,运行效率高,无励磁损耗等; 3)同时,与DC有刷电机比较:无接触磨损,无火花,低噪音,无辐射干扰等;4)再有,与伺服电机比较:控制/驱动原理较简单,可灵活多变,且成本较低;有较高的成套性价比,实用性很强。 主要缺陷:低速启动时,有轻微震动;但不会失步(比较于步进电机)。 二、主要应用方面 1)在精密电子设备和器械中的应用 如:电脑硬盘的主轴驱动,激光打印机,复印机,医疗器械,卫星太阳能帆板驱动,医疗监控设备等。 2)在家用电器中的应用 如:空调器、洗衣机、电热器、吸尘器、电风扇、搅拌机等。 3)在电瓶车/牵引机中的应用 4)在工业系统中的应用 如:工业缝纫机、纺织印花机、等等;

5)在军事工业和航空航天中的应用 三、特殊功能与性能分析 # 典型特性曲线,如下: ##由以上特性曲线可知: 1)电机的最大转矩为启动和堵转时的转矩; 2)在同一转速下,改变供电电压,可以改变电机的输出转矩; 3)在相同转矩时,改变供电电压,可以改变电机的转速。 即:在驱动电路中,通过PWM方式改变供电电压的平均值,在保证转矩不变的情况下,可以实现对电机的平稳调速。 ###BLDC与AC交流感应式电机相比,具有如下优点: 1)转子采用永磁体,无需激励电流。故,同样的电功率,可以获得更大的机械功率; 2)转子无铜损,无铁损,发热更小; 3)启动、堵转时力矩大,更适合于阀门打开、关闭瞬间需要力矩大的场合; 4)电机的输出力矩与工作电压、电流成正比,从而可以简化力矩的检测电路,并更加可靠; 5)利用PWM调制方式改变供电电压的平均值,可以实现平稳调速,使调速、驱动功率电路更加简单,综合成本降低;

相关主题
文本预览
相关文档 最新文档