基于单片机的直流电机.docx

上传人:b****6 文档编号:15984020 上传时间:2023-07-09 格式:DOCX 页数:37 大小:361.27KB
下载 相关 举报
基于单片机的直流电机.docx_第1页
第1页 / 共37页
基于单片机的直流电机.docx_第2页
第2页 / 共37页
基于单片机的直流电机.docx_第3页
第3页 / 共37页
基于单片机的直流电机.docx_第4页
第4页 / 共37页
基于单片机的直流电机.docx_第5页
第5页 / 共37页
基于单片机的直流电机.docx_第6页
第6页 / 共37页
基于单片机的直流电机.docx_第7页
第7页 / 共37页
基于单片机的直流电机.docx_第8页
第8页 / 共37页
基于单片机的直流电机.docx_第9页
第9页 / 共37页
基于单片机的直流电机.docx_第10页
第10页 / 共37页
基于单片机的直流电机.docx_第11页
第11页 / 共37页
基于单片机的直流电机.docx_第12页
第12页 / 共37页
基于单片机的直流电机.docx_第13页
第13页 / 共37页
基于单片机的直流电机.docx_第14页
第14页 / 共37页
基于单片机的直流电机.docx_第15页
第15页 / 共37页
基于单片机的直流电机.docx_第16页
第16页 / 共37页
基于单片机的直流电机.docx_第17页
第17页 / 共37页
基于单片机的直流电机.docx_第18页
第18页 / 共37页
基于单片机的直流电机.docx_第19页
第19页 / 共37页
基于单片机的直流电机.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机的直流电机.docx

《基于单片机的直流电机.docx》由会员分享,可在线阅读,更多相关《基于单片机的直流电机.docx(37页珍藏版)》请在冰点文库上搜索。

基于单片机的直流电机.docx

基于单片机的直流电机

摘要

本课程主要是设计一个基于单片机的直流电机PWM控制系统。

PWM控制提高了调速范围,提高了调速精度,改善了快速性能、功率和功率因数。

系统在设计中被控对象采用5V的直流电机,以MCS-51单片机为控制核心,采用LCD12864液晶作为显示元件,进行软硬件的设计。

硬件电路由protel设计制作,主要设计了液晶显示电路、键盘控制电路、复位电路、测速电路和驱动电路。

软件设计在Keil开发平台用C语言编写,程序采用模块化设计方案,包括液初始化程序、晶显示程序、键盘控制程序。

本系统PWM控制直流电机采用调压调速的方法,整体设计包括软件和硬件两个部分。

通过利用单片机产生PWM控制信号控制直流电机,详细介绍脉宽调制(PWM)控制原理,直流电机的工作原理和数学模型以及用H型桥电路基本原理设计的驱动电路。

通过硬件电路的模拟情况,说明系统运行正常,各个功能模块实现是可行的,控制精度比较高,能够满足系统的基本要求。

关键词:

单片机;PWM;直流电机;L298N;LCD12864;

 

目录

一、设计任务1

二、设计方案1

三、系统硬件设计3

1、STC52最小系统3

2、电机模块8

3、L298N模块9

4、测速模块11

5、测压模块12

6、液晶模块13

7、按键模块15

8、灯光信号模块16

四、系统软件设计17

1、软件流程图17

2、PWM程序设计18

3、测压程序设计18

4、测速程序设计19

5、液晶驱动程序设计20

6、菜单程序设计21

7、按键程序设计23

8、电机反电动势系数计算程序24

9、电机力矩系数计算程序25

10、逼近算法控制程序25

11、比例控制程序25

12、PID控制程序26

五、直流调速系统动态数学模型的建立28

六、调速数据32

1、比例调速数据32

2、PID调速数据33

3、逼近算法调速数据34

4、反电动势系数和电机力矩系数数据34

七、心得体会34

参考文献36

附录一硬件原理图37

附录二硬件PCB图38

附录三程序清单39

一、设计任务

本课题设计主要的目的是为了能够准确及时的控制直流电动机的正转、反转、停止、加速和减速功能可以准确调节控制直流电机的转速。

同时,本设计可以自动测量计算直流电机的反电动势系数以及马达的力矩系数。

直流电机的转速控制分别采用的调速方案:

PID控制调速。

本系统采取了上位机,人机交流界面更加人性化。

二、设计方案

1、任务分析

本设计要求中央控制芯片具有定时计数的功能,一定的程序存储空间,还要有足够的IO外接端口。

由于本设计以LCD12864作为人机交流的显示界面,所以要求中央控制芯片具有一定的电流驱动能力。

