当前位置:文档之家› 基于单片机的直流电机

基于单片机的直流电机

摘要本课程主要是设计一个基于单片机的直流电机 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、STC89C521、电源(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所示图1 STC89C52单片机引脚图(1)系统时钟电路本系统采用11.0592MKZ的外部石英晶振作为单片机的时钟脉冲输入。

电路图如图2所示。

图2 时钟电路(2)复位电路本系统采用的是上电复位方式。

如图3所示。

图3 复位电路2、电机模块直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。

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

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

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

其实物图如图5所示。

图5 电机3、L298N模块(1)ADC结构图如6所示采用7.5V可充电两节干电池对EnA供电图6 ADC的结构(2)引脚说明见表3-1:表3-1 L298N引脚说明表MW.15Name Function1;15 Sense A; Sense B 在这个引脚和低之间可以接感应电阻用于控制负载电流2;3 Out 1; Out 2 A桥的输出端口;流经这两个端子连接的负载电流在端子1被检测4 VS 用于驱动负载的功率输出电源电压。

在这个引脚和地之间必须接一个100nf的无极性电容5;7 Input 1; Input 2 A桥TTL输入端6;11 Enable A; EnableB TTL使能输入端:低电平使桥A或桥B无效8 GND 地9 VSS 逻辑模块的电源供应。

引脚与地间必须接一个100nF的电容10; 12 Input 3; Input 4 B桥TTL输入端13; 14 Out 3; Out 4 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/56、光电测速模块光电测速传感器,包括传感器和码盘两部分二、系统软件设计1、软件流程图开始初始化串口连接函数按键动作函数上位机控制函数正反,加减控制液晶显示注释:初始化定时器,中断,串口中断,初始化12864,初始化PWM的值。

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

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

2、测速程序设计#include <reg52.h>#include <intrins.h>#include"jianpan.h"#include"12864.h"#include"cesu.h"#include"uart.h"sbit INA=P1^0; //正转sbit INB=P1^1; //反转sbit ENA=P1^2; //控制通断unsigned char tt=0;unsigned int ttcs=0;unsigned char num=0;unsigned char p;bit ttflag=0;void add_dec(); //声明加减速函数(1)系统主程序void main(){init(); //初始化定时器,中断,串口中断main12864(); //初始化12864pwm=25; //初始PWM值设置25while(1){Uart_Main(); //串口主函数jianpan(); //按键函数kongzhi(); //正反,加减控制display_hanzi(); //显示汉字display_date(); //显示数据if(pwmflag==0) //正转{pos(0,0); //第一行第一例开始for(num=0;num<4;num++){//显示“前进”frontwrite_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)初始化函数程序void init(){TMOD=0x21; //串口中断;定时器0工作方式1 TH0=(65536-2000)/256; //2msTL0=(65536-2000)%256;TH1=0xfd; //初值 9600TL1=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************/void timer0() interrupt 1{TH0=(65536-2000)/256; //2msTL0=(65536-2000)%256;tt++;ttcs++;if(tt>=50) tt=0; //T=100msif(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**********/void exint0() interrupt 0 //(location at 0003H){csnum1++;}(2)12864.h程序#ifndef _12864_H_#define _12864_H_void main12864();void init12864();void pos(unsigned char x,unsigned char y); void write_date(unsigned char date);void delay12(unsigned char z);extern unsigned char code table_front[]; extern unsigned char code table_stop[]; extern unsigned char code table_back[]; extern unsigned char code table_add[]; extern unsigned char code table_dec[]; extern unsigned char code table_i[]; extern unsigned char code table_speed[]; extern unsigned char tablenum[];#endif(3)Jianpan.h程序#ifndef _JIANPN_H_#define _JIANPAN_H_void jianpan();void delay(unsigned char d);/****外部用到的变量要加extern进行外部变量声明*************/extern unsigned char kn1flag; //按键1标志位extern unsigned char kn2flag; //按键2标志位extern unsigned char kn0flag; //按键2标志位extern bit kn2; //extern bit kn3;extern bit kn4;#endif(4)cesu.h程序#ifndef _CESU_H_#define _CESU_H_extern unsigned int csnum1;extern unsigned int csnum2;//extern unsigned int T0count;#endif(5)uart.h程序#ifndef _UART_H_#define _UART_H_extern unsigned char flag;extern unsigned char a;extern unsigned char sbufdate;extern unsigned char pwm;extern unsigned char pwmflag;void Uart_Main();#endif(6)按键控制子程序/********按键对应控制**************/void kongzhi(){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加减速控制子程序void add_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,电流****/void display_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); //pwm Ufor(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 *Udwrite_date('.');write_date(tablenum[(pwm*63/50)%10]);delay12(1);}}(9)汉字显示子程序void display_hanzi() //汉字{pos(1,0); //第二行第一列开始for(num=0;num<4;num++){write_date(table_speed[num]); //显示“速度”speeddelay12(1);}pos(2,0); //第三行第一例开始for(num=0;num<4;num++){write_date(table_i[num]); //显示“电流:”idelay12(1);}}3、液晶驱动程序设计LCD12864驱动除了集成基本的读写函数、空闲检测等基本函数外,本系统还字符输出、图形绘制、画点、画直线、画圆等方便于界面显示的功能函数,并且采取了多个函数实现参数化,这有利于在其他文件中进行调用,传入不同参数可以出现不同效果。

相关主题