单片机LCD编程

单片机LCD编程,第1张

/*************************************************

名称:LCD12864_ST7920并行测试程序

试验功能:测试基于ST7920控制芯片的LCD12864的显示

并行方式连接;晶振11.0592M

编写:JiangX.net

*************************************************/

#include <reg52.h>

#include <ziku.h>

#include <intrins.h>

#include <string.h>

#define uchar unsigned char

#define uint unsigned int//宏定义

#define ulong unsigned long

#define Channal_A 1//通道A

#define Channal_B 2//通道B

#define Channal_AB3//通道A&B

//**************************一下为函数声明修**************************************

static void DA_conver(uint Dignum)

extern void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

//**************************修改硬件时要修改的部分********************************

sbit DIN = P0^0//数据输入端

sbit SCLK = P0^1//时钟信号

sbit CS= P0^2//片选输入端,低电平有效

/*MAX187接口定义*/

sbit MAX187_CS= P2^6

sbit MAX187_DO= P2^5

sbit MAX187_SK= P2^7

/*****13864LCD接口定义*****/

sbit LCD_RS = P3^7//1:输入数据 ;0:输入命令

sbit LCD_RW = P2^7//1:读数据 0:写数据

sbit LCD_EN = P2^6//LCM使能端

sbit LCD_PSB = P2^3//串并口选择 1:并口模式0:串口模式

#define LCD_DATA P1 //LCD总线端口

/*****LCD功能初始化指令*****/

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H

#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白

#define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1

#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH

#define SET_DD_AC 0x80

/*****汉字地址表*****/

uchar code addr_tab[]={ //便于根据汉字坐标求出地址

0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置

0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置

0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置

0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置

}

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

uchar first[]="MAX187 "

uchar show187[]="12345"

//uchar code shw187[]="123456"

uchar error[]="ERROR!"

ulong vv

/*****n(ms)延时子程序*****/

void delayms(uint t) //约延时n(ms)

{

uint i

while(t--)

{

for(i=0i<125i++)

}

}

/*****等待LCD忙*****/

void WaitBusy(void) //延时一小段时间,等待LCD空闲

{

uchar i=5

while(i--)

}

/*****写指令代码*****/

void Lcd_WriteCmd(uchar cmdcode)

{

LCD_RS = 0

LCD_RW = 0

LCD_EN = 1

WaitBusy()

LCD_DATA = cmdcode

LCD_EN = 0

}

/*****写数据*****/

void Lcd_WriteData(uchar dispdata)

{

LCD_RS = 1

LCD_RW = 0

LCD_EN = 1

WaitBusy()

LCD_DATA = dispdata

LCD_EN = 0

}

/*****初始化LCD*****/

void Lcd_Init()

{

LCD_PSB = 1

delayms(50)

Lcd_WriteCmd(0x30) //选择基本指令集

delayms(1)

Lcd_WriteCmd(0x30) //选择8bit数据流

delayms(1)

Lcd_WriteCmd(0x0c) //开显示(无游标、不反白)

delayms(1)

Lcd_WriteCmd(0x01) //清除显示,并且设定地址指针为00H

delayms(20)

}

/*****显示汉字*****/

void hanzi_Disp(uchar x,uchar y,uchar *s)

{ //x、y为汉字坐标

Lcd_WriteCmd(addr_tab[8*x+y]) //写地址

while(*s>0)

{

Lcd_WriteData(*s) //写数据

s++

}

}

/*****显示图片(显示Gdram内容)*****/

/*绘图显示的步骤

1 关闭绘图显示功能

2 先将垂直的坐标(Y)写入绘图RAM地址

3 再将水平的位元组坐标(X)写入绘图RAM地址

4 将D15-D8写入RAM中

5 将D7-D0写入到RAM中

6 打开绘图显示功能*/

//图片取模方式:横向取模,字节正序

void pic_Disp(uchar *pic)//显示Gdram内容(显示图片)