LCD、电机控制信号、LED指示灯、独立按钮,电压采集这些都需要占用大量IO接口,所以要求中央控制芯片要有足够多的外部接口以满足需要。

本设计要求能准确控制电机的转向以及转速,所以要求电机的控制芯片就有较强的调速控制功能以及转向控制功能。

本设计要求所采用的的直流电机转速具有一定的可调空间以及足够的灵敏度。

本设计涉及直流电机转速的采集,电机输出电压的测量,所以要求本系统具有测量电机转速和采集电压的功能。

2、方案流程图

3、系统结构框图

显示器

A/D变换器单片机核心键盘和开关

电平转换H桥隔离和驱动电源

测速马达

马达

1、系统硬件设计

1、STC89C52

1、电源

(1)VCC-芯片电源,接+5V,

(2)VSS-接地端;

注意:

用万用表测试单片机引脚电流表一般为0V或者5V,这是标准的TTL电平,但有时候在单片机程序正在工作时候测试结果并不是这个值而是介0V-5V之间,其实这只是万用表反映没这么快而已,在某一瞬间单片机引脚电流不是保持在通常情况下0V或者5V的。

2、时钟:

XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。

3、控制线:

控制线共有4根

(1)ALE/PROG:

地址锁存允许/片内EPROM编程脉冲

①ALE功能:

用来锁存PO口送出的低8位地址

②PROG功能:

片内有EPROM的芯片,在EPROG编程期间,此引脚输入编程脉冲。

(2)PSEN:

外ROM读选通信号。

(3)RST/VPD:

复位/备用电源。

①RST(Reset)功能:

复位信号输入端。

②VPD功能:

在VCC掉电情况下,接备用电源。

(4)EA/VPP:

内外ROM选择/片内EPROM编程电源。

①EA功能:

内外ROM选择端。

②VPP功能:

片内有EPROM的芯片,在EPROM编程期间,施加编程电源VPP。

4、I/O线

89C51共有4个8位并行I/O端口:

P0、P1、P2、P3口,共32个引脚。

P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总路线)。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

STC89C52单片机的引脚如图1所示

图1STC89C52单片机引脚图

(1)系统时钟电路

本系统采用11.0592MKZ的外部石英晶振作为单片机的时钟脉冲输入。

电路图如图2所示。

图2时钟电路

(2)复位电路

本系统采用的是上电复位方式。

如图3所示。

图3复位电路

2、电机模块

直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。

它是能实现直流电能和机械能互相转换的电机。

当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。

本系统采用带M130直流电机。

其实物图如图5所示。

图5电机

3、L298N模块

(1)ADC结构图如6所示

采用7.5V可充电两节干电池对EnA供电

图6ADC的结构

(2)引脚说明见表3-1:

表3-1L298N引脚说明表

MW.15

Name

Function

1;15

SenseA;SenseB

在这个引脚和低之间可以接感应电阻用于控制负载电流

2;3

Out1;Out2

A桥的输出端口;流经这两个端子连接的负载电流在端子1被检测

4

VS

用于驱动负载的功率输出电源电压。

在这个引脚和地之间必须接一个100nf的无极性电容

5;7

Input1;Input2

A桥TTL输入端

6;11

EnableA;EnableB

TTL使能输入端:

低电平使桥A或桥B无效

8

GND

9

VSS

逻辑模块的电源供应。

引脚与地间必须接一个100nF的电容

10;12

Input3;Input4

B桥TTL输入端

13;14

Out3;Out4

B桥的输出;流经这两个端子连接的负载电流在端子15被检测

4、按键模块

本系统设计了5个独立按键,低电平有效。

分别用作电机正转按键、电机反转按键、电机加速按键、电机减速按键,电机停止按键。

其电路原理图如图12所示。

图12按键电路图

5、液晶模块

(1)概述

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字也可完成图形显示低电压低功耗是其又一显著特点。

由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

(2)基本特性

(1)、低电源电压(VDD:

+3.0--+5.5V)

(2)、显示分辨率:

128×64点

(3)、内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)

(4)、内置128个16×8点阵字符

(5)、2MHZ时钟频率

(6)、显示方式:

STN、半透、正显

(7)、驱动方式:

1/32DUTY,1/5BIAS

(8)、视角方向:

6点

(9)、背光方式:

侧部高亮白色LED,功耗仅为普通LED的1/5

6、光电测速模块

光电测速传感器,包括传感器和码盘两部分

2、系统软件设计

1、软件流程图

开始

初始化

串口连接函数

按键动作函数上位机控制函数

