计算机控制系统课程设计直流电机测速调速系统_第1页
计算机控制系统课程设计直流电机测速调速系统_第2页
计算机控制系统课程设计直流电机测速调速系统_第3页
计算机控制系统课程设计直流电机测速调速系统_第4页
免费预览已结束,剩余28页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、XIAN TECHNOLOGICAL UNIVERSITY课程名称直流电机测速调速实验专业:电气工程及其自动化班级:姓名:学号:指导教师:秦刚成绩:2016年 7月11日计算机控制系统课程设计直流电机测速调速系统一、选定题目:电机速度控制系统二、设计目的和要求:计算机控制技术的课程设计是一个综合运用知识的过程,它不仅需要微型机控制理论、程序设计方面的基础知识, 而且还需要具备一定的生产工艺知识。课程设计包括确定控制任务、 系统总体方案设计、 硬件系统设计、 控制软件的设计等,以便使学生掌握计算机控制系统设计的总体思路和方法。三、功能需求:1 、基本功能:(1)该系统使用实验箱的直流电机、160

2、2 液晶、 DA、键盘等模块完成设计;(2)直流电机通过 DA模块使用 PWM方式进行驱动及调速;(3)能够通过 1602 液晶显示当前转速及 PWM占空比;(4)通过按键控制电机的启动和停止。2、扩展功能:(1)能够通过按键手动输入目标转速(转 / 秒),启动电机后控制电机稳定在目标转速;(2)使用 1602 液晶实时显示目标转速、当前转速及启停状态(on/off )。四、实验思路:本直流电机调速系统以单片机系统为依托,根据 PWM调速的基本原理, 控制电动机的转速为依据,实现对直流电动机的调速, 并通过单片机控制速度的变化。本设计的直流电机调速系统主要是由硬件和软件两大部分组成。硬件部分是

3、前提,是整个系统执行的基础,它主要为软件提供程序运行的平台。而软件部分,是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制器所要实现的各项功能,达到控制器自动对电机速度的有效控制。用 51 来产生 PWM波就必须要用软件编程的方法来模拟。 方法大概可以分为软件延时和定时器产生两种方法。本次课程设计我们采用定时器产生PWM方波。定时器产生 PWM:这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。五、实验设备:单片机开发实验仪一台;AT89C51;LCD1602;DA数模转换;按键;光电开关六、实验原理:1、硬件框图:硬件部分

4、主要由电位器、模数转换模块、51 单片机、显示模块、驱动电路和无刷直流电机组成。其功能框图如下:2、硬件介绍:1)1602 液晶显示模块电路1602C字符型液晶: CS:片选信号,低电平有效;RS:选择读写的是指令或数据, L:指令, H:为数据。 RW:读写控制端, L:写操作, H:读操作。12864J 图形点阵液晶: CS:片选信号,低电平有效; CS1/2:左右半屏使能选择, H:左半屏, L:右半屏; RS:选择读写的是指令或数据,L:指令, H:为数据。 RW:读写控制端, L:写操作, H:读操作。12864M图形点阵液晶: JP6 的 16 脚是空脚, JP6 的 15 脚是

5、PSB:PSB接高电平,CPU与液晶使用并行接口连接, 连接方法与 12864J 完全相同; PSB接低电平,CPU与液晶使用串行接口连接, 此时,RS、RW、E 与 CPU的 I/O 管脚相连(STARES59PA才有该功能)。VCCR4DS1470R31W2WR110K10K35RD246U5ACSU3BRSRWJP921(1602C 字符型液晶 )R4VCCDS1470R31W2WR110K10K35RD24U5A6CSU3BRS(1602C 字符型液晶 )RW2CS1/21JP61VSS2VDD3V04RS5RW6ED07DB0D18DB1D29DB2D310DB3D411DB4D51

6、2DB5D613DB6D714DB715LED+16LED-1602CJP61VSS2VDD3V04RS5RW6ED07DB0D18DB1D29DB2D310DB3D411DB4D512DB5D613DB6D714DB715CS116CS23U3A2117RST18VOUT19LED+20LED-JP912864J(12864J 图形点阵液晶)2) DAC0832数模转换DS23R71470CSU201CSVDD2WR118WRWR219ILE17XFERD07DI0NVREFD16CDI1LD252DI23RFBD348DI30D416CDI4AIOUT1D515DI5DIOUT2D614D

7、I6VCC20W5D51K897U23112123R78510-12VC330.1uF+12V8R1626R150R151VCC4U26C9Q7C8C265510D713DI73AGNDLM741CN541W6-12VOUTLM324N11R14910DGND10KR794.7K-12VOUT1CS:片选,低有效;OUT:转换电压输出;OUT1:经功放电路的电压输出;电位器 W5:调整基准电压。3)发光管、按键、开关12JP65123 456 78VCCJP63AR10712LED1470LED2DS32LED3LED4123456781111111111111111RRRRRRRR00000

