XI`AN TECHNOLOGICAL UNIVERSITY课程名称直流电机测速调速实验专业:电气工程及其自动化班级:姓名:学号:指导教师:秦刚成绩:2016年7月11日计算机控制系统课程设计——直流电机测速调速系统一、选定题目:电机速度控制系统二、设计目的和要求:计算机控制技术的课程设计是一个综合运用知识的过程,它不仅需要微型机控制理论、程序设计方面的基础知识,而且还需要具备一定的生产工艺知识。
课程设计包括确定控制任务、系统总体方案设计、硬件系统设计、控制软件的设计等,以便使学生掌握计算机控制系统设计的总体思路和方法。
三、功能需求:1、基本功能:(1)该系统使用实验箱的直流电机、1602 液晶、 DA、键盘等模块完成设计;(2)直流电机通过DA模块使用PWM方式进行驱动及调速;(3)能够通过 1602 液晶显示当前转速及 PWM占空比;(4)通过按键控制电机的启动和停止。
2、扩展功能:(1)能够通过按键手动输入目标转速(转/秒),启动电机后控制电机稳定在目标转速;(2)使用 1602 液晶实时显示目标转速、当前转速及启停状态(on/off )。
四、实验思路:本直流电机调速系统以单片机系统为依托,根据 PWM调速的基本原理,控制电动机的转速为依据,实现对直流电动机的调速,并通过单片机控制速度的变化。
本设计的直流电机调速系统主要是由硬件和软件两大部分组成。
硬件部分是前提,是整个系统执行的基础,它主要为软件提供程序运行的平台。
而软件部分,是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制器所要实现的各项功能,达到控制器自动对电机速度的有效控制。
用51 来产生 PWM波就必须要用软件编程的方法来模拟。
方法大概可以分为软件延时和定时器产生两种方法。
本次课程设计我们采用定时器产生PWM方波。
定时器产生PWM:这种方法利用了定时器溢出中断,在中断服务程序改变电平的高低,在程序较复杂、多操作时仍能输出较准确的pwm波形。
五、实验设备:单片机开发实验仪一台;AT89C51;LCD1602;DA数模转换;按键;光电开关六、实验原理:1、硬件框图:硬件部分主要由电位器、模数转换模块、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 脚是 PSB:PSB接高电平,CPU与液晶使用并行接口连接,连接方法与 12864J 完全相同; PSB接低电平,CPU与液晶使用串行接口连接,此时,RS、RW、E 与 CPU的 I/O 管脚相连(STAR ES59PA才有该功能)。
西安工业大学课程设计(论文)用纸R4VCC DS1470R31W2WR110K10K35RD246U5ACS U3BRSRWJP921(1602C 字符型液晶 )R4VCC DS1470R31W2WR110K10K35RD24U5A6CS U3BRS(1602C 字符型液晶 ) RWJP61VSS2VDD3V04RS5RW6ED07DB0D18DB1D29DB2D310DB3D411DB4D512DB5D613DB6D714DB715LED+16LED-1602CJP61VSS2VDD3V04RS5RW6ED07DB0D18DB1D29DB2D310DB3D411DB4D512DB5D613DB6D714DB7CS1/22115CS1 16CS23U3A2117RST18VOUT19LED+20LED-JP912864J西安工业大学课程设计(论文)用纸(12864J 图形点阵液晶)2) DAC0832 数模转换R71DS23VCC470CSU20R781 CSVDD202510WR118 -12VWRWR2W5D5C3319ILE170.1uFR151XFER1KD0 7 DI0 N VREF8VCCD1 6 CDI1 L+12V4D2 5 29DI2 3 RFB7R162U26CD3 4 8U23 89DI3 0D4 16 C IOUT1 112R1508Q7 D5 15 DI4 A 126CC2655DI5 DIOUT210D6 14 3DI6LM324ND713LM741CN1DI75OUT14W6 13R149AGND-12V10DGND10KR794.7KOUT1-12VCS :片选,低有效;OUT :转换电压输出;OUT1:经功放电路的电压输出;电位器 W5:调整基准电压。
3)发光管、按键、开关12西安工业大学课程设计(论文)用纸JP6512345 6 78VCCJP63AR10712 LED1470LED2DS32LED3LED4123456781111111111111111R R R R R R R R000000001111111155555555DS35 DS36 DS37 DS38 DS39 DS40 DS41 DS42B1JP65:发光管控制接口, 0-灯亮, 1-灯灭JP74VCC1 2 3 4 5 6 78R11910K1 A23456789CS29S30S31S32S33S34S35S36 B按键电路原理图12西安工业大学课程设计(论文)用纸JP80VCC1 2 3 4 5 6 78R124 10K1A2K5 K6 K7 K83456789S21S22S23S24S25S26S27S28B开关电路原理图CJP74:按键控制接口;按下-0 信号,松开- 1 信号JP80:开关控制接口;闭合-0 信号,断开- 1 信号4) AT89C51本课题中控制芯片的作用主要是与ADC0809相连接,采集模数转换后得到的8位二进制码,过公式计算后得到电压值,同时连接四位数码管进行显示。
综合考虑,选用 AT89C51即满足要求。
简介:AT89C51是一种带 4K 字节 FLASH存储器的低电压、高性能CMOS 8 位微处理器。
单片机的可擦除只读存储器可以反复擦除1000 次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8 位 CPU和闪烁存储器组合在单个芯片中,ATMEL的 AT89C51是一种高效微控制器。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51引脚图如下:主要特性:与 MCS-51 兼容 ·;4K 字节可编程 FLASH 存储器;寿命: 1000写 /擦循环; 数据保留时间: 10 年 全静态工作: 0Hz-24MHz ; 三级程序存储器锁定; 128×8 位内部 RAM ; 32 可编程 I/O 线;两个 16 位定时器 /计数器; 5个中断源;可编程串行通道; 低功耗的闲置和掉电模式;片内振荡器和时钟电路;直流电机转速测量 / 控制5)使用光电开关测速VCC JP4R8DS41R18 DS10CTRLVCC4702330R17DS9330 LIGHTR16 R20R19DS8330 OP1 4.7K MQ4330 直流电机13855024U7AU7BR281234GP2S054.7KREVSN74LS14NSN74LS14NCTRL :控制电压 (DAC0832经功放电路提供 ) 输入;REV :光电开关脉冲输出 ( 用于转速测量 ) ;LIGHT :低电平点亮发光管。
3、软件设计主程序设计:主程序是一个循环程序,其主要思路是,先设定好速度初始值,这个初始值与测速电路送来的值相比较得到一个误差值,然后用 PID 增量式算法输出控制系数给 PWM发生电路改变波形的占空比,进而控制电机的转速。
主程序流程图如下:五、实验总结:计算机控制技术的课程设计相比硬件的课程设计,简直难了不止一个档次,作为主要的编程人员,当我实际要去控制一个物体的时候,我才知道自己以前学的知识有多么的不牢固,不过真真正正的去做一个实物控制程序的时候,才能真切的体会到以前书本上学的知识是如何运用到实际的,我基本上可以说是为了应付考试勉勉强强学了一些,这次实际做到项目设计后,才理解其真正的含义。
还有本次项目,我们采用了LCD显示屏作为显示单元,比LED数码管复杂,LCD液晶显示屏这也是以前没有运用到过的,所以总体来说,这次课程设计带给我的不仅仅是旧知识的复习,还有新的探索。
本课程设计得以完成,首先要感谢秦刚老师,因为课程设计在他的悉心指导下才能顺利完成。
他渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范、朴实无华、平易近人的人格魅力对我的影响非常深远。
本设计从选题到完成,每一部步是在老师的指导下完成的,倾注了老师大量的心血。
通过此次的课程设计,我学到了很多知识,跨越了传统方式下的教与学的体制束缚,在课程设计的写作过程中,通过查资料和搜集有关的文献,培养了自学能力和动手能力。
并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。
在以往的传统学习模式下,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好地处理知识和实践相结合的问题。
在课程设计的写作过程中也学到了做任何事情所要的态度和心态,对于发展过程中出现的任何问题和偏差都不要轻视,,要通过正确的途径去解决,在做事情的过程中要有耐心和毅力,不要一遇到困难就打退堂鼓,只要坚持下去就可以找到思路去解决问题的。
再次感谢给我鼓励的老师、同学和朋友,谢谢!!六、附件:程序#include<reg52.h>#include<math.h>/*******************以下硬件连线设置 **************/sbit key0=P1^0;// 占空比(设定值)增按键;且rev 接 int0sbit key1=P1^1;// 占空比(设定值)减按键sbit power = P1^7;//启停按键sbit auto_run=P1^5;//自动运行按键sbit set=P1^4;//set 按键sbit left=P1^2;//左移光标sbit right=P1^3;//右移光标sbit LCD_RS=P3^0;//1602 的 RSsbit LCD_RW=P3^1;//1602 的 RWsbit sys_data=P3^4;//继电器控制脚,用于切换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;//占空比刷新显示控制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 位),0~2(温度设定为 3 位)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;//比例系数控制(若当前值和目标值差值值大,则调整迅速,反之则缓慢调整)unsigned char time_scale=0;//占空比总周期计数变量,一个周期 200次,可以精确到0.5%unsigned int time_check[4]={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;EA=1;}/*******************计数器 0 初始化 *****************/void 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在电机调速系统下的初始化函数*************/{LCD_write_com(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_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){LCD_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_write_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 display_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');}else{LCD_write_com(0xc3);LCD_write_data(' ');LCD_write_data(' ');LCD_write_data(' ');LCD_write_data(' ');}auto_triger_triger=0;}/************显示 power 的状态( on 或 off )*************/ void display_power(void){flash_off();LCD_write_com(0xc0);if(power_data==0){LCD_write_data('f');LCD_write_data('f');power_triger=0;auto_triger=0;}else{LCD_write_data('o');LCD_write_data('n');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;}}/************显示电机调速系统下set 模式函数 **************/void display_set(void){switch(set_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_writ e_com(0x8d);delay(1000);break;case3:flash_on();LCD_write_com(0x8e);LCD_write_data(rps1%10+0x30);LCD_write_c om(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_triger=1;set_triger=0;auto_triger_triger=1;}else return;}}/************自动调整模式键 **************/ void fn_auto(){if(auto_run==1) return;else{delay(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) return;else{delay(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;else{delay(20);//按键去抖if(key0==0){while(key0!=1);if(set_triger==1)switch(set_data){case 0:if(rps1/1000>=1) rps1=rps1-1000; break;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;}}else{if(scale<=1) scale=1;else scale--;scale_triger=1;}}else return;}}/************加键( set 模式为调整目标值,运行模式调整占空比)**************/void fn_key1(){if(key1==1) return;else{delay(20);//按键去抖if(key1==0){while(key1!=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;}}else{if(scale>=199) scale=199;else scale++;scale_triger=1;}}else return;}}/************光标左移键( set 模式下有效) **************/void fn_left(){if(left==1) return;else{delay(20);//按键去抖if(left==0){while(left!=1);if(set_data>=3) set_data=3;else set_data++;}else return;}else return;}}/************光标右移键( set 模式下有效) **************/ void fn_right(){if(right==1) return;else{delay(20);//按键去抖if(right==0){while(right!=1);if(set_triger==1){if(set_data<=0) set_data=0;else set_data--;}else return;}else return;}}/************转数计数(外部中断0) **************/void int0() interrupt 0//外部中断 0 处理程序{rps++;//对转数计数器进行累加计数}/****************定时器 0 中断服务函数 *****************/void timer0(void) interrupt 1{unsigned 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-rps1)>80) check=1;//如果在电机调速系统下,跳出稳态的条件是转速差超过80rpm}}}else{time_scale++;time++;//如果没计满 1 秒,则继续计数}if(power_data==1)//PWM 信号输出{if(time_scale<=scale) dac0832_addr=0xff;//PWM 信号输出else dac0832_addr=0x00;//PWM 信号输出}else dac0832_addr=0x00;//PWM 信号输出if(time2>=200)//数据差值检测, 0.5 秒 1 次{time2=0;t=abs(rps_data-rps1);//电机调速系统下的参数调整等级划分if(t>1200) check=0;else{if(t>500) check=1;else{if(t>200) check=2;{if(t>80) check=3;else check=4;//差值小于80rpm 进入稳态模式,不再调整输出占空比}}}}else time2++;if(check!=4)//在非稳态的情况下查表确定时间参数{if(time3>=time_check[check])//不同的系统查不同的表{time3=0;if(auto_triger==1) check_rps();}else time3++;}}/****************主函数 *****************/void main(){key0=1;//读引脚之前要写 1key1=1;power=1;set=1;T0_init();//T0 初始化init_int0();//外部中断 int0 初始化while(1){fn_switch();//按键查询函数fn_power();//按键查询函数fn_set();//按键查询函数fn_key0();//按键查询函数fn_key1();//按键查询函数fn_auto();//按键查询函数if(power_triger==1) display_power(); //当电源状态有改变时刷新显示电源状态if(rps_triger==1) display_rps();//当系统实时数据需要刷新时,刷新实时数据if(scale_triger==1) display_scale();//当占空比发生改变时刷新占空比数据if(auto_triger_triger==1) display_auto();// 当 auto 状态发生改变时刷新auto 状态显示if(set_triger==1)//当进入 set 状态时{fn_left();//查询左移右移按键fn_right();if(sys_data==1) display_set();//不同的系统(电机调速、温度控制)不同的 set 状态显示}}。