当前位置:文档之家› 课设

课设

辽宁工业大学

单片机原理及接口技术课程设计(论文)题目:基于单片机的转速单闭环直流调速系统设计

院(系):电气工程学院

专业班级:自动化111

学号: 110302012

学生姓名:孟帅

指导教师:(签字)

起止时间:2014.6.16~2014.6.27

辽宁工业大学课程设计说明书(论文)

课程设计(论文)任务及评语

院(系):电气工程学院教研室:自动化

注:成绩:平时20% 论文质量60% 答辩20% 以百分制计算

摘要

伴随现代科技的发展,电机调速系统在工农业生产、交通运输以及日常生活中起着越来越重要的作用,因此,对电机调速的研究有着积极的意义。长期以来,直流电机被广泛应用于调速系统中,而且一直在调速领域占居主导地位。

本设计是基于单片机控制的PWM直流电机调速系统,系统以STC89C52单片机为核心,以小直流电机为控制对象,以ULN2003A驱动芯片实现电动机的转速反馈控制。调节PWM 占空比从而控制电机两端电压,以达到调速的目的。用4个独立式按键输入有关控制信号及参数,并在LCD1602上实时显示输入参数及动态转速。系统的硬件设计部分包括按键模块、电动机驱动模块、STC89C52单片机系统、光电门测速模块、供电电源和直流电机。系统的软件部分包括键盘控制程序设计、显示程序设计、主控程序设计。整个系统实现了单片机控制电机的启制动、正反转、速度调节的效果。

关键词:S TC89C52单片机;直流电机;占空比

目录

第1章绪论 (1)

第2章课程设计的方案 (3)

2.1设计思路 (3)

2.2系统组成总体结构 (3)

第3章硬件设计 (4)

3.1单片机最小系统设计 (4)

3.1.1 单片机STC89C52及其引脚 (4)

3.1.2 单片机时钟电路的设计 (4)

3.1.3 单片机复位电路的设计 (5)

3.2人机接口电路设计 (5)

3.2.1 显示接口电路设计 (5)

3.2.2 键盘接口的设计 (6)

3.2.3 驱动电路的设计 (6)

3.2.4 检测电路的设计 (7)

3.2.5 总电路图的设计 (7)

第4章软件设计 (8)

4.1键盘控制程序设计 (8)

4.2显示程序设计 (9)

4.3主程序设计 (11)

第5章系统检测与分析 (17)

第6章课程设计总结 (18)

参考文献 (19)

第1章绪论

在当今的电气时代,电动机一直在现代化的生产和生活中具有十分钟的意义,无论是农业生产、交通运输等等,还有日常生活中的家用电器,无一都是大量使用各式各样的电动机。而随着控制智能化,仪器微型化,功耗微小化等对设备日益苛刻的要求,利用单片机对电动机的控制也越来越成为研究的焦点。早期的电机调速通常采用串联电阻的方法来调节电枢电压,这种方法不仅功耗很大,而且调速不太平滑,逐渐被其他调速装置代替。随后又出现了晶闸管、MOSFET、IGBT 等为主控元件的调速装置,电子技术的飞速发展。促使直流电机调速逐渐由模拟化数字化转变,特别是单片机控制技术的应用,使得直流电机调速技术进入一个新纪元。前期的晶闸管直流调速系统控制回路的硬件装置极其复杂。安装调试极困难,相对故障率高,检修比较困难,然而利用单片机控制的电机调速系统,其控制方案是依靠软件实现的,控制器由可编程功能模块组成,配置和参数调整简单方便,工作稳定。