{

uchar x,y,i

for(i=0i<9i=i+8)

for(y=0y<32y++)

{

for(x=0x<8x++)

{

Lcd_WriteCmd(0x36) //扩充指令,开绘图显示

Lcd_WriteCmd(0x80+y) //行地址

Lcd_WriteCmd(0x80+x+i) //列地址

Lcd_WriteData(*pic++) //写数据 D15-D8

Lcd_WriteData(*pic++) //写数据 D7-D0

Lcd_WriteCmd(0x30)

}

}

}

/*max187延时程序*/

void delay_MS(uint ms)//普通延时MS级

{ uint i,j

for(i=0i<msi++)

{for(j=0j<1141j++)}

}

void delay_uS(uint us)//普通延时US级

{ uint i,j

for(i=0i<usi++)

{ for(j=0j<10j++)}

}

//MAX187读程序

unsigned int MAX187read(void)

{

uchar H,L,i

uint count //16位变量

MAX187_CS=0 //低电平有效,开始转换

delay_uS(2) //延时8.5μ等待转换结束

MAX187_SK=1

MAX187_SK=0

H=0//高位变量清零

for(i=0i<4i++) //高4位

{

MAX187_SK=1

if(MAX187_DO) H++ //位标量,如为1则H加1,如为0则跳过

MAX187_SK=0

if(i!=3)

H<<=1

}

L=0

for(i=0i<8i++) //低8位

{

MAX187_SK=1

if(MAX187_DO) L++ //位标量,如为1则L加1,如为0则跳过

MAX187_SK=0

if(i!=7)

L<<=1

}

delay_uS(1)

MAX187_CS=1

count=0

count=L

return count

}

void MAX187_data()

{

vv=MAX187read()

vv=vv*2*4096/4093

show187[0]=vv/1000+'0'

show187[1]='.'

show187[2]=vv/100%10+'0'

show187[3]=vv/10%10+'0'

show187[4]=vv%10+'0'

show187[5]='\0'

}

/*****主函数*****/

void main(void)

{

uchar volt,number

number=2

volt=0x30+number

Lcd_Init()

while(1)

{

Lcd_Init()

hanzi_Disp(0,1,"山东天工机电")

hanzi_Disp(1,2,"智能充电机")

hanzi_Disp(2,0,"www.sdtgjd.com")

hanzi_Disp(3,3,"")

delayms(1000)

Lcd_Init()

hanzi_Disp(1,2,"充电电流:")

//delayms(500)

//Lcd_Init()

MAX187_data()

hanzi_Disp(2,3,show187)

delayms(1500)

Write_A_B(0x0fff,0x0000,Channal_A,0) //测量A通道

//Write_A_B(0x0000,0x0600,Channal_B,1) //测量B通道

// Write_A_B(0x0504,0x0a47,Channal_AB,1) //测量AB通道,测量时需屏蔽上面两句

//while(1)

}

}

//=================================================================

// 函数名称 :void DA_conver(uint Dignum)

// 函数功能 :进行DA转换

// 入口参数 :Dignum:根据说明设置转化数据.头四位为特殊位用于选择转化方式,

//以及用于通道选择.请自行设置.后12位为需要转换的值

// 出口参数 :无

//=================================================================

void DA_conver(uint Dignum)

{

uint Dig=0

uchar i=0

SCLK=1

CS=0 //片选有效

for(i=0i<16i++) //写入16为Bit的控制位和数据

{

Dig=Dignum&0x8000

if(Dig)

{

DIN=1

}

else

{

DIN=0

}

SCLK=0

_nop_()

Dignum<<=1

SCLK=1

_nop_()

}

SCLK=1

CS=1 //片选无效

}

//=================================================================

// 函数名称 :void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

// 函数功能 :模式、通道选择并进行DA转换

// 入口参数 :Data_A:A通道转换的电压

//Data_B:B通道转换的电压值

//Channal:通道选择,其值为Channal_A,Channal_B,或Channal_AB

//Model:速度控制位 0:slow mode 1:fast mode

// 出口参数 :无

// 说明: Data_A,Data_B的范围为:0-0x0fff

//本程序如果只需要一个通道时,另外一个通道的值可任意,但是不能缺省

