当前位置:文档之家› 电气工程综合实验

电气工程综合实验

成绩:xxda学自动化学院综合实验报告题目:直流电机闭环调速系统学生姓名:xx学号:xx同组人员:xx指导教师:xx完成时间:2012.12.直流电机闭环调速系统实验报告一、实验名称:直流电机闭环调速基本情况:1. 学生姓名:xx2. 学号:x3. 班级:0830902班4. 实验项目组长:xx5. 同组其他成员:序号姓名班级学号分工系数1 x 0830x oo4 0.342 xx 0x oo1 0.223 xxx 083x oo8 0.224 xxxx 083x oo89 0.226.具体分工:任务负责人尹辉王玉棣伍沁楠颜鸿运分析设计给出设计方案√硬件电路设计√√软件程序设计√√综合实验报告√√√√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 调速系统的开关频率较高,仅靠电枢电感的滤波作用就可获得平稳的直流电流,低速特性好、稳速精度高、调速范围宽。

同样,由于开关频率高,快速响应特性好,动态抗干扰能力强,可以获得很宽的频带;开关器件只工作在单片机 转速测量PWM 驱动转速显示 按键接口 供电电源 直流电机 图一 转速控制器原理框图开关状态,因此主电路损耗小、装置效率高;直流电源采用不可控整流时,电网功率因数比相控整流器高。

数字PID 算法1、PID 控制系统组成2、 PID 调节器的微分方程和传递函数PID 调节器是一种线性调节器,它将给定值r(t)与实际输出值c(t)的偏差的比例(P)、积分(I)、微分(D)通过线性组合构成控制量,对控制对象进行控制。