直流拖动控制系统在理论和实践上都比较成熟,而且从控制的角度来看,它又是交流系统的基础,为了提高直流调速系统的动静态性能指标,通常采用闭环调速系统(包括单闭环系统和多闭环系统)。对调速指标要求不高的场合,采用单闭环系统,而对调速指标较高的则采用多闭环系统。接反馈的方式不同可分为转速反馈、电流反馈、电压反馈等。在单闭环系统中,转速单闭环使用较多。在对调速性能有较高要求的领域常利用直流电动机作为动力,但直流电动机开环系统稳态性能不能满足要求,可利用速度负反馈提高稳态精度。而采用比例调节器的负反馈调速系统仍是有静差的,为了消除系统的静差,可用积分调节器代替比例调节器。

反馈控制系统的规律是要想维持系统中的某个物理量基本不变,就引用该量的负反馈信号去与恒值给定相比较,构成闭环系统,对调速系统来说,若想提高静态指标,就得提高静特性硬度,也就是希望转速在负载电流变化时或受到扰动时基本不变,要想维持转速这一物理量不变,最直接和有效的方法就是转速负反馈构成转速闭环调速系统。闭环调速系统可以获得比开环调速系统硬的多的稳态特性,从而在保证一定静差率的要求下,能够提高调速范围,为此所付出的代价是,须增设电压放大器以及检测与反馈装置。

由于单片机具有体积小、集成度高、运算速度快、运行可靠、应用灵活、价格低廉以及面向控制等特点,因此在工业控制、数据采集、智能仪器仪表、智能化设备和各种家用电器等领域得到广泛的应用,而且发展非常迅猛。随着单片机

应用技术水平不断提高,目前单片机的应用领域已经遍及几乎所有的领域。现在国内外工业上对电机的调速基本已经不再使用模拟调速,而采用数字调速系统,而数字调速系统大部分都是用单片机来进行控制,数字调速系统具有控制精确度高,非常稳定,受环境影响小,效率高等优点,所以在国内外的使用越来越广泛。

与交流电动机相比,直流电机结构复杂、成本高、运行维护困难,但是直流电机具有良好的调速性能、较大的启动转矩和过载能力强等许多优点,因此在许多行业仍大量应用。近年来,直流电动机的机构和控制方式都发生了很大的变化。随着计算机进入控制领域以及新型的电力电子功率元器件的不断出现,采用全控型的开关功率元件进行脉宽调制(Pulse Width Modulation,简称PWM)已成为直流电机新的调速方式。这种调速方法具有开关频率高、低速运行稳定、动态性能良好、效率高等优点,更重要的是这种控速方式很容易在单片机控制系统中实现,因此具有很好的发展前景。

第2章 课程设计的方案

2.1 设计思路

设计以可控制直流电机调速并可显示转速的系统。电机的转速要求按照加速、减速、正转、反转和停止的内容进行设计。

根据设计的内容和要求可知,一方面要将电动机的转速实时显示,这就会涉及到显示部分。另一方面,电动机的转动情况要能按照设计要求进行控制,这又会涉及到按键部分。此外,还有电动机的驱动部分和测速部分,单片机本身也有它的时钟电路和复位电路。这就构成了一个完整的单片机控制系统,

2.2 系统组成总体结构

根据设计的思路,绘制控制系统的结构框图如图2-2所示:

图2-1调速系统设计框图

第3章硬件设计

3.1单片机最小系统设计

3.1.1单片机STC89C52及其引脚

STC89C52单片机如图3-1所示,它是由CPU、RAM 、ROM、I/O口、串行口、定时/计数器、中断系统、特殊功能寄存器组成。有40引脚,其中2条主电源引脚,2条外接晶体引脚,4条控制或与其他电源复用的引脚,32条I/O引脚;GND 为接地端,VCC为电源端;XTAL1和XTAL2为外接晶振引脚;RESET为复位引脚,ALE为地址锁存允许信号引脚,PSEN为外部程序存储器的独选通信号引脚,EA为内、外ROM选择端引脚;P0、P1、P2、P3为输入/输出引脚;

图3-1单片机引脚图

3.1.2单片机时钟电路的设计

本设计采用11.0592M晶振与两个电容构成单片机的时钟电路,单片机的时钟电路如图3-1所示:

图3-2时钟电路

3.1.3单片机复位电路的设计

如图3-2所示,为按键式复位电路,按下键后,通过R1和R2形成回路,使RESET 端产生高电平。按键的时间决定了复位时间。在时钟电路工作后,只要在单片机的RESET引脚上出现24个时钟振荡脉冲(两个机器周期)以上的高电平,单片机就能实现复位。

图3-3复位电路

3.2人机接口电路设计

3.2.1显示接口电路设计

本次设计采用LCD1602来显示,其引脚图如图3-4所示:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等点阵型液晶模块。引脚功能为:GND为接地端,VCC为电源端,V0为液晶显示器对比度调整端,RS为寄存器选择端,RW为读写信号线,E为使能端,DB0~DB7为8位双向数据端。15脚~16脚为空脚或背灯电源。15脚背光正极,16脚背光负极。

图3-4 LCD1602引脚图

3.2.2键盘接口的设计

应用4个独立式按键来完成对电动机的加减速、正反转、停止等功能,按键如图3-5所示,每一个按键的左端分别与对应的单片机接口相连,由此来个单片机输入信号。

图3-5按键电路图

3.2.3驱动电路的设计

本次设计的电动机的驱动芯片为ULN2003A,其引脚图如图3-6;它是一个7路反向器电路,即当输入端为位高电平时,ULN2003A输出端为低电平;输入为低电平时,输出为高电平;

图3-6 ULN2003A引脚图

3.2.4检测电路的设计

测速装置采用光电编码器来实现,通过码盘和光电编码器测出电动机的转速,

再将速度信号反馈到单片机,从而将速度在液晶屏上显示出来,光电编码器的电

路图如图3-7所示;

3.2.5总电路图的设计

电路设计总图如图3-8所示:

18

图3-8 单片机最小系统

第4章软件设计

在直流调速系统中,对三个部分进行编写程序,分别为键盘控制程序、显示程序和主电路控制程序,这三个程序分别实现了键盘的按键控制功能、显示电动机转速的功能和整个系统的运行控制功能。下面对这三大程序分别进行设计介绍并给出设计流程图。

4.1键盘控制程序设计

键盘控制流程图如图4-1所示,编写的程序经过初始化、识别是否有键入,经过接受指令和数据,进行分析并作出处理,然后传达给单片机。下面还给出了部分键盘控制设计的程序。

图4-1 键盘控制程序流程图

键盘控制程序:

unsigned char Key_Scan()

{

unsigned char keyValue = 0 , i; //保存键值

//--检测按键1--//

if (GPIO_KEY != 0xFF) //检测按键K1是否按下

{

Delay10ms(1); //消除抖动

if (GPIO_KEY != 0xFF) //再次检测按键是否按下

{

keyValue = GPIO_KEY;

i = 0;

while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开

{

Delay10ms(1);

i++;

}

}

}

return keyValue; //将读取到键值的值返回

}

4.2显示程序设计

显示程序流程图如图4-2所示,编写的程序经过初始化、清屏进入串口驱动模式,经过接受指令和数据,进行分析读取字符串,然后在显示屏上正确显示出来。下面还给出了部分显示设计的程序

图4-2显示程序流程图

显示程序:

void LcdDisplay(int ) //lcd显示

{

unsigned char datas[] = {0, 0, 0}; //定义数组

float speed;

LcdWriteCom(0x80); //写地址80表示初始地址speed=n;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

n=speed*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1

了,小于0.5的就

//算加上0.5,还是在小数点后面。

datas[0] = n / 100;

datas[1] = n % 100 / 10;

datas[2] = n % 10 ;

LcdWriteCom(0x82); //写地址80表示初始地址

LcdWriteData('0'+datas[0]); //百位

LcdWriteCom(0x83); //写地址80表示初始地址

LcdWriteData('0'+datas[1]); //十位

LcdWriteCom(0x84); //写地址80表示初始地址

LcdWriteData('0'+datas[2]); //个位

}

