资源描述
拖动系统课程设计
报告书
题目:
专业:
姓名:
学号:
指导教师:
任务书
课题名称:开环控制的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页
展开阅读全文