直流电机闭环调速控制系统设计报告.docx
《直流电机闭环调速控制系统设计报告.docx》由会员分享,可在线阅读,更多相关《直流电机闭环调速控制系统设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
![直流电机闭环调速控制系统设计报告.docx](https://file1.bdocx.com/fileroot1/2022-10/22/1a0fabf1-96fe-47cb-80e3-c1fda25cb510/1a0fabf1-96fe-47cb-80e3-c1fda25cb5101.gif)
直流电机闭环调速控制系统设计报告
目录…………………………………………………………………1
一、课设任务…………………………………………………….2
1.1设计内容…………………………………………………..2
1.2具体要求…………………………………………………..2
1.3程序调试建议…………………………………………….2
二、系统方案…………………………………………………….3
三、硬件设计…………………………………………………….3
3.1数码管显示和行列式键盘电路…………………………..4
3.2数模变换电路……………………………………………..5
3.3直流电机驱动电路………………………………………..6
3.4片选译码电路………………………………………………7
3.5RAM电路…………………………………………………..7
四、软件设计………………………………………………………8
五、调试及结果…………………………………………………..19
六、心得体会……………………………………………………..19
七、参考文献……………………………………………………..20
八、附录…………………………………………………………..20
直流电机闭环调速控制系统设计报告
一、课设任务
1.1设计内容:
以实验室实验装置为设计对象,从中选择出合适的部分,构成一个直流电机恒转速控制系统,具有如下功能:
1、可以通过按键设定直流电机转速(转/分钟,r/min);
2、可以实时显示电机转速,同时显示设定值(各用三位显示);
3、运行过程中改变负载可以维持设定的转速稳定后保持不变。
(稳态误差小于等于设定值的5%)
4、开始时只显示设定值,采集值显示为0,按运行键后显示实时采集值与设定值,左边三位是设定值,右边三位是实时值;
5、设置停止运行键,控制直流电机停止运行;
6、其它扩展发挥功能。
1.2具体要求:
1、根据功能要求从实验装置上选择合适电路构成系统,用protel软件画出原理图与控制系统结构图,分析系统工作过程;
2、根据实验装置具体情况确定接线方法,从而确定各端口的口地址(D/A、键盘、显示等);
3、采用PID算法作为恒转速控制算法,对PID算法加以分析说明;
4、按照系统工作过程要求编制程序,画出流程图与编写具体程序;
5、调试运行,记录运行结果;
6、书写课程设计报告,符合学院有关课程报告的要求。
1.3程序调试建议:
1、先通过简单程序验证硬件工作正常(D/A输出,带负载能力,显示器正常等等);不正常时及时与实验室老师联系更换器件。
2、调试测速显示子程序;
3、调试参数设置程序;
4、调试控制算法程序;
5、调试综合程序
二、系统方案
直流电动机具有良好的起、制动性能,宜于大范围内平滑调速,在许多需要调速或快速正反向的电力拖动领域得到了广泛的应用。
采用PID调节的转速单环直流调速系统可以在保证稳定的前提下实现转速无静差。
系统进行信号采集进行D/A转换,使单片机送出脉冲来控制触发器,控制电路输出,驱动电动机工作,再由检测电路带回实际转速给单片机,让单片机根据实际转速和给定的转速进行比较,放大及PID运算等操作,从而控制整流电路α角的大小,进而改变电机电枢电压的大小,达到调节电动机转速的目的。
三、硬件设计
3.1数码管显示和行列式键盘电路
数码管显示和行列式键盘电路图
3.2数模变换电路
数模变换电路图
3.3直流电机驱动电路:
直流电机驱动电路图
3.4片选译码电路:
片选译码电路图
3.5RAM电路:
RAM电路图
四、软件设计
主程序流程图
开始
定义变量
扫描模式置初值
扫描模式送输入口
取显示数据查表转换成段码
调用延时子程序
扫描模式左移一位
循环是否结束
返回
Y
N
显示程序流程图
程序:
//*********课程设计PID直流电机调速********************
#include
//******************地址定义*********************************
xdataunsignedcharIN_at_0x8001;//键盘读入口
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharCS0832_at_0x9000;//DA地址约定
//********************变量定义***********************************
unsignedintVOUT=0;//DA输出缓存变量
unsignedintFDC=0,FREF=0,DFDC=0,uctrl=0;//转速检测值FDC,给定值FREF
unsignedintPVAL=10,PIVAL=1,IVAL=0;
unsignedintERROR;
//********************缓冲区及其长度定义*************************
#defineLEDLen6//数码管数量
unsignedcharLEDBuf[LEDLen];//显示缓冲
//******************八段管显示码*********************************
codeunsignedcharLEDMAP[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
//******************键码定义************************************
codeunsignedcharKeyTable[]={
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
};
//*********延时程序*********************************************
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
//***********动态显示程序******************************************
voidDisplayLED()
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;//从左边开始显示
for(i=0;i{
OUTBIT=0;//关所有八段管
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;//显示一位八段管
Delay
(1);
Pos>>=1;//显示下一位
}
}
//***********键闭合程序******************************************
unsignedcharTestKey()
{
OUTBIT=0;//输出线置为0
return(~IN&0x0f);//读入键状态(高四位不用)
}
//**************得键值程序*************************************
unsignedcharGetKey()
{
unsignedcharPos;
unsignedchari;
unsignedchark;
i=6;
Pos=0x20;
do{
OUTBIT=~Pos;
Pos>>=1;
k=~IN&0x0f;
}while((--i!
=0)&&(k==0));
if(k!
=0)
{i*=4;
if(k&2)
i+=1;
elseif(k&4)
i+=2;
elseif(k&8)
i+=3;
OUTBIT=1;
doDelay(10);
while(TestKey());//等键释放
return(KeyTable[i]);//取出键码
}
elsereturn(0xff);
}
//****************速度设定程序************************
voidspeedset()
{unsignedchari=0,j=0,k=0,s,KEY,m;
unsignedcharb=0,c=0;
LEDBuf[0]=LEDMAP[0];
LEDBuf[1]=LEDMAP[0];
LEDBuf[2]=LEDMAP[0];
LEDBuf[3]=LEDMAP[0];
LEDBuf[4]=LEDMAP[0];
LEDBuf[5]=LEDMAP[0];
while(k!
=10)//A键为确认键;
{
/*m=0;
LEDBuf[i]=0x00;//关闭相应位;
while(m!
=10){DisplayLED();m++;}//延时;
m=0;
LEDBuf[j]=LEDMAP[KEY];//重新放回设定值;
LEDBuf[i]=LEDBuf[i+3];//实现闪烁原来的值;
while(m!
=20){DisplayLED();m++;}//延时;
m=0;
DisplayLED();*/
if(TestKey())
{s=GetKey();
k=s&0x0f;
if((k>=0)&&(k<=9))//速度设定,0--9有效;
{KEY=k;
LEDBuf[i]=LEDMAP[KEY];//高三位保存设定值;
LEDBuf[i+3]=LEDBuf[i];//保存原值;
if(i==0){b=(KEY%10)*10;}
if(i==1){c=(KEY%10);FREF=b+c;}
j=i;
i++;
}
}
if(i==2)i=0;//第二位设定好,返回第一位;
DisplayLED();
}
}
//*************定时器子程序,自动重装模式定时200us******
#defineT200us(256-100)//200us时间常数(6M)
unsignedintC200us;//200us记数单元
//*********定时器和外部中断初始化***************
voidInitT()
{
TMOD=2;//