计算机测控实验4.docx
- 文档编号:17393757
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:17
- 大小:140.81KB
计算机测控实验4.docx
《计算机测控实验4.docx》由会员分享,可在线阅读,更多相关《计算机测控实验4.docx(17页珍藏版)》请在冰点文库上搜索。
计算机测控实验4
实验四直流电机转速控制实验
一、实验目的
(1)掌握数字PID控制的设计方法;
(2)考虑计算过程所需时间,合理设计程序结构。
二、硬件原理图
●实验装置硬件说明
图1电机控制实验箱原理框图
●实验装置接口说明
表1电机实验箱DB9插头引脚信号特性
DB9引脚号
颜色
标号
信号特性
信号类型
信号方向
(对实验箱而言)
1
棕
DIR
方向控制
数字量
输入
2
红
PWM
转速控制
数字量
输入
3
橙
4
黄
5
绿
GND
电源地
地
6
蓝
OUTA
霍尔器件A输出
数字量
输出
7
灰
OUTB
霍尔器件B输出
数字量
输出
8
白
9
黑
●PID控制算法简介
Ø增量式PID算法
增量式PID输出表达式为:
(1)
其中:
采用归一化参数整定法,即:
为纯比例下的临界振荡周期,带入式
(1)得:
(2)
实际实验时,可以采取试凑法来得出
値。
Ø增量式PID算法流程图
采用单片机实现PID算法时,可以采取如图2所示的流程图进行。
图2PID算法流程图
Ø闭环控制框图
图3是电机转速控制的闭环框图,其中
代表要求达到的转速值,
代表电机当前的转速值,折线代表电机的转速死区,
代表电机的特性。
图3电机转速控制闭环框图
三、软件流程图
定时器中断子程序
开始
得出占空比
初始化定时器
捕捉方式测速
调用键入数据
判断设定速度及占空比
测出速度
应用PID
读取转速数据
调用PID
显示速度
四、实验步骤
a)打开软件Keil,建立工程,并选择CPU,新建文件,写入源代码,然后向工程中添入文件,同时编译设置后对文件进行编译,最后调试软件。
b)对硬件进行正确连线,并与电脑相连接,。
c)使用S51ISP下载软件,先检测器件选择单片机型号,再自动打开文件,随后下载文件,将编号的程序载入单片机中。
d)注意与主机握手链接后观察硬件实验现象。
五、软件源码
#include
#defineKeyPortP3
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
sbitLATCH1=P2^2;//定义锁存使能端口段锁存
sbitLATCH2=P2^3;//位锁存
sbitDCOUT=P1^4;//定义电机信号输出端口
sbitground=P1^2;
/*------------------------------------------------
全局变量
------------------------------------------------*/
unsignedcharPWM_ON;//定义速度等级
unsignedcharsspeed;//定义设定速度
#defineCYCLE10//周期
unsignedcharcodedofly_DuanMa[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9
unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];//存储显示值的全局变量TempData[8~13]为N,C0,C,flag,flag2
//unsignedintn;//N,C0,C,n;
longpara[5];//N,C0,C,flag2,n
/*------------------------------------------------
函数声明
------------------------------------------------*/
voidDelayUs2x(unsignedchart);//us级延时函数声明
voidDelayMs(unsignedchart);//ms级延时
voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数
unsignedcharKeyScan(void);//键盘扫描
unsignedcharKeyPro(void);
voidInit_Timer(void);//定时器0、1初始化
voidpid(floatsspeed);//pid
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedcharnum;
PWM_ON=0;
para[2]=0;//C=0;
para[1]=0;//C0=0;
para[0]=-1;//N=0;
para[3]=0;//测量速度;
para[4]=0;//最终速度;
Init_Timer();//初始化定时器0,主要用于数码管动态扫描
while
(1)//主循环
{
ground=1;
num=KeyPro();//循环调用按键扫描
switch(num)
{
case0:
sspeed=1000;PWM_ON=1;TempData[0]=dofly_DuanMa[0];break;
case1:
sspeed=1500;PWM_ON=2;TempData[0]=dofly_DuanMa[1];break;
case2:
sspeed=2000;PWM_ON=4;TempData[0]=dofly_DuanMa[2];break;
case3:
sspeed=2500;PWM_ON=7;TempData[0]=dofly_DuanMa[3];break;
default:
break;
}
if(TR2==0)
{
para[3]=30000000*para[0]/para[2];//计算速度
pid(sspeed);//最终速度
TempData[3]=dofly_DuanMa[para[4]/1000];//显示千位
TempData[4]=dofly_DuanMa[(para[4]%1000)/100];//显示百位
TempData[5]=dofly_DuanMa[(para[4]%100)/10];//显示十位
TempData[6]=dofly_DuanMa[para[4]%10];//显示个位
para[0]=-1;
TR2=1;
}
}
}
/*------------------------------------------------
uS延时函数
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
显示函数
------------------------------------------------*/
voidDisplay(unsignedcharFirstBit,unsignedcharNum)
{
staticunsignedchari=0;
DataPort=0;//清空数据,防止有交替重影
LATCH1=1;//段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit];//取位码
LATCH2=1;//位锁存
LATCH2=0;
DataPort=TempData[i];//取显示数据,段码
LATCH1=1;//段锁存
LATCH1=0;
i++;
if(i==Num)
i=0;
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer(void)
{
TMOD|=0x01;//T0使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-1000)/256;//给定初值
TL0=(65536-1000)%256;
TR0=1;//定时器开关打开
T2CON=0x9;//定时器2工作在捕捉方式EXEN2=1,CP/非RL2=1
TH2=0x00;//定时器2计数初值设置
TL2=0x00;
TR2=1;//启动定时器2
ET2=1;//定时器2中断允许
ET0=1;//定时器中断打开
EA=1;//总中断打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
staticvoidtimer2_isr(void)interrupt5
{
if(EXF2==1)//捕捉引起的中断
{
para[0]++;
if(para[0]==0)
{
para[1]=RCAP2H*256+RCAP2L;
}
EXF2=0;
}
else
{
TR2=0;
para[2]=RCAP2H*256+RCAP2L;
para[2]=para[2]-para[1];
TH2=0x00;
TL2=0x00;
TF2=0;
}
}
voidpid(floatsspeed)
{
floatinc,e1,e2,e3;
floatkp=1.0;
para[4]=para[3];
e3=sspeed-para[4];
inc=kp*(2.45*e3-3.5*e2+1.25*e1);
para[4]+=inc;
if(para[4]>5000)
para[4]=5000;
if(para[4]<100)
para[4]=100;
e1=e2;
e2=e3;
}
voidTimer0_isr(void)interrupt1
{
staticunsignedcharcount=0;
TH0=(65536-1000)/256;//重新赋值1ms
TL0=(65536-1000)%256;
Display(0,8);//调用数码管扫描
if(count==PWM_ON)
{
DCOUT=0;//如果定时等于on的时间,
//说明作用时间结束,输出低电平
}
count++;
if(count==CYCLE)//反之低电平时间结束后返回高电平
{
count=0;
if(PWM_ON!
=0)//如果开启时间是0保持原来状态
DCOUT=1;
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsignedcharKeyScan(void)//键盘扫描函数,使用行列逐级扫描法
{
unsignedcharVal;
KeyPort=0xf0;//高四位置高,低四位拉低
if(KeyPort!
=0xf0)//表示有按键按下
{
DelayMs(10);//去抖
if(KeyPort!
=0xf0)
{//表示有按键按下
KeyPort=0xfe;//检测第一行
if(KeyPort!
=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!
=0xfe);
DelayMs(10);//去抖
while(KeyPort!
=0xfe);
returnVal;
}
KeyPort=0xfd;//检测第二行
if(KeyPort!
=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!
=0xfd);
DelayMs(10);//去抖
while(KeyPort!
=0xfd);
returnVal;
}
KeyPort=0xfb;//检测第三行
if(KeyPort!
=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!
=0xfb);
DelayMs(10);//去抖
while(KeyPort!
=0xfb);
returnVal;
}
KeyPort=0xf7;//检测第四行
if(KeyPort!
=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!
=0xf7);
DelayMs(10);//去抖
while(KeyPort!
=0xf7);
returnVal;
}
}
}
return0xff;
}
/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsignedcharKeyPro(void)
{
switch(KeyScan())
{
case0x7e:
return0;break;//0按下相应的键显示相对应的码值
case0x7d:
return1;break;//1
case0x7b:
return2;break;//2
case0x77:
return3;break;//3
case0xbe:
return4;break;//4
case0xbd:
return5;break;//5
case0xbb:
return6;break;//6
case0xb7:
return7;break;//7
case0xde:
return8;break;//8
case0xdd:
return9;break;//9
case0xdb:
return10;break;//a
case0xd7:
return11;break;//b
case0xee:
return12;break;//c
case0xed:
return13;break;//d
case0xeb:
return14;break;//e
case0xe7:
return15;break;//f
default:
return0xff;break;
}
}
六、实验总结
通过本次实验,我在一定程度上了解了单片机的I/O口的使用,掌握了对单片机产生可控PWM波形以及利用定时器2捕获功能实现电机转速测量的方法,在对PID的使用过程中,我进一步的了解到了PID的作用以及对增量式PID算法的理解。
应该说本次实验是建立在第三次实验的基础之上的,只要在第三次实验的基础上应用上PID子程序,再多次调整公式系数就可完成本次实验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 测控 实验