8、0001111111155555555DS35DS36DS37DS38DS39DS40DS41DS42B1JP65:发光管控制接口, 0灯亮, 1灯灭JP74VCC12345678R11910K1A23456789CS29S30S31S32S33S34S35S36B按键电路原理图D12JP80VCC12345678R12410K1A2K5K6K7K83456789S21S22S23S24S25S26S27S28B开关电路原理图CJP74:按键控制接口;按下0 信号,松开 1 信号JP80:开关控制接口;闭合0 信号,断开 1 信号4) AT89C51本课题中控制芯片的作用主要是与ADC0809

9、相连接,采集模数转换后得到的8 位二进制码,过公式计算后得到电压值,同时连接四位数码管进行显示。综合考虑,选用 AT89C51即满足要求。简介:AT89C51是一种带 4K 字节 FLASH存储器的低电压、高性能CMOS 8 位微处理器。单片机的可擦除只读存储器可以反复擦除1000 次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8 位 CPU和闪烁存储器组合在单个芯片中,ATMEL的 AT89C51是一种高效微控制器。 AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。AT89C51引脚图如下:主要特性:与

10、 MCS-51 兼容·; 4K 字节可编程 FLASH存储器;寿命: 1000写 / 擦循环;数据保留时间:10 年全静态工作:0Hz-24MHz;三级程序存储器锁定;128×8位内部RAM;32可编程I/O线;两个16 位定时器 /计数器; 5 个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路;直流电机转速测量/ 控制5)使用光电开关测速VCCJP4R8DS41R18DS10CTRLVCC4702330R17DS9330LIGHTR16R20R19DS8M330 OP14.7KQ433013直流电机8550U7AU7B24R281234GP2S054

11、.7KREVSN74LS14NSN74LS14NCTRL :控制电压 (DAC0832经功放电路提供 ) 输入;REV:光电开关脉冲输出 ( 用于转速测量 ) ;LIGHT:低电平点亮发光管。3、软件设计主程序设计:主程序是一个循环程序, 其主要思路是, 先设定好速度初始值, 这个初始值与测速电路送来的值相比较得到一个误差值,然后用 PID 增量式算法输出控制系数给 PWM发生电路改变波形的占空比,进而控制电机的转速。主程序流程图如下:五、实验总结:计算机控制技术的课程设计相比硬件的课程设计,简直难了不止一个档次,作为主要的编程人员, 当我实际要去控制一个物体的时候,我才知道自己以前学的知识有

12、多么的不牢固, 不过真真正正的去做一个实物控制程序的时候,才能真切的体会到以前书本上学的知识是如何运用到实际的,我基本上可以说是为了应付考试勉勉强强学了一些,这次实际做到项目设计后,才理解其真正的含义。还有本次项目,我们采用了LCD显示屏作为显示单元,比LED数码管复杂,LCD液晶显示屏这也是以前没有运用到过的,所以总体来说,这次课程设计带给我的不仅仅是旧知识的复习,还有新的探索。本课程设计得以完成, 首先要感谢秦刚老师, 因为课程设计在他的悉心指导下才能顺利完成。他渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范、朴实无华、平易近人的人格魅

13、力对我的影响非常深远。 本设计从选题到完成, 每一部步是在老师的指导下完成的,倾注了老师大量的心血。通过此次的课程设计, 我学到了很多知识, 跨越了传统方式下的教与学的体制束缚,在课程设计的写作过程中, 通过查资料和搜集有关的文献, 培养了自学能力和动手能力。并且由原先的被动的接受知识转换为主动的寻求知识, 这可以说是学习方法上的一个很大的突破。 在以往的传统学习模式下, 我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好地处理知识和实践相结合的问题。在课程设计的写作过程中也学到了做任何事情所要的态度和心态, 对于发展过程中出现的任何问题和偏差都不要轻视, ,要通过正确的途径去解决,

14、在做事情的过程中要有耐心和毅力, 不要一遇到困难就打退堂鼓, 只要坚持下去就可以找到思路去解决问题的。再次感谢给我鼓励的老师、同学和朋友,谢谢!六、 附件:程序#include<reg52.h>#include<math.h>/*以下硬件连线设置 */sbit key0=P10;/占空比(设定值)增按键;且rev 接int0sbit key1=P11;/占空比(设定值)减按键sbit power = P17;/启停按键sbit auto_run=P15;/自动运行按键sbit set=P14;/set 按键sbit left=P12;/左移光标sbit right=P1

