收藏 分销(赏)

电力拖动课程设计--开环控制的PWM直流调速系统设计与实现.docx

上传人:鼓*** 文档编号:9902912 上传时间:2025-04-12 格式:DOCX 页数:28 大小:722.56KB
下载 相关 举报
电力拖动课程设计--开环控制的PWM直流调速系统设计与实现.docx_第1页
第1页 / 共28页
电力拖动课程设计--开环控制的PWM直流调速系统设计与实现.docx_第2页
第2页 / 共28页
点击查看更多>>
资源描述
拖动系统课程设计 报告书 题目: 专业: 姓名: 学号: 指导教师: 任务书 课题名称:开环控制的PWM直流调速系统设计与实现 课程设计任务: 1、查找文献,掌握直流电动机PWM调速的基本工作原理; 2、设计直流电动机开环调速系统,建立系统模型并进行仿真试验; 3、设计并调试基于51单片机的H桥驱动控制电路; 4、设计速度调节器算法,对开环系统进行负载试验; 课程设计要求: 1、能独立设置电机速度(按键设置或滑动变阻器设置或上位机设置); 2、能显示当前电机的实际速度(单位为:r/min); 3、能控制电机启动、停止、正反转、软启动和软制动; 课程设计内容: 1、设计直流电动机开闭环调速系统总体方案; 2、建立系统数学模型,并设计电流调节器和转速调节器算法; 3、直流电机的控制电路、驱动电路、保护电路及其检测电路设计 4、 基于单片机的开环调速系统软件程序设计; 任务下达日期: 2015年6月3日 设计日期: 2015年6月9日 摘要 本次设计先通过上网查找资料,了解直流电机PWM开环调速系统的原理及其特性。再通过PROTUES电路仿真PWM波形控制输出并设计该开环直流电机调速系统硬件电路。此次设计的系统可通过按钮实现正反转调节,实现电机的7档调速,并且在LCD屏幕中实时显示出电机的状态,包括正反转,档位以及电机转速。该系统有如下优点:需用的大功率可控器件少,线路简单;调速范围宽:电流波形系数好,附加损耗小;功率因数高。 关键词:开环 直流电机 PWM 51单片机 目录 1 系统概述 6 2 硬件电路设计 7 2.1 主控制模块 7 2.1.1 单片机管脚介绍: 7 2.1.2 晶振电路与复位电路 8 2.2.3矩阵键盘 9 2.2脉冲整形触发电路设计 10 2.3 LCD1602 10 2.4电机参数 11 2.5 电机驱动模块 11 2.5.1 模块描述 11 2.5.2 模块接口说明 11 2.5.3模块使用说明 12 3 软件设计 12 3.1 操作说明 12 3.2 c程序设计 13 3.2.1 LCD1602 13 3.2.2 矩阵键盘读取 13 3.2.3 占空比计算 14 3.2.4 PWM信号产生 14 3.2.5 转速计算 14 3.2.6 换向 14 4 系统调试 14 4.1 PWM信号调试 14 4.2 电机转速测试 14 5 结束语 15 6 参考文献 15 7 附录 15 7.1 设计图纸 15 7.2 元器件清单 15 7.3 程序 15 1 系统概述 该直流电机调速系统是以STC89C52单片机为核心,配以相应硬件电路,完成电机启动停止控制、正反装控制以及1-7档电机转速选择等功能。实际运用时,用户可以根据自己需求来设置电机档位或电机的正反转,起停。 PWM直流电机调速系统主要由矩阵键盘、单片机、脉冲整形触发电路、电机驱动模块等部分组成。其中矩阵键盘用于控制电机各种功能的实现。电机上装有41线码盘,电机转一周形成41个脉冲,通过脉冲整形触发电路接入52单片机的I/O口进行计数并用于计算电机转速。电机PWM控制信号由52单片机定时器定时触发,通过I/O口输入至电机驱动模块来进行控制电机转速。 脉冲整形触发电路 矩阵键盘 复位电路 晶振电路 电源输入 STC89C52 LCD1602 电机驱动模块 图一:系统功能方块图 如图1所示电源输入电路为STC89C52提供5Vvcc电源。晶振电路的主要作用是提供基准频率,在电路产生震荡电流,发出时钟信号。复位电路是使单片机的CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。键盘接口电路实现PWM直流电机调速系统的各种功能。脉冲整形触发电路将电机41线码盘产生的脉冲输入至单片机进行电机转速计算。电机驱动模块接收单片机PWM控制信号来驱动电机。LCD1602液晶屏用来显示电机的正反转状态、起停状态、档位及实时的转速。 2 硬件电路设计 2.1 主控制模块 2.1.1 单片机管脚介绍: 图2:单片机管脚 单VCC(40):供电电压,其工作电压为5V。 GND(20):接地。 P0端口(P0.0-P0.7):P0口为一个8位漏极开路双向I/O口,每个引脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1端口(P1.0-P1.7):P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高电平,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2端口(P2.0-P2.7):P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口,用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3端口(P3.0-P3.7):P3口管脚是一个带有内部上拉电阻的8位的双向I/O端口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入端时,由于外部下拉为低电平,P3口将输出电流(ILL)。 P3口同时为闪烁编程和编程校验接收一些控制信号。 复位RST(9):复位输入。在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个引脚保持高电平,51芯片便循环复位。复位后P3.0-P3.7口均置1,引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。复位操作不会对内部RAM有所影响。 ALE/ (30):当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如果想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,则置位无效。 (29):外部程序存储器的选通信号。在由外部程序存储器取指令期间,每个机器周期两次 有效。但在访问外部数据存储器时,这两次有效的 信号将不出现。 EA/VPP(31):当 保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时, 将内部锁定为RESET;当 端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V的编程电源(VPP)。 XTAL1(19):来自反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2(18):来自反向振荡器的输出。片机的管脚如图2所示。 2.1.2 晶振电路与复位电路 本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;STC52单片机内部集成了看门狗电路;且具有很强抗干扰能力。 本系统采用内部方式的时钟电路和加电自复位的复位电路,如下图3: 图3:晶振电路与复位电路 2.2.3矩阵键盘 键盘是与单片机进行人机交互的最基本的途径,其以按键的形式来设置控制功能或输入数据,按键的输入状态本质上是一个开关量。对于简单的开关量的输入可以采用独立式按键,这种方法接口简单,但占用单片机I/O端口资源较多。对于输入参数较多、功能复杂的系统,需要采用矩阵式键盘进行输入控制。本系统采用2*3矩阵式键盘,键盘连接方式如图4所示: 图4:矩阵键盘 2.2脉冲整形触发电路设计 图5:脉冲触发整形电路 脉冲触发整形电路如上图5所示。当光透过光栅时,光电门导通,NPN接受到高电压使三极管也导通,从而使单片机接受到一个从高电平到低电平的下降沿信号。 2.3 LCD1602 液晶显示器(LCD)是一种功耗很低的显示器,它的使用非常广泛,比如电子表、计算器、数码相机、计算机的显示器和液晶电视等。电机调速过程中所需要显示的信息比较多,为了能直观的看到结果,本设计采用液晶显示屏LCD进行显示,具体连接方式如图6所示。 图6:LCD1602电路 2.4电机参数 图7:电机实物图及参数 电机的实物图及参数如上图7所示。电机的线码盘为41线,电机转动一周会发出41个脉冲信号。其一些实测数据如下表所示: 电压V 空载电流(mA) 转速(r/min) 堵转电流(A) 5 50 1000 0.5 12 80 4300 1.2 24 12- 8600 2.3 2.5 电机驱动模块 2.5.1 模块描述 1 双全新电机驱动芯片,兼容L9110 2 模块供电电压:2.5-12V 3 适合的电机范围:电机工作电压2.5v-12V之间,最大工作电流0.8A 4 可以同时驱动2个直流电机,或者1个4线2相式步进电机。 5 PCB板尺寸:2.8cm*2.1cm 超小体积,适合组装 6设有固定安装孔,直径:3mm 2.5.2 模块接口说明 6P黑色弯排针说明: 1 VCC 外接2.5V-12V电压 2 GND 外接GND 3 IA1 外接单片机IO口 4 IB1 外接单片机IO口 5 IA2 外接单片机IO口 6 IB2 外接单片机IO口 4P绿端子说明: 1 OA1 OB1 接直流电机2个引脚,无方向 2 OA2 OB2 接直流电机2个引脚,无方向 2.5.3模块使用说明 接通VCC,GND 模块电源指示灯亮 IA1输入高电平,IB1输入低电平,【OA1 OB1】电机正转; IA1输入低电平,IB1输入高电平,【OA1 OB1】电机反转; IA2输入高电平,IB2输入低电平,【OA2 OB2】电机正转; IA2输入低电平,IB2输入高电平,【OA2 OB2】电机反转; 3 软件设计 3.1 操作说明 矩阵键盘3排6个按键分别对应不同的功能。功能如下图8所示: 图8:矩阵键盘按键功能 电机默认的启动状态为3档速度,方向正转。可以通过不同的功能按键来对电机的起停、正反转、转速等控制。电机的实时状态会显示在LCD1602中。电机转速1s刷新一次。 3.2 c程序设计 3.2.1 LCD1602 RS R/W 操作说明 0 0 写入指令寄存器(清除屏等) 0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值 1 0 写入数据寄存器(显示各字型等) 1 1 从数据寄存器读取数据 图9:LCD1602寄存器选择控制表 LCD1602的寄存器控制如上图9所示。当写入数据时,令RE=1 R/W=0;使能端E设置为低电平,单片机I/O口输出指令,令使能端为E低电平,此时E下降沿是LCD1602写入指令。想LCD1602写入数据用同样的方法。写入数据或指令程序流程图如下图10所示。 开始 R/E=0 E=0 RS=0? 结束 N Y E=1向指令寄存器写指令 E=1 向数据寄存器写数据 图10:LCD1602写入指令/数据流程图 3.2.2 矩阵键盘读取 矩阵键盘读取数值的流程如下图11所示。 开始 P1=0x0f P1=0x0f? Key_sure=1 Y N 延时1ms P1=0x0f? Y N key_sure=1? N Y 确定输入值,key_sure=0; 图11:矩阵键盘运行流程 3.2.3 占空比计算 本单片机采用的是24M晶振,且设置PWM周期为10ms。当设定好档位K时,可以根据一下公式计算出PWM占空比的定时器定时时间。 低电平信号TL1=(65536-2000*(10-K))%255; 低电平信号TH1=(65536-2000*(10-K)-TL1)/255; 高电平信号TL1=(65536-2000*K)%255; 高电平信号TH1=(65536-2000*K-TL1)/255; 3.2.4 PWM信号产生 PWM信号根据占空比计算所得的数值附给定时器。定时器1采用方式1定时。并几下当前 电平的状态。当状态为1时,表示输出为高电平,计时器载入高电平信号的时间;当状态为0时,表示输出应为低电平,计时器载入低电平信号时间。每进入一次中断,状态加一与2取余数。 3.2.5 转速计算 通过T0计时器/计数器计数。本设计采用M法测速。当单片机P3.2口接收到下降沿信号时,产生中断,每产生一次中断,给计一次数。直到产生第100个PWM信号后,根据公式speed=(60*下降沿个数)/(41)计算出电机转速并刷新屏幕。每次计算完成后,重新给PWM信号和下降沿中断信号计数,以能够继续准确的测出电机转速。 3.2.6 换向 当电机高速运转时,若直接换向则会导致过流现象。故在换向时,软件上要停止PWM信号产生,并进行一段延迟,让电机转速降为0时,在定时器开始工作,输出PWM信号换向。当PWM1信号为高电平,PWM2信号为低电平时,电机正转;PWM1为低电平,PWM2为高电平时,电机反转;当PWM1和PWM2信号都为低电平时,电机停止。 4 系统调试 4.1 PWM信号调试 用PROTUES仿真测量PWM信好的周期与占空比。由于在设计中,单片机采用24MHz的晶振,且定时器采用方式1的方法进行计时,故应设置一周期定时器在入值TC=2^16-2000;但在仿真中,实际测的PWM的周期约为12.6ms,仿真如下图12所示: 图12:PWM信号周期测试图1 根据仿真测得的PWM信号进行对计数器载入值调整,当TC=2^16-1511时,PWM周期约为10ms,测试结果如下图13所示: 图13:PWM信号周期测试2 4.2 电机转速测试 档位 转速(r/min) 占空比(%) 1 500 30 2 670 40 3 790 50 4 870 60 5 930 70 6 980 80 7 1014 90 5 结束语 通过此次的课程设计,让我对单片机的运用更加的熟练。对其定时器的了解更加深刻。也学会了运用单片机产生PWM信号来控制电机的运行。同样的也加深了对开环电机调速的理解,以及提高了我程序的编写,排序能力。这次课程设计让我对运用单片机实际做东西有了更多感触,如:PWM信号产生,定时器设定的值不一定就是实际的定时值,因为在中断中程序的运行也需要一定的时间,也造成了单片机无法产生频率极高的PWM信号。 6 参考文献 [1]. 王兆安 刘进军.电力电子技术 北京:机械工业出版社,2009,5 [2]. 张俊谟 单片机中级教程 北京:北京航空航天大学出版社,2006,10 [3]. 林瑞光 电机与拖到基础 杭州:浙江大学出版社,2012,7 [4]. 陈伯时 电力拖动自动控制系统 北京:机械工业出版社,2009,8 7 附录 7.1 设计图纸 7.2 元器件清单 符号 名称 规格 数量 R1 电阻 10K 1 R2 电阻 20K 1 R3 电阻 4.7K 1 R4 电阻 5.1K 1 STC89C52R 单片机 1 8090 三极管 NPN 1 HC-36 电机驱动模块 1 M 电机 1 7.3 程序 #include<reg52.h> #include<stdio.h> #define uchar unsigned char #define uint unsigned int #define LCD_FL 0X80 //第一行地址0x80-0xA7 #define LCD_SL 0Xc0 //第二行地址0xC0-0xE7 #define LCD_S 0X0c //开显示 不显示光标 光标不闪烁 #define LCD_Display_mode 0X38 //设置16x2显示 5x7点阵 8位数据接口 #define LCD_clear 0x01 //清屏指令 数据指针清零 所有显示清零 #define COM 0//指令 #define DATE 1 //数据 sbit PWM1=P2^0; // pwm1信号 sbit PWM2=P2^1; // pwm2信号 sbit RS=P2^4; // LCD1602 寄存器选择 sbit RW=P2^5; //1602读写选择 sbit E=P2^6; // 1602使能端 int state,direction,rank;//起停1on 0 off 方向 1正2反 档位 int key_in;//按键输入 int BG;//输出高低点评状态 uint RAND,S;int speed;//数度计算参数 int PHTH,PHTL,PLTL,PLTH;//定时器时间 void delay_1ms(int t) // 1ms大致延时 { int i,j; for(i=0;i<t;i++) for(j=0;j<120;j++); } //----------------------------------------------------------------------------------------------lcd1062 void delay(uint a)//小延时 { while(a--); } void write(uint x,uchar sth)// 命令或数据写入 { RS=x;RW=0;E=0; P0=sth; delay(3); E=1; delay(25); E=0; } void write_string(uint line,uchar *str) // 字符串输入 { write(COM,line); while(1) { if(*str=='\0') break; write(DATE,*str); str++; delay(50); } } void lcd_init() // 初始化 { delay_1ms(15); write(COM,LCD_Display_mode); delay_1ms(5); write(COM,LCD_S); delay_1ms(5); write(COM,LCD_clear); delay_1ms(5); write_string(LCD_FL,"STATE:CW OFF"); //cw顺时针,正转 ccw逆时针 delay_1ms(5); write_string(LCD_SL,"RS(rpm):0 "); } //----------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------键盘输入 void key() { static int key_sure=0;//避免一直按着一个键的时候一直读入 uint key_flash; key_in=-1; P1=0x0f; if((P1&0x0f)!=0x0f) { delay_1ms(1); if((P1&0x0f)!=0x0f&&key_sure==1) { key_sure=0; key_flash=P1|0xf0; P1=key_flash; switch(P1) { case 0xee: key_in=1;break;//+ case 0xed: key_in=2;break;//- case 0xde: key_in=4;break;//正转 case 0xdd: key_in=5;break;//反转 case 0xbe: key_in=7;break;//启动 case 0xbd: key_in=8;break;//停止 } } } else { key_sure=1; } } //--------------------------------------------------- //------------------------------------------- 根据档位进行占空比计算 void time_calculate() { PLTL=(65536-1511*(10-rank))%255; PLTH=(65536-1511*(10-rank)-PLTL)/255; PHTL=(65536-1511*rank)%255; //2000,实际周期12.6ms 1587,10.5ms PHTH=(65536-1511*rank-PHTL)/255; } //------------------------------------------------ //------------------------------------------------pwm信号产生 void pwm_on() { BG=1; time_calculate(); if(direction==1) { PWM1=1; PWM2=0; } else { PWM1=0; PWM2=1; } TR1=1;ET1=1; TH1=PHTH; TL1=PHTL; RAND=0;S=0; } //------------------------------------------------------------------- //-----------------------------------------------------电机转速计算 void speed_calculate() { char yy[4]; S=0;speed=0; speed=(60*RAND)/(41); RAND=0; sprintf(yy,"%d",speed); if(speed%1000==0) {yy[3]='\0';} delay(5) ; write_string(LCD_SL+8," "); //屏幕清空 delay(35); write_string(LCD_SL+8,yy); } //------------------------------------------------------------------- //--------------------------------------------------------------计时器1中断 void time0() interrupt 3 { time_calculate(); BG++;S++; if(BG==1) { TH1=PHTH; TL1=PHTL; } else { BG=0; TH1=PLTH; TL1=PLTL; } if(direction==1) {PWM1=~PWM1;PWM2=0;} else {PWM2=~PWM2;PWM1=0;} } //--------------------------------------------------------------------- //--------------------------------------------------------计数器中断 void time2() interrupt 0 { RAND++; if(S==200) {speed_calculate(); } } //------------------------------------------------------------- //------------------------------------------------------------主程序 void main() { rank=5; // 设置默认转速 state=0; // 电机停止状态 direction=1; // 电机转向为正方向 PWM1=0; // 无PWM信号 PWM2=0; // lcd_init(); // 初始化屏幕 while(1) { key(); if(key_in>0) { if(key_in==1||key_in==2) { if(key_in==1&&rank<9) { rank++; } if(key_in==2&&rank>3) { rank--; } time_calculate(); } else if(key_in==7||key_in==8) { if(key_in==8&&state==1) { PWM1=0;PWM2=0; TR1=0;ET1=0;state=0; //定时器和计数器中断设置 EX0=0; write_string(LCD_SL,"RS(rpm):0 "); } else if(key_in==7&&state==0) { TR1=1;ET1=1;EA=1;TMOD=0x10; BG=1; state=1;IT0=1;EX0=1;PX1=1; //定时器和计数器中断设置 //定时器1以方式1记时 //计数器0以下降沿触发中断 S=0;RAND=0; pwm_on(); } } else if(key_in==4||key_in==5) { if(direction==2&&key_in==4) { direction=1;PWM1=0;PWM2=0; TR1=0;ET1=0; delay_1ms(400); } else if(direction==1&&key_in==5) { direction=2;PWM1=0;PWM2=0; TR1=0;ET1=0; //换向时先停止在换向 delay_1ms(400); } if(state==1) { pwm_on(); } } key_in=-1; write_string(LCD_FL,"STATE: "); if(state==1) { char xx[5];int R; R=rank-2; sprintf(xx, "%d", R); write_string(LCD_FL+13,xx); } else { write_string(LCD_FL+13,"OFF"); //刷新屏幕 } if(direction==1) write_string(LCD_FL+6,"CW"); else write_string(LCD_FL+6,"CCW"); } } } 第28页
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服