4.3主程序设计

主控程序流程图如图4-3所示,编写的程序经过初始化、通过给定初值,使定时器中断得以控制,从而产生相应的PWM波形,使驱动芯片动作,控制电动机的正转、反转和停止,在这个过程里,速度检测反馈模块会把实时转速反馈给单片机,从而知道与设定转速是否相符,达到转速反馈控制的目的。下面还给出了部分设计的程序。

图4-3主程序流程图

主程序:

#include

#include"lcd.h"

//--定义使用的IO口--//

sbit PWM=P1^0;

#define GPIO_KEY P2

//--定义一个全局变量--//

unsigned char timer1;

void Time1Config();

void Delay10ms(unsigned int c);

void LcdDisplay(int);

unsigned char Key_Scan();

void main(void)

{ unsigned char n,keyNum;

Time1Config();

LcdInit(); //初始化LCD1602

LcdWriteCom(0x88); //写地址80表示初始地址while(1)

{

keyNum = Key_Scan(); //扫描键盘

switch (keyNum)

{

case(0xFE) : //返回按键K1的数据

n = 5;

break;

case(0xFD) : //返回按键K2的数据

n = 100;

break;

case(0xFB) : //返回按键K3的数据

n = 30;

break;

case(0xF7) : //返回按键K4的数据

n = 0;

break;

default:

break;

}

if(timer1>100) //PWM周期为100*0.5ms

{

timer1=0;

}

if(timer1 < n) //改变30这个值可以改变直流电机的速度

{

PWM=1;

}

else

{

PWM=0;

}

LcdDisplay(n);

Delay1ms(1000);//1s钟刷一次

}

}

unsigned char Key_Scan()

{

unsigned char keyValue = 0 , i; //保存键值

//--检测按键1--//

if (GPIO_KEY != 0xFF) //检测按键K1是否按下

{

Delay10ms(1); //消除抖动

if (GPIO_KEY != 0xFF) //再次检测按键是否按下

{

keyValue = GPIO_KEY;

i = 0;

while ((i<50) && (GPIO_KEY != 0xFF)) //检测按键是否松开

{

Delay10ms(1);

i++;

}

}

}

return keyValue; //将读取到键值的值返回

}

void LcdDisplay(int ) //lcd显示

{

unsigned char datas[] = {0, 0, 0}; //定义数组

float speed;

LcdWriteCom(0x80); //写地址80表示初始地址speed=n;//因为数据处理有小数点所以将温度赋给一个浮点型变量

//如果温度是正的那么,那么正数的原码就是补码它本身

n=speed*0.0625*100+0.5;

//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点

//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就

//算加上0.5,还是在小数点后面。

datas[0] = n / 100;

datas[1] = n % 100 / 10;

datas[2] = n % 10 ;

LcdWriteCom(0x82); //写地址80表示初始地址

LcdWriteData('0'+datas[0]); //百位

LcdWriteCom(0x83); //写地址80表示初始地址

LcdWriteData('0'+datas[1]); //十位

LcdWriteCom(0x84); //写地址80表示初始地址

LcdWriteData('0'+datas[2]); //个位

}

void Delay10ms(unsigned int c) //误差0us

{

unsigned char a, b;

//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//

for (;c>0;c--)

{

for (b=38;b>0;b--)

{

for (a=130;a>0;a--);

}

}

}

void Time1Config()

{

TMOD|= 0x10; //设置定时计数器工作方式1为定时器

//--定时器赋初始值,12MHZ下定时0.5ms--//

TH1 = 0xFE;

TL1 = 0x0C;

ET1 = 1; //开启定时器1中断

EA = 1;

TR1 = 1; //开启定时器

}

void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断2 4 串口中断

{

TH1 = 0xFE; //重新赋初值

TL1 = 0x0C;

timer1++;

}

相关主题
相关文档 最新文档