//=================================================================

void Write_A_B(uint Data_A,uint Data_B,uchar Channal,bit Model)

{

uint Temp

if(Model)

{

Temp=0x4000

}

else

{

Temp=0x0000

}

switch(Channal)

{

case Channal_A: //A通道

DA_conver(Temp|0x8000|(0x0fff&Data_A))

break

case Channal_B: //B通道

DA_conver(Temp|0x0000|(0x0fff&Data_B))

break

case Channal_AB:

DA_conver(Temp|0x1000|(0x0fff&Data_B)) //A&B通道

DA_conver(Temp|0x8000|(0x0fff&Data_A))

break

default:

break

}

}

基于2407单片机的直流电机PWM调速系统

学生: 张 洋

专业: 电气工程及其自动化

班级: 09020702

指导教师: 周素盈

二.系统总体方案论证

2.1系统方案比较与选择

方案一:采用专用PWM集成芯片、IR2110 功率驱动芯片构成整个系统的核心,现在市场上已经有很多种型号,如Tl公司的TL494芯片,东芝公司的ZSK313I芯片等。这些芯片除了有PWM信号发生功能外,还有“死区”调节功能、过流过压保护功能等。这种专用PWM集成芯片可以减轻单片机的负担,工作更可靠,但其价格相对较高,难于控制工业成本不宜采用。

方案二:采用24071单片机、功率集成电路芯片L298构成直流调速装置。L298是双H高电压大电流功率集成电路,直接采用TTL逻辑电平控制,可用来驱动继电器、线圈、直流电动机、步进电动机等电感性负载。其驱动电压为46V,直流电流总和为4A。该方案总体上是具有可行性,但是L298的驱动电压和电流较小,不利于工业生产应用,无法满足工业生产实践中大电压、大电流的直流电机调速。

方案三:采用2407单片机、IR2110功率驱动芯片构成整个系统的核心实现对直流电机的调速。2407具有两个定时器T1和T2。通过控制定时器初值T1和T2,从而可以实现从任意端口输出不同占空比的脉冲波形。2407控制简单,价格廉价,且利用2407构成单片机最小应用系统,可缩小系统体积,提高系统可靠性,降低系统成本。IR2110是专门的MOSFET管和IGBT的驱动芯片,带有自举电路和隔离作用,有利于和单片机联机工作,且IGBT的工作电流可达50A,电压可达1200V,适合工业生产应用。

综合上述三种方案,本设计采用方案三作为整个系统的设计思路。

2.2系统方案描述

本系统采用2407为控制核心,利用2407产生的PWM经过逻辑延迟电路后加载到以IR2110为驱动核心,IGBT构成的H桥主干电路上实现对直流电机的控制和调速。本系统的控制部分为5V的弱电而驱动电路和负载电路为110V以上的直流电压因此在强弱电之间、数据采集之间分别利用了带有驱动功能的光耦TLP250和线性光耦PC817实现强弱电隔离,信号串扰。具体电路框图如下图2-1

图2-1系统整体框图

2.3 转速负反馈单闭环直流调速系统原理

2.3.1原理框图

该系统原理框图如图2-3所示,转速反馈控制环的调节是利用单片机软件实现的PI调节。图中虚线部分是采用单片机实现的控制功能。

2.3.2 单闭环直流调速系统的组成

图2-3 数字式转速负反馈单闭环直流调速系统

只通过改变触发或驱动电路的控制电压来改变功率变换电路的输出平均电压,达到调节电动机转速的目的,称为开环调速系统。但开环直流调速系统具有局限性:

(1)、通过控制可调直流电源的输入信号,可以连续调节直流电动机的电枢电压,实现直流电动机的平滑无极调速,但是,在启动或大范围阶跃升速时,电枢电流可能远远超过电机额定电流,可能会损坏电动机,也会使直流可调电源因过流而烧毁。因此必须设法限制电枢动态电流的幅值。

(2)、开环系统的额定速降一般都比较大,使得开环系统的调速范围D都很小,对于大部分需要调速的生产机械都无法满足要求。因此必须采用闭环反馈控制的方法减小额定动态速降,以增大调速范围。

