电气工程综合实验.docx
- 文档编号:23874668
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:18
- 大小:160.31KB
电气工程综合实验.docx
《电气工程综合实验.docx》由会员分享,可在线阅读,更多相关《电气工程综合实验.docx(18页珍藏版)》请在冰豆网上搜索。
电气工程综合实验
xxda学
自动化学院综合实验报告
题目:
直流电机闭环调速系统
学生姓名:
xx
学号:
xx
同组人员:
xx
指导教师:
xx
直流电机闭环调速系统实验报告
1、实验名称:
直流电机闭环调速
基本情况:
1.学生姓名:
xx
2.学号:
x
3.班级:
0830902班
4.实验项目组长:
xx
5.同组其他成员:
序号
姓名
班级
学号
分工系数
1
x
0830x
oo4
0.34
2
xx
0x
oo1
0.22
3
xxx
083x
oo8
0.22
4
xxxx
083x
oo89
0.22
6.具体分工:
任务负责人
尹辉
王玉棣
伍沁楠
颜鸿运
分析设计给出设计方案
√
硬件电路设计
√
√
软件程序设计
√
√
综合实验报告
√
√
√
√
7.本人在项目组的作用描述:
本次综合实验的目的是在于实现直流电机的闭环调速,我在本次实验的主要负责的是软件程序设计,也就是应用C语言进行编程,PID控制主要是要通过比例项、积分项、微分项三项的控制来实现调速功能。
编写了计时器T0产生PWM波、通过改变占空比实现;用T1记录脉冲来确定转速;在键盘输入上改变转速的额定值,观察实际转速,显示最终的实际数值。
最终确定了调解中的各项系数:
Kp=0.4,Ki=0.02,Kd=0.02。
二、实验内容(实验原理介绍):
2.1实验内容
1)基于51单片机PWM输出控制直流电机转速;
2)可以实时显示电机转速,同时显示设定值以及给定值
3)可以通过按键设定直流电机转速,即实现加减速(转/秒,r/s);
4)可以调节P、I、D参数,通过PID调速使电机转速逐渐稳定;
2.2实验原理
2.2.1系统框图
2.2.2实验原理
该系统是基于51单片机最小系统的控制系统,由51单片机产生PWM,由驱动芯片L298N驱动电机转动,再由红外对射传感器产生脉冲输入单片机,单片机经过PID算法调节占空比实现对电机速度的控制和调节。
PWM控制的基本原理:
在采样控制理论中有一个重要的结论:
冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。
冲量指窄脉冲的面积。
这里所说的效果基本相同,是指环节的输出响应波形基本相同。
低频段非常接近,仅在高频段略有差异。
由于PWM调速系统的开关频率较高,仅靠电枢电感的滤波作用就可获得平稳的直流电流,低速特性好、稳速精度高、调速范围宽。
同样,由于开关频率高,快速响应特性好,动态抗干扰能力强,可以获得很宽的频带;开关器件只工作在开关状态,因此主电路损耗小、装置效率高;直流电源采用不可控整流时,电网功率因数比相控整流器高。
数字PID算法
1、PID控制系统组成
2、PID调节器的微分方程和传递函数
PID调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。
PID调节器的微分方程:
式中
PID调节器的传输函数:
3模拟PID控制规律的离散化
模拟形式
离散化形式
4、数字PID控制器的差分方程
式中
比例项
积分项
微分项
5、PID调节器各校正环节的作用
(1)比例环节:
即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。
(2)积分环节:
主要用于消除静差,提高系统的无差度。
积分作用的强弱取决于积分时间常数TI,TI越大,积分作用越弱,反之则越强。
(3)微分环节:
能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。
三、实验结果分析(含程序、数据记录、控制算法及分析和实验总结等):
3.1程序流程图
3.2源程序
/*计时器T0用于产生PWM脉冲,同时T1用于计数器模式,记录脉冲的个数,确定转速*/
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDataP0//数据端口
#defineTHCon0xfc
#defineTLCon0x66//初值1ms
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitRS=P2^4;//Pin4改P2^5
sbitRW=P2^5;//Pin5P2^6
sbitE=P2^6;//Pin6P2^7
sbitkey1=P3^0;//键盘改
sbitkey2=P3^1;
chardataTimeNum[]="";
chardataTest1[]="";
charge,shi,bai,ge1,shi1,bai1;//
sbittest=P1^3;
sbitPWM_C=P1^2;//pwm控制端P3^3
inte=0,e1=0,e2=0;//pid偏差
floatuk=0,uk1=0.0,duk=0.0;//pid输出值
floatKp=0.4,Ki=0.02,Kd=0.02;//pid控制系数
intout;
uintSpeedSet=16;
uintcnt=0;
uintnum=0;//脉冲计数Impluse=0,
uintPWM_Time=50;//脉冲宽度
/******************************************************************/
/*函数声明*/
/******************************************************************/
voidPWMOut();
/******************************************************************/
/*微秒延时函数*/
/******************************************************************/
voidDelayUs(unsignedcharus)//delayus
{
unsignedcharuscnt;
uscnt=us>>1;/*12MHz频率*/
while(--uscnt);
}
/******************************************************************/
/*毫秒函数声明*/
/******************************************************************/
voidDelayMs(unsignedcharms)
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
/******************************************************************/
/*写入命令函数*/
/******************************************************************/
voidWriteCommand(unsignedcharc)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/*写入数据函数*/
/******************************************************************/
voidWriteData(unsignedcharc)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/*写入字节函数*/
/******************************************************************/
voidShowChar(unsignedcharpos,unsignedcharc)
{
unsignedcharp;
if(pos>=0x10)
p=pos+0xb0;//是第二行则命令代码高4位为0xc
else
p=pos+0x80;//是第二行则命令代码高4位为0x8
WriteCommand(p);//写命令
WriteData(c);//写数据
}
/******************************************************************/
/*写入字符串函数*/
/******************************************************************/
voidShowString(unsignedcharline,char*ptr)
{
unsignedcharl,i;
l=line<<4;
for(i=0;i<16;i++)
ShowChar(l++,*(ptr+i));//循环显示16个字符
}
/******************************************************************/
/*初始化函数*/
/******************************************************************/
voidinit()
{
TMOD=0x51;
TH0=THCon;
TL0=TLCon;
TH1=0;
TL1=0;
//EA=1;
ET0=1;
TR0=1;//开始计时器0
ET1=1;
TR1=1;//开始计数器1
EA=1;
e=0;
e1=0;
e2=0;
}
voidInitLcd()
{
DelayMs(15);
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x38);//displaymode
WriteCommand(0x06);//显示光标移动位置
WriteCommand(0x0c);//显示开及光标设置
WriteCommand(0x01);//显示清屏
DelayMs(15);
sprintf(Test1,"setspeed:
");//打印输出第一行信息
ShowString(0,Test1);
sprintf(TimeNum,"current:
");//打印输出第二行信息
ShowString(1,TimeNum);
}
voidkeyscan()
{
if(!
key1)
{//按下相应的按键,数码管显示相应的码值
DelayMs(5);
if(!
key1)
{
SpeedSet++;
//P1_0=~P1_0;
//num++;
}
}
}
voidAnalysisData(charnuma)
{
ge=numa%10;
shi=numa/10%10;
bai=numa/100%10;
}
voidAnalysisCu(charnuma)
{
ge1=numa%10;
shi1=numa/10%10;
bai1=numa/100%10;
}
voidPIDControl()
{
e=SpeedSet*4-num;
duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));//kp*(error1-error2)+ki*error1+kd*(error1-2*error2+error3)
uk=uk1+duk;
out=(int)uk;//
if(out>100)
{
out=100;
}
elseif(out<0)
{
out=0;
}
uk1=uk;
e2=e1;
e1=e;
PWM_Time=out;//out
}
voidDelay(uchark)
{
uinti=0,j=0;
for(i=k;i>0;i--)
{
for(j=50;j>0;j--);
}
}
voidPWMOut()
{
if(cnt { PWM_C=1; } else { PWM_C=0; if(cnt>=100) { cnt=0; } } } /******************************************************************/ /*主函数*/ /******************************************************************/ voidmain(void) { init(); InitLcd();//初始化LCD DelayMs(15);//延时保证信号稳定 P1_0=1; //sprintf(Test1,"setspeed: ");//打印输出第一行信息 //ShowString(0,Test1); // //sprintf(TimeNum,"current: ");//打印输出第二行信息 //ShowString(1,TimeNum); while (1) { keyscan(); AnalysisData(SpeedSet); WriteCommand(0x80+0x0c); WriteData(0x30+bai); WriteData(0x30+shi); WriteData(0x30+ge); DelayMs(200); AnalysisCu(num/4); WriteCommand(0x80+0x49); WriteData(0x30+bai1); WriteData(0x30+shi1); WriteData(0x30+ge1); DelayMs(200); PWMOut(); } } /******************************************************************/ voidexter0()interrupt0using1 { //Impluse++; //P1_0=~P1_0; } voidtimer0()interrupt1 { //staticunsignedcharBit=0; staticunsignedinttime=0; TH0=THCon; TL0=TLCon; cnt++;//pid脉冲周期 time++;//转速测量周期 PWMOut(); if(time>=100) { time=0; num=(TH1*256+TL1);//4个脉冲,转一圈Impluse/4 P1_1=~P1_1; TH1=0; TL1=0; //Impluse=0; PIDControl(); } } 3.3硬件原理图 3.4实验心得 本次综合实验是在课外时间完成,复习了很多东西,自动控制原理,程序编写等,在PID的控制中,根据组长的分配任务,前期了解了一些程序编写中应该设计的控制量,基本上还是基于单片机上的程序,难度有点大,很多东西需要尹辉的帮助。 在实验中也遇到了一些问题,Kp、Ki、Kd的数值上的选取、计算等,以及闭环反馈的相关调节。 实际上编程难度对自己来说比较大,一是一段时间没有进行这方面的操作,二是自己编程比较薄弱。 最终通过大三时期的比例、微分、积分各个实验的程序和当时的实验资料,基本编出实现调速功能的程序,这次综合实验最大的好处就是为毕业设计做了一些好的复习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电气工程 综合 实验