PID 调节器的微分方程:⎥⎦⎤⎢⎣⎡++=⎰t D I P dt t de T dt t e T t e K t u 0)()(1)()( 式中 )()()(t c t r t e -=PID 调节器的传输函数:⎥⎦⎤⎢⎣⎡++==S T S T K S E S U S D D I P 11)()()( 3模拟PID 控制规律的离散化 模拟形式离散化形式 )()()(t c t r t e -=)()()(n c n r n e -= dT t de )( Tn e n e )1()(-- ⎰t dt t e 0)( ∑∑===ni n i i e T T i e 00)()( 4、数字PID 控制器的差分方程[]000)()()()1()()()()(u n u n u n u u n e n e T T i e T T n e K n u D I P n i D I P +++=+⎭⎬⎫⎩⎨⎧--++=∑=式中 )()(n e K n u P P = 比例项 ∑==n i IP I i e T T K n u 0)()( 积分项 [])1()()(--=n e n e TT K n u D P D 微分项 5、 PID 调节器各校正环节的作用(1)比例环节:即时成比例地反应控制系统的偏差信号e(t),偏差一旦产生,调节器立即产生控制作用以减小偏差。

(2)积分环节:主要用于消除静差,提高系统的无差度。

积分作用的强弱取决于积分时间常数TI ,TI 越大,积分作用越弱,反之则越强。

(3)微分环节:能反应偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。

三、实验结果分析(含程序、数据记录、控制算法及分析和实验总结等):3.1 程序流程图 开始LCD 速度显示、计数器0,计数器1,定时器0初始化给定值与实际值比较(PID 算法)按下按键?结束3.2源程序/*计时器T0用于产生PWM脉冲,同时T1用于计数器模式,记录脉冲的个数,确定转速*/#include<reg52.h>#include<stdio.h> //标准输入输出#include<intrins.h>//移位头函数#include <math.h> //#define uchar unsigned char#define uint unsigned int#define Data P0//数据端口#define THCon 0xfc#define TLCon 0x66 //初值1mssbit P1_0 = P1^0;sbit P1_1 = P1^1;sbit RS = P2^4; //Pin4 改P2^5sbit RW = P2^5; //Pin5 P2^6sbit E = P2^6; //Pin6 P2^7sbit key1 = P3^0; //键盘改sbit key2 = P3^1;char data TimeNum[]=" "; char data Test1[]=" "; char ge,shi,bai,ge1,shi1,bai1; //sbit test = P1^3;sbit PWM_C = P1^2 ; //pwm控制端P3^3int e = 0, e1 = 0, e2 = 0; //pid偏差float uk = 0, uk1 = 0.0, duk = 0.0; //pid输出值float Kp = 0.4,Ki = 0.02, Kd = 0.02 ; //pid控制系数int out;uint SpeedSet = 16;uint cnt = 0;uint num = 0; //脉冲计数Impluse = 0,uint PWM_Time = 50; //脉冲宽度/************************************ ******************************//* 函数声明*//************************************ ******************************/void PWMOut();/************************************ ******************************//* 微秒延时函数*//************************************ ******************************/void DelayUs(unsigned char us)//delay us {unsigned char uscnt;uscnt=us>>1; /*12MHz频率*/ while(--uscnt);}/************************************ ******************************//* 毫秒函数声明*//************************************ ******************************/void DelayMs(unsigned char ms){while(--ms){DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);}}/************************************ ******************************//* 写入命令函数*//******************************************************************/void WriteCommand(unsigned char c){DelayMs(5);//操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;}/************************************ ******************************//* 写入数据函数*//************************************ ******************************/void WriteData(unsigned char c){DelayMs(5); //操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;}/************************************ ******************************//* 写入字节函数*//************************************ ******************************/void ShowChar(unsigned char pos,unsigned char c){unsigned char p;if (pos>=0x10)p=pos+0xb0; //是第二行则命令代码高4位为0xcelsep=pos+0x80; //是第二行则命令代码高4位为0x8WriteCommand (p);//写命令WriteData (c); //写数据}/************************************ ******************************//* 写入字符串函数*//************************************ ******************************/void ShowString (unsigned char line,char *ptr){unsigned char l,i;l=line<<4;for (i=0;i<16;i++)ShowChar (l++,*(ptr+i));//循环显示16个字符}/************************************ ******************************//* 初始化函数*//************************************ ******************************/void init(){TMOD = 0x51;TH0 = THCon;TL0 = TLCon;TH1 = 0;TL1 = 0;//EA = 1;ET0 = 1;TR0 = 1;//开始计时器0ET1 = 1;TR1 = 1;//开始计数器1EA = 1;e = 0;e1 = 0;e2 = 0;}void InitLcd(){DelayMs(15);WriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x38); //display modeWriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏DelayMs(15);sprintf(Test1,"set speed:"); //打印输出第一行信息ShowString(0,Test1);sprintf(TimeNum,"current:");//打印输出第二行信息ShowString(1,TimeNum);}void keyscan(){if(!key1){ //按下相应的按键,数码管显示相应的码值DelayMs(5);if(!key1){SpeedSet++;// P1_0=~P1_0;// num++;}}}void AnalysisData(char numa) {ge = numa%10;shi = numa/10%10;bai = numa/100%10;}void AnalysisCu(char numa){ge1 = numa%10;shi1 = numa/10%10;bai1 = numa/100%10;}void PIDControl(){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;}else if(out < 0){out = 0;}uk1 = uk;e2 = e1;e1 = e;PWM_Time = out; // out}void Delay(uchar k){uint i = 0,j = 0;for(i = k;i > 0;i--){for(j = 50; j > 0; j--);}}void PWMOut(){if(cnt < PWM_Time){PWM_C = 1;}else{PWM_C = 0;if(cnt >= 100){cnt = 0;}}}/************************************ ******************************//* 主函数*//************************************ ******************************/void main(void){init();InitLcd(); //初始化LCDDelayMs(15); //延时保证信号稳定P1_0 = 1;//sprintf(Test1," set speed:" ); //打印输出第一行信息//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();}}/************************************ ******************************/void exter0() interrupt 0 using 1{// Impluse++;// P1_0 = ~P1_0;}void timer0() interrupt 1{// static unsigned char Bit = 0;static unsigned int time = 0;TH0 = THCon;TL0 = TLCon;cnt++; //pid脉冲周期time++; //转速测量周期PWMOut();if(time >= 100){time = 0;num = (TH1*256+TL1);//4个脉冲,转一圈Impluse/4P1_1 = ~P1_1;TH1 = 0;TL1 = 0;//Impluse = 0;PIDControl();}}3.3硬件原理图3.4实验心得本次综合实验是在课外时间完成,复习了很多东西,自动控制原理,程序编写等,在PID的控制中,根据组长的分配任务,前期了解了一些程序编写中应该设计的控制量,基本上还是基于单片机上的程序,难度有点大,很多东西需要尹辉的帮助。

相关主题