(3)、开环系统对于负载扰动是有静差的。必须采用闭环反馈控制消除扰动静差,为克服其缺点,提高系统的控制质量,必须采用带有负反馈的闭环系统,方框图如图2-2所示。在闭环系统中,把系统输出量通过检测装置(传感器)引向系统的输入端,与系统的输入量进行比较,从而得到反馈量与输入量之间的偏差信号。利用此偏差信号通过控制器(调节器)产生控制作用,自动纠正偏差。因此,带输出量负反馈的闭环控制系统能提高系统抗扰性,改善控制精度的性能,广泛用于各类自动调节系统中。

图2-2 闭环系统方框图

对于调速系统来说,输出量是转速,通常引入转速负反馈构成闭环调速系统。在电动机轴上安装测速装置,引出与输出量——转速成正比的负反馈电压,与转速给定电压进行比较,得到偏差电压,经过放大器A,产生驱动或触发装置的控制电压,去控制电动机的转速,这就组成了反馈控制的闭环调速系统,如图2-4所示。

图2-4 转速负反馈单闭环直流调速系统静态框图

2.3.3速度负反馈单闭环系统的静特性

由图2-3,按照梅森公式可以直接写出转速给定电压Un*和负载扰动电流IL与转速n的关系式如下:式2-2

其中,闭环系统的开环放大系数为: 式2-3

开环系统的负载速降为: 式2-4

由式2-2闭环时的负载速降为: 式2-5

上式表明采用速度闭环控制后,其负载速降减小了(1+Kol)倍,使得闭环系统的机械特性比开环时硬得多;因而,闭环系统的静差率要小得多,可以大大增加闭环系统的调速范围。

2.4 采用PI调节器的单闭环无静差调速系统

在电动机的闭环调速中,速度调节器一般采用PI调节器,即比例积分调节器。常规的模拟PI控制系统原理框图见图2-5,该系统由模拟PI调节器和被控对象组成。

r(t)是给定值,y(t)是系统的实际输出值,给定值与实际输出值构成控制偏差e(t)。

………………………………………………(2-6)

e(t)作为PI调节器的输入,u(t)作为PI调节器的输出和被控制对象的输入。所以模拟PI控制器的规律为:

…………………………………(2-7)

式中Kp--比例系数,TI--积分常数。

比例调节的作用是对偏差瞬间做出快速反应。偏差一旦产生,控制器立即产生控制作用,使控制量向减少偏差的方向变化。控制作用的强弱取决于比例系数,比例系数越大,控制越强,但过大会导致系统振荡,破坏系统的稳定性。

积分调节的作用是消除静态误差。但它也会降低系统响应速度,增加系统的超调量。

图2-5模拟PI控制系统原理图

采用DSP对电动机进行控制时,使用的是数字PI调节器,而不是模拟PI调节器,也就是说用程序取代PI模拟电路,用软件取代硬件。将式3-6离散化处理就可以得到数字PI调节器的算法:

……………………………(2-8)

或 ……………………………(2-9)

式中k--采样序号,k=0,1,2,…;uk--第k次采样时刻的输出值;

ek--第k次采样时刻输入的偏差值; KI--积分系数,;

u0--开始进行PI控制是的原始初值。

用式(3-8)计算PI调节器的输出比较繁杂,可将其进一步变化,令第k次采样时刻的输出值增量为:

………………………………(2-10)

所以……………………………………(2-11)

或 …………………………………………(2-12)

式中--第k-1次采样时刻的输出值,--第k-1次采样时刻的偏差值,

--,--。

用式(2-11)或式(2-12)就可以通过有限次的乘法和加法快速地计算出PI调节器的输出。

以下是用式(2-12)计算的程序代码:

LT EK;

MPYK2;K2是Q12格式,

LACC GIVE ;给定值

SUBMEASURE ;减反馈值

SACL EK;保存偏差值

LACC UK,12;

LTAEK ;,Q12格式,

MPYK1;k1是Q12格式,

