基于89S51的直流电机闭环控制设计.docx
- 文档编号:5981171
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:25
- 大小:559.98KB
基于89S51的直流电机闭环控制设计.docx
《基于89S51的直流电机闭环控制设计.docx》由会员分享,可在线阅读,更多相关《基于89S51的直流电机闭环控制设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于89S51的直流电机闭环控制设计
基于89S51的直流电机闭环控制设计实习报告
摘要
介绍了直流电机原理及其驱动程序控制控制模块,通过STC89C52单片机完成直流电机的闭环控制。
实现直流电机的速度控制并且显示数据。
整个系统采用模块化设计,结构简单、可靠,通过按键控制,操作方便,节省成本,具有专业综合型:
能让我们在系统中运用专业理论知识。
(如单片机原理及应用、自动控制理论、交直流调速系统、计算机控制系统等内容)。
此设计具有工程训练型:
能让我们在实习期间培养诸多工程技术素质。
关键词:
直流电机;单片机控制;STC89C52;
引言
随着数字化技术发展,数字控制技术得到了广泛而深入的应用。
直流电机组成的控制系统结构简单,价格低廉,性能上能满足工业控制的基本要求,所以广泛地应用于手工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,投影仪、数码摄像机、大型望远镜、卫星天线定位系统、医疗器件以及各种可控机械工具等等。
直流电机广泛应用于计算机外围设备(如硬盘、软盘和光盘存储器)、家电产品、医疗器械和电动车上,无刷直流电机的转子都普遍使用永磁材料组成的磁钢,并且在航空、航天、汽车、精密电子等行业也被广泛应用。
在电工设备中的应用,除了直流电磁铁(直流继电器、直流接触器等)外,最重要的就是应用在直流旋转电机中。
在发电厂里,同步发电机的励磁机、蓄电池的充电机等,都是直流发电机;锅炉给粉机的原动机是直流电动机。
此外,在许多工业部门,例如大型轧钢设备、大型精密机床、矿井卷扬机、市内电车、电缆设备要求严格线速度一致的地方等,通常都采用直流电动机作为原动机来拖动工作机械的。
直流发电机通常是作为直流电源,向负载输出电能;直流电动机则是作为原动机带动各种生产机械工作,向负载输出机械能。
在控制系统中,直流电机还有其它的用途,例如测速电机、伺服电机等。
他们都是利用电和磁的相互作用来实现向机械能能的转换
一、电机的工作原理
由直流电动机和发电机工作原理示意图可以看到,直流电机的结构应由定子和转子两大部分组成。
直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、换向极、端盖、轴承和电刷装置等组成。
运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。
直流电机的结构:
电机要实现机电能量变换,电路和磁路之间必须有相对运动。
所以旋转电机具备静止的和旋转的两大部分。
静止和旋转部分之间有一定大小的间隙,称为气隙。
静止的部分称为定子,作用是产生磁场和作为电机的机械支撑。
包括主磁极、换向极、机座、端盖、轴承、电刷装置等。
旋转部分称为转子或电枢,作用是感应电势实现能量转换。
包括电枢铁心,电枢绕组,换向器、轴和风扇等。
定子部分:
1、主磁极:
也称为主极。
作用是产生气隙磁场。
2、换向极:
也称为附加极或间极。
作用是改善换向。
装在主极之间。
3、机座:
由铸钢或厚钢板焊成。
是电机的机械支撑。
4、电刷装置:
将直流电压、电流引入或引出的装置。
其组数与主极极数相等。
转动部分:
(转子部分)1、电枢铁心:
主磁路的主要部分及嵌放电枢绕组,由硅钢片迭压而成。
2、电枢绕组:
由许多按一定规律联接的线圈组成。
用来感应电势和通过电流,是电路的主要部分。
3、换向器:
由许多彼此绝缘的换向片构成。
二、硬件设计
1、硬件的选择
因为我们已经学过AT89S51、52系列或STC89C52系列的单片机基本原理,而且其具有普遍性和代表性;带有Flash,方便擦写。
还很廉价。
选用12V直流伺服减速电机,能方便应用自动控制原理,交直流调速控制、计算机控制系统的专业知识;而且驱动电路简单;小功率并且廉价。
选用我们学过的LED数码管,和4*4键盘。
结合其基本键盘显示原理,实现人机接口方案具有普遍性,代表性,而且廉价。
选用H桥式驱动直流电动机,采用PWM调速。
2、整体设计方案
3、各个模块的设计
MCU模块(如下图)
这部分电路组成单片机的最小系统,并且显示各个引脚与外围电路的接口连接等。
且单片机的最小系统在上学期的设计中已经详细说明,这里不再赘述。
A/D转换模块
A/D转换的原理介绍:
A/D转换基本分为四个步骤:
采样、保持、量化、编码。
其转换器的基本原理不再介绍,简单介绍一下A/D转化器与外围接口电路及单片机的连接方法:
1.A/D转换器与单片机接口时应考虑的问题
(1)A/D的数据线与CPU的数据总线之间的缓冲问题
对ADC芯片输出端具有可控的三态输出门,输出端可以直接和微处理器的数据总线相连。
在转换结束后,CPU通过执行一条输入指令产生读信号,将数据从A/D转换器中取出。
对一些ADC芯片本身没有三态输出电路,这时A/D转换芯片的数据输出线不能直接和微处理器的数据总线相连,必须通过三态缓冲电路与数据总线接口。
当并行A/D芯片的分辨率位数大于数据总线宽度时,CPU要分两次读取A/D转换数据。
(2)A/D转换启动控制信号的提供
A/D转换器要求的启动信号一般有两种形式:
即电平启动信号和脉冲启动信号。
对要求用电平作为启动信号的A/D芯片,整个转换过程中都必须保证启动信号有效。
对于用脉冲方式启动A/D芯片,通常用CPU执行输出指令时发出的片选信号和写信号组合产生启动脉冲。
2.A/D转换器与单片机接口时的信号连接
通道选择信号、转换启动控制信号、转换结束信号、数字量输出控制信号以及数据线与单片机的连接。
ADC读写地址:
XXXX0XXXB
ADC0804的外围接口连接图
3数模转换扩展模块
CD4051是单8通道数字控制模拟电子开关,有三个二进制控制输入端A、B、C和INH输入,具有低导通阻抗和很低的截止漏电流。
该处选择通道0地址:
X0000XXXB。
通道1地址:
X0010XXXB……
如图:
直流电机驱动模块
由于本设计是小功率驱动电路可以采用如图所示的H桥开关电路。
由于大功率PNP晶体管价格高,难实现,所以这个电路只在小功率电机驱动中使用。
当四个功率开关全用NPN晶体管时,需要解决两个上桥臂晶体管(Q9和Q10)的基极电平偏移问题。
H桥开关电路利用两个晶体管实现了上桥臂晶体管的电平偏移。
但电阻R上的损耗较大,所以也只能在小功率电机驱动中使用。
键盘接口电路
编码式键盘:
由按键键盘和专用键盘编码器两部分组成。
非编码式键盘:
按键代码的确定借助软件来完成。
优点:
可以任意组合、成本低、使用灵活。
缺点:
软件复杂,占用CPU时间较多。
分为:
独立式键盘结构、矩阵式键盘结构、交互式键盘结构。
独立式键盘结构
矩阵式键盘结构
3、键抖动及消除
检测到按键按下后,执行延时10ms子程序后再确认该键是否确实按下,消除抖动影响。
方法有:
硬件电路消除法,软件延时法,软件去抖动。
而本设计采用4*4的矩阵式键盘结构
数码管显示电路
本设计选用两片四位共阴极数码管LG3941BH,当给定为低电平时数码管发光,同时其外围电路能够实现片选和位选.
三、软件设计
#include<./Atmel/regx52.h>
#include
#include
#include
#include
#include
#defineadc_0XBYTE[0x02ff]/*ADC0804第1通道地址*/
#defineadc_1XBYTE[0x12ff]/*ADC0804第2通道地址*/
#defineled_bitXBYTE[0x88ff]/*LED寻位地址*/
#defineled_dataXBYTE[0x09ff]/*LED数据地址*/
#definekey_rowXBYTE[0x0Aff]/*键盘行地址*/
#definekey_colXBYTE[0x0Cff]/*键盘列地址*/
#defineTIMER0_CONTROLTR0/*定时器0控制位*/
#defineTIMER1_CONTROLTR1/*定时器1控制位*/
#defineTIMER2_CONTROLTR2/*定时器2控制位*/
#definei_a_limit0x0D/*电枢限流0.5A*/
/*定义共阳极LED显示段码*/
staticstruct{
charascii;
charstroke;
}codeled_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控制器参数*/
floatProportion;//比例常数ProportionalConst
floatIntegral;//积分常数IntegralConst
intLastError;//E[k-1]
/*定义全局函数和变量*/
voidinit_system(void);
voidkey_monitor(void);
voidset_refled_buf(unsignedchara,intpos,intlen);
voidput_on_refleds(void);
voidset_fdbled_buf(unsignedchara,intpos,intlen);
voidput_on_fdbleds(void);
bitkbd_hit(void);
unsignedcharget_char(void);
unsignedchar*get_str(unsignedchar*str,unsignedintlen);
unsignedcharget_strokes(unsignedcharc);
voidadc0804_start(void);
unsignedintadc0804_read(void);
unsignedintn_test(void);
unsignedinti_a_test(void);
unsignedread_nref(void);
externvoiddelay(int);
sfrAUXR=0x8e;
sbitPWM_OUT=P1^6;/*PWM信号输出位*/
unsignedintadc0804_port;//ADC0804通道标志,值为0表示0通道,值为1表示1通道
unsignedintV_ADC0=0;//ADC0804_0转换结果
unsignedintV_ADC1=0;//ADC0804_1转换结果
bitn_ref_select_flag=0;//给定选择标识位
unsignedintn_feedback=0;
unsignedintn_ref=0;
unsignedintpwm_positive;//脉宽范围0~65536us,定时器0工作在方式1
unsignedintpwm_negtive;
floatpwm_lou;//PWM占空比
unsignedintn_ref_key;
unsignedintn_ref_pot;
unsignedintmotor_i_a;
unsignedcharrefled_buf[4];
unsignedcharfdbled_buf[4];
unsignedcharstr[4];
main()
{
init_system();
while
(1)
{
key_monitor();
put_on_refleds();
put_on_fdbleds();
}
}
/*系统初始化函数*/
voidinit_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;//比例常数ProportionalConst
Integral=0.00001;//积分常数IntegralConst
pwm_lou=0.5;
str[0]='3';str[1]='0';str[2]='0';str[3]='0';
ET1=1;//开转速调节中断
}
/*段码查找函数*/
unsignedcharget_strokes(unsignedcharc)
{
unsignedchari=0;
while(led_strokes[i].ascii!
=c)i++;
return(led_strokes[i].stroke);
}
/*将当前给定显示缓冲区字符显示到LED上*/
voidput_on_refleds(void)
{
unsignedcharpos;
unsignedcharledbit=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上*/
voidput_on_fdbleds(void)
{
unsignedcharpos;
unsignedcharledbit=0xef;
for(pos=0;pos<4;pos++)
{
led_bit=ledbit;
led_data=get_strokes(fdbled_buf[pos]);
delay
(1);//延时1ms
ledbit=_crol_(ledbit,1);
}
}
/*若有键按下,对相应命令进行解释并转相应处理子程序*/
voidkey_monitor(void)
{
unsignedcharkey;
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;
}
/*判断是否有键按下函数*/
bitkbd_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);
}
/*等待按键函数*/
unsignedcharget_char(void)
{
unsignedcharrow=0,col=0;
unsignedcharkey_value;
unsignedcharscan_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;
elseif(key_value==9)
key_value='0';
else
key_value+='A'-10;
}
return(key_value);
}
/*取键盘字符串函数*/
unsignedchar*get_str(unsignedchar*str,unsignedintlen)
{
unsignedchari;
unsignedcharch;
unsignedcharkeyboard_buf[4];//键盘缓冲区
unsignedcharkeybuf_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); } /*填充给定显示缓冲区*/ voidset_refled_buf(unsignedchara,intpos,intlen) { unsignedcharledbuf_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; } } /*填充转速反馈显示缓冲区*/ voidset_fdbled_buf(unsignedchara,intpos,intlen) { unsignedcharledbuf_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定时产生中断服务函数*/ voidtimer0(void)interrupt1using1 { 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定时转速调节中断服务函数*/ voidtimer1(void)interrupt3using1 { /////刷新显示的变量///// unsignedcharpos; unsignedcharledbit=0xfe; //测速 n_feedback=n_test(); /***************************************************/ /*把整型数转换为字符型**
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 89 S51 直流电机 闭环控制 设计