15、3;/ 右移光标sbit LCD_RS=P30;/1602的 RSsbit LCD_RW=P31;/1602的 RWsbit sys_data=P34;/继电器控制脚,用于切换DA 功率输出方向(电机 or 加热电阻)xdata unsigned char dac0832_addr _at_ 0xd000;/DA xdata unsigned char LCD_DATA _at_ 0x8000;/LCD1602的地址的地址/*以下为系统的状态量设置 */bit rps_triger=0;/ 转速(温度)刷新显示控制,1 为需要刷新显示, 0 为不需要刷新显示bit scale_triger=0

16、;/占空比刷新显示控制bit power_triger=0;/电源指示刷新显示控制bit power_data=0;/ 电源状态, 0 为关断, 1 为运行bit set_triger=0;/ 设置状态, 0 为正常运行, 1 为设置模式bit auto_triger=0;/auto(自动调整) 状态, 0为正常模式, 1 为自动调整模式bit auto_triger_triger=0;/auto标志刷新显示控制, 当 auto状态被被改变时才需刷新显示/*以下为系统的数据量 */char set_data=0;/设置模式下设置的是第几位, 0(3转速设定为 4 位),02(温度设定为 3 位

17、)unsigned int scale=10;/ 占空比数据(2 倍关系,可以控制到 0.5%),初值为 5%unsigned int rps=0;/ 转速计数变量unsigned int rps1=0;/目标值变量unsigned int rps_data=0;/转速值unsigned int time=0;/每秒计数变量(计数周期为 250u 秒,故 4000 次为 1 秒)unsigned int time2=0;/ 检测插值计数变量( 0.05 秒检测1 次,实时调整比例系数)unsigned int time3=0;/ 比例系数控制(若当前值和目标值差值值大,则调整迅速,反之则缓慢调

18、整)unsigned char time_scale=0;/ 占空比总周期计数变量,一个周期 200 次,可以精确到 0.5%unsigned inttime_check4=1000,3000,6000,10000;/转速调整时间系数表格unsigned char check=0;/ 检测周期等级, 分为 0 4 共 5 个等级, 0 为极小时间系数, 4 为稳定不变void _nop_(void);/*延时函数 */void delay(int a)while(a-);/*外部中断初始化*/void init_int0()IT0=1;EX0=1;EA=1;/*计数器0 初始化 */void

19、T0_init()TMOD = 0x01;TH0 = 0xff;/计数周期为250u 秒TL0 = 0x1a;ET0=1;EA=1;TR0=1;/*LCD1602相关函数 */void LCD_write_com(unsigned char com)LCD_RS=0;LCD_RW=0;LCD_DATA=com;delay(80);void LCD_write_data(unsigned char dat)LCD_RS=1;LCD_RW=0;LCD_DATA=dat;delay(80);/*LCD1602在电机调速系统下的初始化函数*/void LCD_init(void)LCD_write_c

20、om(0x38);LCD_write_com(0x0c);LCD_write_com(0x06);LCD_write_com(0x01);LCD_write_com(0x80);LCD_write_data('R');LCD_write_data('P');LCD_write_data('M');LCD_write_com(0x88);LCD_write_data('S');LCD_write_data('e');LCD_write_data('t');LCD_write_com(0xc8);LCD

21、_write_data('R');LCD_write_com(0xcd);LCD_write_data('.');LCD_write_com(0xcf);LCD_write_data('%');LCD_write_com(0x8b);LCD_write_data(rps1/1000+0x30);LCD_write_data(rps1%1000/100+0x30);LCD_write_data(rps1%100/10+0x30);LCD_write_data(rps1%10+0x30);/*光标闪烁开 */void flash_on(void)LC

22、D_write_com(0x0f);/*光标闪烁关 */void flash_off(void)LCD_write_com(0x0c);/*显示当前转速或温度 */void display_rps(void)flash_off();LCD_write_com(0x80);LCD_write_data('R');LCD_write_data('P');LCD_write_data('M');LCD_write_data(rps_data/1000+0x30);LCD_write_data(rps_data%1000/100+0x30);LCD_wr

23、ite_data(rps_data%100/10+0x30);LCD_write_data(rps_data%10+0x30);rps_triger=0;/*显示当前占空比 */void display_scale(void)flash_off();LCD_write_com(0xcb);LCD_write_data(scale/2/10+0x30);LCD_write_data(scale/2%10+0x30);LCD_write_com(0xce);LCD_write_data(scale%2*5+0x30);scale_triger=0;/*显示 auto 模式的状态 */void di