AP AC ;,Q12格式

SACHUK,4 ;保存

以上程序代码只用10条指令。如果用40MIPS,只需250ns时间,足可以用于实时控制。

三.硬件电路的模块设计

3.1 H桥电机驱动电路

图3-1所示的H桥式电机驱动电路包括4个三极管和一个电机,电路得名于“H桥驱动电路”是因为它的形状酷似字母H。如图3-1所示,要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。

图3-1H桥驱动电路

要使电机运转,必须使对角线上的一对三极管导通。例如,如图3-2所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经 Q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向 转动(电机周围的箭头指示为顺时针方向)。

图3-2 H桥驱动电路

图2-3所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。

图3-3 H桥驱动电路

3.2放大电路的连接电路

IR2111外围电路如图所示。单片机输出的PWM信号经光耦PC817后,输出至IR2111输入端,此处的光耦对PWM信号起到隔离、电平转换和功率放大的作用。图中,、为光耦上拉电阻,其值根据所用光耦的输入和输出地电流参数决定:为电容滤波电容,为自举二极管,、为栅极驱动电阻。

3.3键盘输入电路

本系统采用键盘,如图3.5所示。

图3.5为按钮电路

3.3测速电路设计

一个完善的闭环系统,其定位精度和测量精度主要由测量元件决定,因此,高精度的测量转速对测量元件的质量要求相当高。光电编码器是现代系统中必不可少的一种数字式速度测量元件,被广泛应用于微处理器控制的闭环控制系统中。

3.3.1光栅盘

光栅盘是在圆盘边刻有很多光栅。当光源照射到光栅部分时,没有被光栅挡住的光源就透射过去。本系统中采用了一个圆面上刻有60个均匀光栅格的光栅盘。当电机旋转一周时,会产生60个光脉冲信号。

3.3.2 光电传感器

光电传感器原理是有一个发光二极管和一个由光信号控制放大的三极管组成。由发光二极管发出红外光线通过3mm宽的气隙透射到另一端的三极管上,使得该三极管导通。其特征如下:

气隙是3mm。

分辨率达到0.5mm。

大电流传输比。

暗电流为:0.25

在=10mA时,发光二极管产生的光线的波长为940nm。

安装时将光栅盘圆面钳到沟槽中,光电传感器的发光二极管发出的红外线通过3mm气隙照射到光栅盘,光通过光栅盘面上透光的光栅气隙可以使得光传感器的三极管导通,从C极会输出一个低电平,被光栅挡住的光不能透过去,使得光电传感器的C极会输出一个高电平。

3.6光电传感器原理图

光电传感器在硬件电路设计上很简单, 如图3.7。在光电传感器的1引脚上接一个限流电阻R,限制流过发光二极管的电流=10mA左右。计算公式如下:

其中,

3.7光电传感器设计图

3.4 稳压电源电路

电池放电时内阻稳定的增大,电压则稳定的减小, 而且接上大功率的负载时电压会瞬时降低, 不能用于提供固定的电压,对于各种IC芯片需要的稳定电压, 需要专门的稳压器件,或者稳压电路, 基本的稳压器有两种:线性(LDO)和开关(DCDC), 其中前者只能降压使用,而前者还可以升压使用而且效率很高。

控制芯片89C51的标准供电电压是5V,可以选择使用线性电压调整芯片稳压,如:

7805:最大输出电流1.5A,内部过热保护,内部短路电流限制,典型输入电压7~20V, 输出电压4.9~5.1V,静态电流典型值4.2mA,压差(输出与输入的差)至少2V。

78L05(电流较小):最大输出电流100mA,内部过热保护,典型输入电压7~20V, 输出电压4.75~5.25V,静态电流典型值3mA。

LM317(电压可调):输出电流可达1.5A,输出电压1.2V~37V,内部过热保护等。

选用7805,一方面简单;另一方面比较常用且比较便宜。

