




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指导教师评定成绩: 审定成绩: 自 动 化 学 院综合实验报告综合实验(1):51系列单片机直流电机闭环调速实验基于Protuse仿真实验平台实现专业: 电气工程与自动化 班级: 姓名: 学号: 时间: 2013.10-2013.12 一、设计要求1设计硬件电路:(1) 直流电机采用编码器测速(2) 直流电机速度给定采用电位器进行模拟电压给定,05V(3) AD转采用12位转换(4) 显示采用8位LED,或者LCD1602显示(5) 键盘4X4,PID等参数通过键盘设置。2软件(1) 控制算法:数字PID,参数在线修改。(2) 显示窗口:显示速度的设置值SV、速度的实际值PV。(3) 实际速度值,速度峰值、峰值时间等通过串口上传到上位机(选做) 二、实验内容直流电机PWM控制系统的主要功能包括:直流电机的加速、减速以及电机的正转和反转,并且可以调整电机的转速,还可以方便的读出电机转速的大小,能够很方便的实现电机的智能控制。其间,还包括直流电机的直接清零、启动(置数)、暂停、连续功能。该直流电机系统由以下电路模块组成:振荡器和时钟电路:这部分电路主要由AT89C52、些电容、晶振组成。设计输入部分:这一模块主要是利用带中断的独立式键盘来实现。设计控制部分:主要由AT89C52单片机的外部中断扩展电路组成。设计液晶显示部分由LCD1602液晶显示模块组成。直流电机PWM控制实现部分:主要由一些二极管、电机和L298直流电机驱动模块组成。1主控电路主控型号:AT89C52图2-1单片机最小系统2电机驱动电路电机的驱动芯片选用L298N 作为驱动芯片,工作稳定电机驱动信号由单片机提供,信号经过光耦隔离后,通过L298N的输出脚与两个电机相连,L298N内部包含4通道逻辑驱动电路,可以方便的驱动两个直流电机,或一个两相步进电机。L298N可接受标准TTL逻辑电平信号VSS,VSS可接457 V电压。4脚VS接电源电压,VS电压范围VIH为2546 V。输出电流可达25 A,可驱动电感性负载。L298N的 OUT1,OUT2和OUT3,OUT4之间可分别接电动机,该4个端口用来控制电机的转向,L298的另外两个使能端是用来通过调节占空比控制电机转速。图2-2电机驱动电路3键盘输入电路采用键盘4X4,进PID等参数通过键盘设置图2-3输入电路4AD采集电路型号:TLC2543,为12位AD图2-4AD采集电路5显示电路采用LCD1602液晶进行信息显示图2-5LCD1602显示电路三、PID算法将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。PID控制分为模拟PID控制和数字PID控制。而单片机PID控制属于数字PID控制,数字式PID控制算法可以分为位置式PID和增量式PID控制算法。经典算法如下:float MaxValue=100;/上限float MinValue=0;/下限/*PID参数定义*/struct PID sPID;/PID Control Structurestruct PID *sptr = &sPID;/PID 地址指针/*PID初始化*/void PID_Init() sptr-SetPoint = 100;sptr-Output = 0;/输出值sptr-LastError = 0;/Error-1sptr-PrevError = 0;/Error-2sptr-SumError = 0;sptr-Proportion = 0.5;/比例常数 Proportional Constsptr-Integral = 0;/积分常数 Integral Constsptr-Derivative = 0;/微分常数 Derivative Const/*PID位置式*/float LocPIDCalc(float NextPoint) float iError,dError;iError = sptr-SetPoint - NextPoint;/偏差sptr-SumError += iError;/积分dError = iError - sptr-LastError; /微分sptr-LastError = iError;sptr-Output = sptr-Proportion * iError/比例项+ sptr-Integral * sptr-SumError/积分项+ sptr-Derivative * dError;/微分项if(sptr-Output MaxValue) sptr-Output = MaxValue;/上限控制if(sptr-Output Output = MinValue;/下限控制printf(PIDOUT=%frnrn,sptr-Output);return sptr-Output;/*PID增量式*/float IncPIDCalc(float NextPoint)float iError;iError = sptr-SetPoint - NextPoint;sptr-Output = sptr-Proportion * iError/E0- sptr-Integral * sptr-LastError/E-1+ sptr-Derivative * sptr-PrevError;/E-2sptr-PrevError = sptr-LastError;sptr-LastError = iError;if(sptr-Output MaxValue) sptr-Output = MaxValue;/上限控制if(sptr-Output Output = MinValue;/下限控制printf(PIDOUT=%frnrn,sptr-Output);return(sptr-Output);四、整体电路图4-1整体电路五、结论本课题的目的在于利用单片机实现PID算法产生PWM脉冲来控制电机转速。归纳起来主要做了如下几方面的工作:1、PID算法与PWM控制技术有机的结合;2、设计了电机调速电路;3、利用C语言进行程序设计,并通过仿真(源程序见附录)。根据上面论述结合测试数据可以看出本次设计基本完成了设计任务和要求。通过此次设计,掌握了数字PID算法的使用及编程方法,学习了如何进行系统设计及相关技巧,为今后的工作和学习奠定了坚实的基础。六、控制程序代码1main.c#include #include delay.h#include 1602.h#include PID.h#include timer.h#includekeyboard.h#include /*- 主程序-*/main() unsigned char temp7;/定义显示区域临时存储数组 unsigned char key; /按键 LCD_Init(); /初始化液晶 DelayMs(20); /延时有助于稳定 LCD_Clear(); /清屏 init(); while (1) /主循环 sprintf(temp, %5.1f ,(float)speed);/float是强制转换符号,用于将结果转换成浮点型,%5.0f 表示浮点输出,共5位数,小数点后0位 LCD_Write_String(0,0,temp); key = KeyPro(); 2timer.c#include #include timer.h#include 1602.h#include PID.h#include unsigned int init_count;/中断次数unsigned int count,count1;/定时溢出次数unsigned int speed0,speed;/速度unsigned long time;/脉冲周期char spwm = 10;/pwm值/*定时器初始化*/void init_clock() TMOD = 0x21;/设定时器0为工作方式1,定时器1为工作方式2(自动重装初值)TH0 = 0x3c;/设定50ms一次中断TL0 = 0xb0;TH1 = 0x9c;/设定100us一次中断TL1 = 0x9c;EA = 1;/开总中断ET0 = 1;/开定时器0中断TR0 = 1;/启动定时器0/TR0 = 0;/关闭定时器0ET1 = 1;/开定时器1中断TR1 = 1;/启动定时器1/*外部中断初始化*/void init_int()EA = 1;/开总中断EX0 = 1;/开外部中断0IT0 = 1;/启动下降沿触发有效/*总初始化*/void init()init_int(); init_clock();/*中断服务程序*/void into() interrupt 0init_count+;void T0_time() interrupt 1 TH0 = 0x3c;/重装初值TL0 = 0xb0;count+;if(count=20)/50ms*20=1sEX0 = 0;TR0 = 0;led = led;speed = init_count;/电机转速spwm = pidcontrol(speed);count = 0;init_count = 0;EX0 = 1;TR0 = 1;void T1_time() interrupt 3count1+;if(count1 = 100) count1 = 0;/计时100us*100=10ms=100Hzif(count1 spwm) pwm = 1;/占空比else pwm = 0;31602.c/*- 名称:LCD1602 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK-*/#include 1602.h#include delay.hsbit RS = P20; /定义端口 sbit RW = P21;sbit EN = P22;#define RS_CLR RS=0 #define RS_SET RS=1#define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*- 判忙函数-*/ /* bit LCD_Check_Busy(void) DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); */*- 写入命令函数-*/ void LCD_Write_Com(unsigned char com) / while(LCD_Check_Busy(); /忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; /*- 写入数据函数-*/ void LCD_Write_Data(unsigned char Data) / while(LCD_Check_Busy(); /忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; /*- 清屏函数-*/ void LCD_Clear(void) LCD_Write_Com(0x01); DelayMs(5); /*- 写入字符串函数-*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0) LCD_Write_Com(0x80 + x); /表示第一行 else LCD_Write_Com(0xC0 + x); /表示第二行 while (*s) LCD_Write_Data( *s); s +; /*- 写入字符函数-*/void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) if (y = 0) LCD_Write_Com(0x80 + x); else LCD_Write_Com(0xC0 + x); LCD_Write_Data( Data); /*- 初始化函数-*/ void LCD_Init(void) LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ 4ad.c/*TLC2543驱动程序*/#include #include #include /* 2543控制引脚定义*/sbit D_OUT = P23; /*2543输出*/sbit D_IN = P24; /*2543输入*/sbit _CS = P25; /*2543片选*/sbit CLOCK = P26; /*2543时钟*/* 名称:delay 功能:延时模块 输入参数:n要延时的周期数 输出参数:无*/void delay(uchar n)uchar i;for(i=0;in;i+) _nop_();/* 名称:read2543 功能:TLC2543驱动模块 输入参数:port通道号 输出参数:ad转换值*/uint read2543(uchar port)uint ad=0,i;CLOCK=0;_CS=0;port=4;for(i=0;i12;i+) if(D_OUT) ad|=0x01; D_IN=(bit)(port&0x80); CLOCK=1; delay(3); CLOCK=0; delay(3); port=1; ad=1;return(ad);5pid.c#include PID.hfloat maxvalue=100,minvalue=0;/输出范围控制float setpoint=100,e,e1,e2;/pid偏差float uk,uk1,duk;/pid输出值float Kp=5.0,Ki=0.1,Kd=0.3;/pid控制系数/*PID算法*/float pidcontrol(float point)e = setpoint - point;duk = (Kp*(e-e1) + Ki*e + Kd*(e-2*e1+e2);uk = uk1 + duk;uk1 = uk;e2 = e1;e1 = e;if(uk maxvalue) uk=maxvalue;else if(uk minvalue) uk=minvalue;return uk;6keyboard.c/*- 名称:矩阵键盘-*/#include #includekeyboard.h#includedelay.h#define KeyPort P1/*-按键扫描函数,返回扫描键值-*/unsigned char KeyScan(void) /键盘扫描函数,使用行列反转扫描法 unsigned char cord_h,cord_l;/行列值中间变量 KeyPort=0x0f; /行线输出全为0 cord_h=KeyPort&0x0f; /读入列线值 if(cord_h!=0x0f) /先检测有无按键按下 DelayMs(10); /去抖 if(KeyPort&0x0f)!=0x0f) cord_h=KeyPort&0x0f; /读入列线值 KeyPort=cord_h|0xf0; /输出当前列线值 cord_l=KeyPort&0xf0; /读入
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 年产25吨帕博利珠单抗原液项目可行性研究报告
- 2025版绿色环保窗帘生产与安装合作协议
- 2025短视频平台用户互动与社群运营合作协议
- 2025版跨境电商航次运输及清关服务合同
- 2025版粮食仓储设施维护保养服务合同范本
- 2025版干粉砂浆原材料采购与检测合同
- 二零二五年房屋租赁日常租住服务协议(强力)
- 二零二五年养老护理帮工服务合同
- 2025版第一部分新能源汽车产业链投标邀请合同
- 2025版城市排水系统建设劳务分包合同范本
- 建筑施工现场签证单(模板)
- GBZ(卫生) 49-2014职业性噪声聋的诊断
- GB/T 9729-2007化学试剂氯化物测定通用方法
- GB/T 7588.2-2020电梯制造与安装安全规范第2部分:电梯部件的设计原则、计算和检验
- GB/T 13560-2017烧结钕铁硼永磁材料
- 三视图及尺寸标注课件
- 混凝土配合比验证检验委托书模板
- 住房公积金投诉申请书
- 众辰变频器说明书3400
- 小学教师量化考核表
- 《财务管理》课程教学实施方案
评论
0/150
提交评论