正反,加减控制

液晶显示

注释:

初始化定时器,中断,串口中断,初始化12864,初始化PWM的值。

按键动作函数和上位机控制包括正、反、加减,停止函数。

液晶显示包括电流显示函数、转速显示函数。

2、测速程序设计

#include

#include

#include"jianpan.h"

#include"12864.h"

#include"cesu.h"

#include"uart.h"

sbitINA=P1^0;//正转

sbitINB=P1^1;//反转

sbitENA=P1^2;//控制通断

unsignedchartt=0;

unsignedintttcs=0;

unsignedcharnum=0;

unsignedcharp;

bitttflag=0;

voidadd_dec();//声明加减速函数

(1)系统主程序

voidmain()

{

init();//初始化定时器,中断,串口中断

main12864();//初始化12864

pwm=25;//初始PWM值设置25

while

(1)

{

Uart_Main();//串口主函数

jianpan();//按键函数

kongzhi();//正反,加减控制

display_hanzi();//显示汉字

display_date();//显示数据

if(pwmflag==0)//正转

{

pos(0,0);//第一行第一例开始

for(num=0;num<4;num++)

{

//显示“前进”front

write_date(table_front[num]);

delay12(5);

}

}

if(pwmflag==1)//反转

{

pos(0,0);

for(num=0;num<4;num++)

{

write_date(table_back[num]);//显示后退

delay12

(1);

}

}

}

}

(1)初始化函数程序

voidinit()

{

TMOD=0x21;//串口中断;定时器0工作方式1

TH0=(65536-2000)/256;//2ms

TL0=(65536-2000)%256;

TH1=0xfd;//初值9600

TL1=0xfd;

/*******定时器0*********/

EA=1;

ET0=1;//允许C/T1申请中断

TR0=0;

/*****外部中断0*******/

IT0=1;

EX0=1;

/*******串口中断配置***************/

ES=1;//串行口中断允许

TR1=1;

SM0=0;

SM1=1;//工作方式1;波特率可以变

REN=1;//允许接收控制位

}

/******定时器0************/

voidtimer0()interrupt1

{

TH0=(65536-2000)/256;//2ms

TL0=(65536-2000)%256;

tt++;

ttcs++;

if(tt>=50)tt=0;//T=100ms

if(pwm>=50)pwm=50;

if(pwm<=0)pwm=0;

if(pwmflag==0)//正转标志位

{

if(tt<=pwm)

{

ENA=1;INA=1;INB=0;//Ton

}

else

{

ENA=0;INA=1;INB=1;//Toff

}

}

if(pwmflag==1)

{

if(tt<=pwm)

{

ENA=1;INA=0;INB=1;//Ton

}

else

{

ENA=0;INA=1;INB=1;//Toff

}

}

if(ttcs==250)//每当250ms算一次外部中断

{

EX0=0;

ttcs=0;

csnum2=csnum1*10/3;

csnum1=0;

EX0=1;

}

}

/******外部中断0**********/

voidexint0()interrupt0//(locationat0003H)

{

csnum1++;

}

(2)12864.h程序

#ifndef_12864_H_

#define_12864_H_

voidmain12864();

voidinit12864();

voidpos(unsignedcharx,unsignedchary);

voidwrite_date(unsignedchardate);

voiddelay12(unsignedcharz);

externunsignedcharcodetable_front[];

externunsignedcharcodetable_stop[];

externunsignedcharcodetable_back[];

externunsignedcharcodetable_add[];

externunsignedcharcodetable_dec[];

externunsignedcharcodetable_i[];

externunsignedcharcodetable_speed[];

externunsignedchartablenum[];

#endif

(3)Jianpan.h程序

#ifndef_JIANPN_H_

#define_JIANPAN_H_

voidjianpan();

voiddelay(unsignedchard);

/****外部用到的变量要加extern进行外部变量声明*************/

externunsignedcharkn1flag;//按键1标志位

externunsignedcharkn2flag;//按键2标志位

externunsignedcharkn0flag;//按键2标志位

externbitkn2;//

externbitkn3;

externbitkn4;

#endif

(4)cesu.h程序

#ifndef_CESU_H_

#define_CESU_H_

externunsignedintcsnum1;

externunsignedintcsnum2;

//externunsignedintT0count;

#endif

(5)uart.h程序

#ifndef_UART_H_

#define_UART_H_

externunsignedcharflag;

externunsignedchara;

externunsignedcharsbufdate;

externunsignedcharpwm;

externunsignedcharpwmflag;

voidUart_Main();

#endif