LM78系列是美国国家半导体公司的固定输出三端正稳压器集成电路。我国和世界各大集成电路生产商均有同类产品可供选用,是使用极为广泛的一类串联集成稳压器。内置过热保护电路,无需外部器件,输出晶体管安全范围保护,内置短路电流限制电路。对于滤波电容的选择,需要注意整流管的压降。

稳压电源由电源变压器、整流电路、滤波电路和稳压电路组成,

a.整流和滤波电路:整流作用是将交流电压变换成脉动电压。滤波电路一般由电容组成,其作用是脉动电压中的大部分纹波加以滤除,以得到较平滑的直流电压。

b.稳压电路:由于得到的输出电压受负载、输入电压和温度的影响不稳定,为了得到更为稳定电压添加了稳压电路,从而得到稳定的电压。

3.8光电传感器设计图

三端集成稳压器LM7805正常工作时,输入、输出电压差2~3V。C1为输入稳定电容,其作用是减小纹波、消振、抑制高频和脉冲干扰,C1一般为0.1~0.47μf。C2为输出稳定电容,其作用是改善负载的瞬态响应,C2一般为1μF。使用三端稳压器时注意一定要加散热器,否则是不能工作到额定电流。二极管IN4007用来卸掉C2上的储存电能,防止反向击穿LM7805。查相关资料该芯片的最大承受电流为0.1A,因此输入端必须界限流电阻R1,R1=(12*0.9-5)/0.1=58Ω,取近似值,选用70Ω的电阻。

3.5.显示电路

液晶显示模块(LCD)由于其具有功耗低、无电磁辐射、寿命长、价格低、接口方便等一系列显著优点,被广泛应用与各种仪表仪器、测量显示装置、计算机显示终端等方面。其中,字符液晶显示模块是一类专用于显示字母、数字、符号的点阵式液晶显示模块。TS1620字符液晶显示模块以ST7066和ST7065为控制器,其接口信号功能和 *** 作指令与HD44780控制器具有兼容性。字符液晶有81、162、202、402等20多种规格型号齐全的字符液晶显示模块,均具有相同的引线功能和编程指令,与单片机的接口具有通用性。下图为外观机构。

TS1620的引脚与功能表下图所示。

引脚好 引脚符号 名称 功

1 GND 电源地 接5V电

源地端

2 VDD 电源正端 接5V电

源正端

3 VEE 液晶驱动电压端 电压可调,一端接地,

一端接可调电阻

4 RS 寄存器选择段 RS=1为数据寄存器,

RS=0为指令寄存器

5 RW 读/写选择端 RW=1为读数据,

RW=0为写数据

6 EN 读/写使能端 写时,下降沿触发;

读时,高电平有效

7至14 DB0—DB7 8位数据线 数据

总线

TS1620模块与单片机的接口简单,PIC18F单片机的连接图如总图所示。PIC18F458的RD0-RD7端口直接与TS1620-1的DB0-DB7相连接,TS1620-1的控制信号RS、RW、EN分别与PIC18F458的RE0-RD2相连接。

3.6时钟电路

单片机各功能部件的运行都是以时钟控制信号为基准,有条不紊地一拍一拍地工作,因此时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。电路中的电容C1和C2典型值通常选择为30pF左右。对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器的频率高低,振荡器的稳定性和起振的快速性,晶振的频率越高则系统的时钟频率也越高,单片机的运行速度也越快。

图3.9时钟电路

本设计采用频率为12MHZ,微调电容C1和C2为30pF的内部时钟方式,电容为瓷片电容。判断单片机芯片及时钟系统是否正常工作有一个简单的方法,就是用万用表测量单片机晶振引脚(18,19脚)的对地电压,以正常工作的单片机用数字万用表测量为例:18脚对地电压约为2.24V,19脚对地电压约为2.09V。

4.3 复位电路

复位是单片机的初始化 *** 作,其主要作用是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或 *** 作失误使系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。

图3.10 复位电路