24、splay_auto(void)flash_off();if(auto_triger=1)LCD_write_com(0xc3);LCD_write_data('a');LCD_write_data('u');LCD_write_data('t');LCD_write_data('o');elseLCD_write_com(0xc3);LCD_write_data(' ');LCD_write_data(' ');LCD_write_data(' ');LCD_write_data(

25、' ');auto_triger_triger=0;/*显示 power 的状态( on 或 off )*/void display_power(void)flash_off();LCD_write_com(0xc0);if(power_data=0)LCD_write_data('o');LCD_write_data('f');LCD_write_data('f');power_triger=0;auto_triger=0;elseLCD_write_data('o');LCD_write_data('n

26、');LCD_write_data(' ');power_triger=0;auto_triger=0;/*调整输出占空比函数 */void check_rps(void)if(power_data=0) return;if(rps1<rps_data)scale-;if(scale<=1) scale=1;else if(rps1>rps_data)scale+;if(scale>=199) scale=199;scale_triger=1;/*显示电机调速系统下set 模式函数 */void display_set(void)switch(s

27、et_data)case0:flash_on();LCD_write_com(0x8b);LCD_write_data(rps1/1000+0x30);LCD_write_com(0x8b);delay(1000);break;case1:flash_on();LCD_write_com(0x8c);LCD_write_data(rps1%1000/100+0x30);LCD_write_com(0x8c);delay(1000);break;case2:flash_on();LCD_write_com(0x8d);LCD_write_data(rps1%100/10+0x30);LCD_wr

28、ite_com(0x8d);delay(1000);break;case3:flash_on();LCD_write_com(0x8e);LCD_write_data(rps1%10+0x30);LCD_write_com(0x8e);delay(1000);break;default:flash_off();break;/*以下为各个按键的函数 */*power void fn_power() 电源键 */if(power=1) return;elsedelay(20);/按键去抖if(power=0)while(power!=1);power_data=power_data;power_t

29、riger=1;set_triger=0;auto_triger_triger=1;else return;/*自动调整模式键 */void fn_auto()if(auto_run=1) return;elsedelay(20);/按键去抖if(auto_run=0)while(auto_run!=1);if(power_data=0) auto_triger=0;else auto_triger=auto_triger;auto_triger_triger=1;set_triger=0;else return;/*set设置模式键 */void fn_set()if(set=1) retu

30、rn;elsedelay(20);/按键去抖if(set=0)while(set!=1);set_triger=set_triger;auto_triger=0;auto_triger_triger=1;else return;/*减 键(set模式为调整目标值,运行模式调整占空比)*/void fn_key0()if(key0=1) return;elsedelay(20);/按键去抖if(key0=0)while(key0!=1);if(set_triger=1)switch(set_data)case 0:if(rps1/1000>=1) rps1=rps1-1000; break

31、; case 1:if(rps1%1000/100>=1) rps1=rps1-100; break; case 2:if(rps1%100/10>=1) rps1=rps1-10; break; case 3:if(rps1%10>=1) rps1=rps1-1; break;elseif(scale<=1) scale=1;else scale-;scale_triger=1;else return;/*加 键( set模式 为调 整目 标值 , 运 行 模式 调 整 占空 比)*/void fn_key1()if(key1=1) return;elsedelay(

32、20);/按键去抖if(key1=0)while(key1!=1);if(set_triger=1)switch(set_data)case 0:if(rps1/1000<9) rps1=rps1+1000; break; case 1:if(rps1%1000/100<9) rps1=rps1+100; break; case 2:if(rps1%100/10<9) rps1=rps1+10; break; case 3:if(rps1%10<9) rps1=rps1+1; break;elseif(scale>=199) scale=199;else scal

33、e+;scale_triger=1;else return;/*光标左移键( set 模式下有效) */void fn_left()if(left=1) return;elsedelay(20);/按键去抖if(left=0)while(left!=1);if(set_triger=1)if(set_data>=3) set_data=3;else set_data+;else return;else return;/*光标右移键( set 模式下有效) */void fn_right()if(right=1) return;elsedelay(20);/按键去抖if(right=0)w

34、hile(right!=1);if(set_triger=1)if(set_data<=0) set_data=0;else set_data-;else return;else return;/*转数计数(外部中断void int0() interrupt 0/0)*/外部中断 0 处理程序rps+;/对转数计数器进行累加计数/*定时器 0 中断服务函数 */void timer0(void) interrupt 1unsigned int t;TH0 = 0xff; / 重新装载计时常数 TL0 = 0x1a;if(time_scale>=200) time_scale=0;/ 占空比计数控制if(time>=4000)/ 如果计满1 秒,计秒变量归零,并将rps的转数数据送到转速(温度)数据变量中保存time=0;time_scale=0;if(sys_data=1)rps_data=rps*60/4;/在电机调速模式下:每转有4 个脉冲,所以除以4rps=0;/rps归零rps_triger=1;/rps显示开关有效if(check=4)/ 跳出稳态的判断if(sys_data=1)if(abs(rps_data-rps

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论