(6)按键控制子程序

/********按键对应控制**************/

voidkongzhi()

{

if(kn0flag==1)//按下P1^7停止

{

kn0flag=0;

ENA=0;

TR0=0;

csnum1=0;

pwm=0;

pos(0,0);

for(num=0;num<16;num++)

{

write_date(table_stop[num]);

delay12

(1);

}

}

if(kn1flag==1)//按下P3^3正转

{

kn1flag=0;

TR0=1;

pwmflag=0;

add_dec();

}

if(kn2flag==1)//按下P3^4反转

{

kn2flag=0;

TR0=1;

pwmflag=1;

add_dec();

}

}

(7)PWM加减速控制子程序

voidadd_dec()//加减程序

{

if(kn3==1)//按下松开P3^5;PWM加2

{

kn3=0;

TR0=1;

pwm=pwm+2;

pos(0,4);

for(num=0;num<4;num++)

{

write_date(table_add[num]);

delay12

(1);

}

}

if(kn4==1)//按下松开P3^6;pwm减2

{

kn4=0;

TR0=1;

pwm=pwm-2;

pos(0,4);

for(num=0;num<4;num++)

{

write_date(table_dec[num]);

delay12

(1);

}

}

}

(8)速度,PWM,电流显示子程序

/******显示速度,PWM,电流****/

voiddisplay_date()

{

pos(1,2);//速度

for(p=0;p<1;p++)

{

write_date(':

');

write_date(tablenum[csnum2/1000]);

write_date(tablenum[csnum2/100%10]);

write_date(tablenum[csnum2/10%10]);

write_date(tablenum[csnum2%10]);

delay12

(1);

write_date('r');

write_date('/');

write_date('m');

write_date('i');

write_date('n');

delay12

(1);

}

pos(2,2);//初略计算电流

for(p=0;p<1;p++)

{

write_date(':

');

write_date(tablenum[pwm*189/100/100%10]);

write_date(tablenum[pwm*189/100/10%10]);

write_date(tablenum[pwm*189/100%10]);//[(pwm*163/10/50)/4*6/50/4%10]);

delay12

(1);

write_date('m');

write_date('A');

delay12

(1);

}

pos(3,0);//pwmU

for(p=0;p<1;p++)

{

write_date('p');

write_date('w');

write_date('m');

write_date('');

write_date(tablenum[pwm/100%10]);

write_date(tablenum[pwm/10%10]);

write_date(tablenum[pwm%10]);

delay12

(1);

write_date('');

write_date('');

write_date('U');

write_date(':

');

write_date(tablenum[(pwm*63/50)/10%10]);//电压u=ton/T*Ud

write_date('.');

write_date(tablenum[(pwm*63/50)%10]);

delay12

(1);

}

}

(9)汉字显示子程序

voiddisplay_hanzi()//汉字

{

pos(1,0);//第二行第一列开始

for(num=0;num<4;num++)

{

write_date(table_speed[num]);//显示“速度”speed

delay12

(1);

}

pos(2,0);//第三行第一例开始

for(num=0;num<4;num++)

{

write_date(table_i[num]);//显示“电流:

”i

delay12

(1);

}

}

3、液晶驱动程序设计

LCD12864驱动除了集成基本的读写函数、空闲检测等基本函数外,本系统还字符输出、图形绘制、画点、画直线、画圆等方便于界面显示的功能函数,并且采取了多个函数实现参数化,这有利于在其他文件中进行调用,传入不同参数可以出现不同效果。

在这些功能函数中,运用了大量的数学算法,在画任意直线中,我们采用了Bresenham算法进行坐标点的计算,在画圆形图片的功能函数中,则运用了数学上的正八边形确定一个圆的方法。

在其他清屏函数、反白函数、画框函数等效果功能函数里,我们大量采用子函数包含运用,大大提高了代码的利用率,介绍了代码的重复编写。

4、上位机设计如下图

5、PID控制程序

PID(比例-积分-微分)控制器作为最早实用化的控制器已有70多年历史,现在仍然是应用最广泛的工业控制器。

PID控制器简单易懂,使用中不需精确的系统模型等先决条件,因而成为应用最为广泛的控制器。

此部分本设计中仅做介绍不做深入研究。

六、调速数据

1、开环调速数据

通过加速按键进行转速加速

时间/S

1

2

3

4

5

6

转速/R/MIN

20

76

100

120

150

166

Ud/V

0.35

1.05

1.86

2.50

2.95

3.3

I/A

-0.002

-0.0636

0.012

0.068

0.05

0.06

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2