单片机的复位电路在刚接通电时,刚开始电容是没有电的,电容内的电阻很低,通电后,5V的电通过电阻给电解电容进行充电,电容两端的电会由0V慢慢的升到4V左右(此时间很短一般小于0.3秒),正因为这样,复位脚的电由低电位升到高电位,引起了内部电路的复位工作,这是单片机的上电复位,也叫初始化复位。当按下复位键时,电容两端放电,电容又回到0V了,于是又进行了一次复位工作,这是手动复位原理。 该电路采用按键手动复位。按键手动复位为电平方式。对于怀疑是复位电路故障而不能正常工作的单片机也可以采用模拟复位的方法来判断,单片机正常工作时第9脚对地电压为零,可以用导线短时间和+5V连接一下,模拟一下上电复位,如果单片机能正常工作了,说明这个复位电路有问题,其中电平复位是通过RET端经电阻与电源VCC接通而实现的,当时钟频率适用于12MHZ时,C取100uF,R取10K,为保证可靠复位,在初识化程序中应安排一定的延迟时间。

软件电路的模块设计

直流电机转速控制器的软件设计和系统功能的开发和完善是一个循序渐进过程,本文所作的软件开发是基于直流电机多速控制器的基本功能要求设计的该系统软件有主程序、功能键处理程序、电机运行显示程序、键盘设置参数程序测速程序、延时子程序等。

该系统的整个软件设计全部采用模块化程序设计思想,由系统初始化模块、案件识别模块、LCD模块、高优先级和低优先级中断服务程序四大模块组成。整个软件的主程序框图如图4-1。

图4-1整个软件的主程序框图

通过控制总中断使能PDPINTA控制电机的开关,其中定时器T1,T2分别对脉冲的宽度、光电传感器输出的脉冲数对应的1秒时间定时。对脉冲宽度的调整是通过改变高电平的定时长度,由变量high控制。变量change、 sub_speed 、add_speed分别实现电机的转向、加速、减速。

4.1系统初始化模块

/***************************主函数*********************************/

void main()

{

P2 = 0x00

TMOD = 0x11

TH1 = 0xec//定时器T1设置参数

TL1 = 0x78

TH2 = 0x3c //定时器T2设置参数

TL2 = 0xb0

TR1 = 1

TR2 = 1

init() //液晶显示初始化程序

while(1)

{

Wc2407r(0x84)

wc2407ddr('H')

wc2407ddr('e')

wc2407ddr('l')

wc2407ddr('l')

wc2407ddr('o')

if(test == 0)

num_medium++

datamade()

motor_control()

}

}

4.2 电机运行控制模块

电机运行控制模块包括电机的方向控制和电机的速度控制,他们由Open,close,addspeed,subspeed,swap变来控制2407单片机的EVA模块产生不同的PWM信号送到L298 电机驱动器。

/***********通过按键实现对电机开关、调速、转向的控制的程序*****************/

void motor_control()

{

if(open == 1)

PDPINTA = 1

if(close == 1)

PDPINTA = 0

if(swap == 1)

{

change = ~change

while(swap != 0)

{}

}

if(sub_speed == 1)

{ high++

if(high == 30)

PDPINTA=0

while(sub_speed != 0)

{}

}

if(add_speed == 1)

{high--

if(high == 5)

high = 5

while(add_speed != 0)

{}

}

}

4.3 测速软件设计

常用的光栅测速方法有三种:测频法(M法)、测周法(T法)和测频测周法(M/T

法)

M法测速是测定在一定时间内,脉冲的个数,从而转换为速度。

本系统采用M法则测速。设置2407单片机内的定时器/计数器TIME1于计数器模式在20个时钟周期内定时期间TIME1对输入的脉冲进行计数,在中断过程中对计入的脉冲数进行处理,获得转速数据。

/****T2中断服务程序********单位时间(S)方波的个数*************/

void time2_int(void) interrupt 3

{

count_speed++

if(count_speed == 20)

{ count_speed = 0

num_display = num_medium

num_medium = 0

}

}

/************************速度显示的数据处理*********************/

void datamade()

{

uint data MM

Wc2407r(0xc2)

wc2407ddr('S')

wc2407ddr('p')

wc2407ddr('e')

wc2407ddr('e')

wc2407ddr('d')

wc2407ddr(0x3a)

MM = num_display/100

wc2407ddr(wword[MM])

}

4.4LCD显示模块

LCD显示驱动单独做成一个源程序文件和头文件,可以方便以后其他模块或其他应用程序的调用。在LCD显示驱动模块中主要是LCD初始化函数LCD_Initize()、写LCD命令函数Write_LCD_Command()、写LCD数据函数Write_LCD_Data().

TS1620可以显示两行16列ASCII码,其对应的第一行的首行地址是80H;第二行的首地址是C0H,送字符串到LCD上显示,需要定位将字符串显示在第X行和第Y列上,显示的字符串不能超过该行的最大列。

#include <reg2407.h>

#define uchar unsigned char

#define uint unsigned int

sbit open = P2^0

sbit close = P2^1

sbit swap = P2^2

sbit sub_speed = P2^3

sbit add_speed = P2^4

sbit PWM1 = P3^0

sbit PWM2 = P3^1

/************************液晶显示*************/

sbit E=P3^7

sbit RW = P3^6

sbit RS = P3^5

sbit test = P3^4

int time = 0

int high = 20

int period = 30

int change = 0

int flag = 0

int num_medium = 0

int num_display = 0

int count_speed = 0

uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}

/*******************延时t毫秒****************/

void delay(uchar t)

{

uint i

while(t)

{

/*对于11.0592MHz时钟,延时1ms*/

for(i=0i<125i++)

t--

}

}

//写命令函数LCD

void Write_LCD_Command(){

RS=0

RW=0

P1=j

E=1

E=0

delay(3)

}

//写数据函数LCD

void Write_LCD_Data()

{

RS=1

RW=0

P1=j

E=1

E=0

delay(2)

}

//初始化函数LCD

void LCD_Initize(){

wc2407r(0x01) //清屏

wc2407r(0x38) //使用8位数据,显示两行,使用5*7的字型

wc2407r(0x0c) //显示器件,光标开,字符不闪烁

wc2407r(0x06) //字符不动,光标自动右移一格

}

4.4 PWM 源程序

/***********8T1中断服务程序************PWM波的生成**********/

void time1_int(void) interrupt 1

{

time++

TH1 = 0xec

TL1 = 0x78

if(change == 0)

{

PWM2 = 1

if(time == high)

PWM1=0

else if(time == period)

{

PWM1 = 1

time = 0

}

}

else

{PWM1 = 1

if(time == high)

PWM2=0

else if(time == period)

{

PWM2 = 1

time = 0

}

}

}

4.5 PID调速程序流程如图

五.系统抗干扰

电子电路的抗干扰技术在电路设计中占有重要的地位,对系统是否正常工作有着决定作用。

本文电路既包括模拟电路也包括数字电路,而数字电路运行时输入和输出信号均只有两种状态,即高电平和低电平,且这两种电平的翻转速度很快,同时,由于数字电路基本上以导通或截至方式运行,工作速率比较高,故会对电路产生高频浪涌电流,可能会导致电路工作不正常而数字电路的输入输出波形边沿很陡,含有极丰富的频率分量,这对模拟电路来说,无疑是一个高频干扰源。为了消除以上可能出现的干扰,本系统在设计和调试过程中反复尝试比较,最终采取如下措施,消除了系统干扰。

(l)合理布置电源滤波、退藕电容。

(2)将数字电路与模拟电路分开。

(3)合理设计地线。

(4)尽量加粗接地线和电源线。

六.设计总结

经过2个星期的课程设计,留给我印象最深的是要设计一个成功的电路,必须要有要有扎实的理论基础,还要有坚持不懈的精神。

本产品实现了对直流电机的调速和测速,个人感觉其中还有许多不够完善的地方,例如:对电机的控制采用的是独立按键,而非矩阵键盘;电机的驱动电路的设计也不是很成熟。

此次的设计并不奢望一定能成功,但一定要对已学的各种电子知识能有一定的运用能力,我做设计的目的是希望能检查下对所学知识的运用能力的好坏,并且开始慢慢走上创造的道路,这是非常可贵的一点。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12078419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存