基于PCF8951单片机设计.docx

上传人:b****7 文档编号:23719856 上传时间:2023-05-20 格式:DOCX 页数:31 大小:165.17KB
下载 相关 举报
基于PCF8951单片机设计.docx_第1页
第1页 / 共31页
基于PCF8951单片机设计.docx_第2页
第2页 / 共31页
基于PCF8951单片机设计.docx_第3页
第3页 / 共31页
基于PCF8951单片机设计.docx_第4页
第4页 / 共31页
基于PCF8951单片机设计.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于PCF8951单片机设计.docx

《基于PCF8951单片机设计.docx》由会员分享,可在线阅读,更多相关《基于PCF8951单片机设计.docx(31页珍藏版)》请在冰豆网上搜索。

基于PCF8951单片机设计.docx

基于PCF8951单片机设计

1引言

现在工业生产中,电机是主要的驱动设备,目前在直流电机拖动系统中已大量采用晶闸管装置控制电机的KZ」D拖动系统,取代了笨重的发电机-电动机的

F—D系统,又伴随着电子技术的高度发展,促进使直流电机调速逐步从模拟化

向数字化转变,特别是单片机技术的应用,使直流电机调速又进入了一个新的阶段,智能化,高可靠性已成为它的发展趋势。

直电机调速基本原理是比较简单的

(相对于交流电机),只要改变电机的电压就可以改变转速了。

1.1设计任务与要求

设计一个基于PCF8591的直流电动机转速控制电路,在相应的软件控制下可以完成要求的功能,即使用具有IIC接口的PCF8591模数与数模转换芯片,使用

1602LCD液晶显示屏显示PCF8591模数与数模转换芯片上的4个通道的模数转换

结果,同时,0通道的转换结果再通过PCF8591转换为模拟信号,经过放大后调

控直流电动机的转速。

2设计过程

2.1设计过程与步骤2.1.1芯片介绍1)PCF8591

PCF8591是一种具有I2C总线接口的8位A/DD/A转换芯片,在与CPU

的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。

I2C总线是

Philips(飞利浦)公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性咼等优点。

PCF8591为单一电源供电(2.56V)典型值为5V,CMOS工艺PCF8591有

4路8位A/D输入,属逐次比较型,内含采样保持电路;1路8位D/A输

出,内含有DAC的数据寄存器A/DD/A的最大转换速率约为11kHz,但是转

换的基准电源需由外部提供PCF8591的引脚功能如图2.1所

引脚序号

引脚^^称

功能描述

17

AI.\t^AL\3

模拟信号输入端()^5V

5~7

器件硬件地址输入端*由硬件屯路决定

16.K

电源、地

9J0

SDAsSCL

1兀总线的数据线、时钟线

11

OSC

外部时钟输入端‘内部时钟输出端

12

K\r

时钟选择使用内部时钟:

K\T=],使用外部时钟

13

模拟信号地

15

AOLl'

D小转换输出端JZ比d

256曲

基准电源端\)・収值大小影响1)/A转换输出屯压。

14

'HFr

当取值等于为\J)J)时•输岀屯压为0-5叽

图2.1PCF8591引脚功能

在PCF8591内部的可编程功能控制字有两个,一个为地址选择字,另一个

为转换控制字PCF8591采用典型的I2C总线接口的器件寻址方法,即总线地址

(飞利浦)公司规定A/D器件高四

由器件地址引脚地址和方向位组成Philips

位地址为1001,低三位地址为引脚地址A0A1A2由硬件电路决定,地址选择字

格式具体描述如表2所示因此I2C系统中最多可接23=8个具有总线接口的

A/D器件地址的最后一位为方向位R/W,当主控器对A/D器件进行读操作时为1,进行写操作时为0总线。

操作时,由器件地址引脚地址和方向位组成的从地址为主控器发送的第一字节。

1)7

1)5

1)4lb

1)2

10

0

1A2

Al

AO

图2.2地址选择字格式描述

D0:

读写控制位,对转换器件进行读操作时为1,进行写操作时为0。

D1,D2,D3:

引脚硬件地址设置位,由硬件电路设定该PCF8591的物理地址。

D7,D6,D5,D4:

器件地址位固定为1001.PCF8591的转换控制字存放在控制寄存器中,用于实现

器件的各种功能总线操作时为主控器发送的第二字节转换控制字的格式功能具体描述如图2.3所示

1)7

1)6

1)5

1)4

Ih

1)2

1):

1)0

图2.3转换控制字格式描述

D0,D1:

通道选择位。

00:

通道0;01:

通道1;10:

通道2;11:

通道3。

D2:

自动增量允许位,为1时,每对一个通道转换后自动切换到下一通道进行

转换,为0时不自动进行通道转换,可通过软件修改进行通道转换D3:

特征位,

固定位0。

D4,D5:

模拟量输入方式选择位。

00:

输入方式0,四路单端输入;

01:

输入方式1,三路差分输入;10:

输入方式2,二路单端输入,一路差分输入;11:

输入方式3,两路差分输入。

D6:

模拟输出允许位,A/D转换时设置为(地址选择字D0位此时设置为1),D/A转换时设置为1(地址选择字位此时设置为)。

D7:

特征位,固定为0。

PCF8591的A/D转换为逐次比较型,在

A/D转换周期中借用DAC及高增益比较器对PCF8591进行写读操作后便立即启

动A/D转换,并读出A/D转换结果在每个应答信号的后沿触发转换周期,采样模拟电压并读出前一次转换后的结果。

A/D转换中,一旦A/D采样周期被触发,所选择通道的采样电压便保存在采样,保持电路中,并转换成8位二进制码(单端输入)或二进制补码(差分输入)存放在ADC数据寄存器中等待器件读出。

果控制字节中自动增量选择位置1,则一次A/D转换完毕后自动选择下一通

道。

读周期中读出的第一个字节为前一个周期的转换结果。

上电复位后读出的第一字节为80耳PCF8591的A/D转换亦使用的是I2C总线的读方式操作完成

的。

其数据操作格式如图2.4所示。

SSLAWAdulaO

A(blaIA

riata2

A]…

dala11

A

P

图2.4A/D转换数据操作格式

其中data0~datan为A/D的转换结果,分别对应于前一个数据读取期间所采样的模拟电压。

A/D转换结束后,先发送一个非应答信号位A再发送结束信号位P。

灰底位由主机发出,白底位是由PCF8591产生。

上电复位后控制字节状态为00H,在A/D转换时须设置控制字,即须在读操作之前进行控制字节的写入操

作。

逻辑操作波形时序图如图2.5所示。

岂11勺1*

MT肋

A1DaTU

i1CATE

图2.5A/D转换逻辑操作波形时序图

2)LCD1602

LCD1602液晶显示容量:

16X2个字符,芯片工作电压:

4.5—5.5V,工作电

流:

2.0mA(5.0V),模块最佳工作电压:

5.0V,字符尺寸:

2.95X4.35(WXH)mm

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为咼电平、0为低电平)指令1:

清显示,指令码01H,光标复位到地址00H位置。

指令2:

光标复位,光标返回到地址00Ho指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:

显示开关控制。

D:

控制整体显示的

开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,咼电平闪烁,低电平不闪烁。

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标。

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7:

字符发生器RAM地址设置。

指令8:

DDRAM

地址设置。

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此

时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据。

令11:

读数据。

2.1.2设计思路

本次设计要求设计利用带有IIC接口的PCF8592莫数与数模转换芯片,实现对直流电机转速的控制。

利用PCF8591芯片通道0采集到的模拟量,再次由AD

转换成模拟量输出去控制直流电机的转速,由于D/A输出的的电流普遍偏小,而

此不能直接驱动电机,要加上放大电路,而选用的直流电机是12V的DA的最大

输出电压是5V,因此要先进行电压放大,采用LM358运放,将电压放大两倍,

这样最高输出电压是10V,由于运放的驱动能力还是很弱,因此要进行电流放大,

这边采用三极管进行电压放大,以射极跟随器的方式进行放大。

2.1.3电路设计

由设计思路在Ptotues上面画出总的电路图如下:

C3

Til

ELZ

H3T

宀Cl

呼口hF

pt.

IJC

->£

jnwMi

LCM

I申型

:

-:

A'-:

士工|_■:

PDOUDfD-PWlrasNi2

PDCUILPDSAIK旳阿ePDJjWI

PZOH

P?

.⑷

p?

EAia

P?

.1*I5

rqMKD

p-a.yncD

町漏祁

p:

jrwri

HO/TD

P?

*3u&u^ff

■3T用D

Kf

磋n潮

Eh

U3

ID

«w■■■■

JL:

..:

;RP1-

9C-L

AfH

Arc

冲旳

Al

jbw

KT

VHEF

CJK

KJUD

j2

m

再叱p

■nZ(15-

—-IIPRA^

R6.

ILK十EMTl

R5

iv

+w

-車

ev4

 

图2.6总的电路图

2)放大电路及直流电机驱动电路如

图2.7

如图所示PCF8591的D/A输出经过电阻R6接到运放LM358的同向输入端,

设DA的输出电压为VDALM358运放的输出电压为VDA*(1+R5/R4)=2*VDA所

以LM358对PCF8591的D/A输出电压放大两倍,LM358输出的电压经过三极管

S8050组成的射极跟随器后的输出到直流电机的电压为2*VDA-Vbe(三极管基极

和发射极的导通电压)。

这样就组成了对D/A输出的电压,进行电压放大和电流

放大,最后去驱动直流电机的驱动电路。

3)PCF8591应用电路如下图2.8

1■••+£¥〒H

Re

iDk

[匸

R2nR3

IQk

U2

10

~g

Ji

11

3CU

AJNQ

3DA

AJN1

AJN2

M

內N3

Al

Aour

E灯

VREF

esc

AGND

PCF0591

A

£

14

13

IK,—

•-

Ik—•-

Ik--

•.

订匸

图2.8PCF8591应用电路

PCF8591应用电路如上图所示,IIC接口SCLSDA各接一个10K的上拉电阻。

AO、A1、A2接地,这样对PCF8591写话地址为0x90,对PCF8591写的话地址为0x90。

PCF8591的VREF参考电压引脚接+5V,这样A/D的最大输入电压是5V,D/A

的最大输出电压也是5V,PCF8591的四个A/D道道接四个可调电阻,用来改变输

入电压的大小。

4)单片机最小系统电路

r5V

C2

HH

1nF_

.4

U1

G31CRySTAL

[「]:

%

AinF

Cl

luF.

29

31

XTAL1

XTAL2

RST

PSEN

R1

10k

屮-TEI

Q12345G7---J—H—J—J—J—J—J—J—PPPPPPPP

O1_JA34S67

PZW用P21倔P2.2/A10P2.3/A11P2.仙2P2.5/A13P2.6/A14P2.7/A15

P3.Q/RXDP3.i™P3.24NTO

丽T

P3J/Ttl

P3.S/ri

P3.梅

33

21

26

2B

图2.9单片机最小系统电路

单片机最小系统电路主要包含两个部分,一个是由电阻电容组成的上电复位

电路,让单片机在上电时先复位一下,再继续工作,另外一部分是由无源晶振和

瓷片电容组成的时钟电路,为单片机提供工作时的必要的时钟信号。

3测试

实验的结果测试如图所示在AO电压为5V时,电机转速为235

LUJ1

AO5.0Mni3.Wfl:

l.2yft34,2v

2E5SS3EaB

KjXuh^

P2.1(15P2.M1DPJ.甜M

FT-SrtliaPdiStM电PJFW5

+12*•

...

'J

卜:

:

:

:

:

丿血■

."xvn.

AI

PDOA^kDOPfJUOkpl

PfKAUM旳珈

P3[W™Pa.lOJE.

PlJfTDpijwnpjyraP5EJTIPt卽亜

P3TJITD-

*

■S

只3..

4He■-

.■IJ2--

Ih-

辭:

1k,

图3・1在A0电压为

5V时电机的转速

 

 

如图3.2在A0通道电压为3V时电机的转速为205

rCDT

LMDieC

■•二T*:

・i;•

■+12V

021.2uA34.2u

3.

•53060

盟建岀b?

5aLiM州T□8u>5ZeLUoaooooao

JJ3A

咖wmPD.1fAC1PO.lffltJPDJ网3呻4『皿4PDjsrrtoaPDBfACEPC.皿?

P2jQfAB

P2.irAgP32M.-H1旳咖1PHA1?

PJglSP3盼14P?

™i5

P30RW?

PS.IJTffiPjjirjBQP33ywi1

PJ4/T0

P35ni

P3je陛即丽

■Jg

■■35

■jq

■33

■32

■K

■7j

■21

d.

■2i

R

R3

IE

Ch

巧V

R5

ia-|:

T&:

'T-

RESP^JCM-.^.■iL'b..

A...

-RP1

Lii'

吊LfJAC'cri

y=ejD95ie

co

AV=4.92X!

S

:

U2

i6・

9・

SCL&ND3&AAJMl

AJN2

AD&N3

D?

-

■+5V

图3.2在AO电压为3V时电机的转速

如图3.3在A0通道电压为1.3V时,电机的转速为80.2

■+1BV-

fll

fl21.2yfl3

IE

•SEKm

.-TE-

fhnF口-

{hnrTf-

XilnL

CArtT<

Cl

iur-

T/h.1M.1

RiT

ruj_Lwi_uPD-IjADIm.aiADS刊沪TO呛屯DgW.SWK刊B*WW.JjmlM

P2AM

P2.侶

Rfa/Aio

PSf"

PJJjWI

ME臣

Rf4hA1£P2HM3

FEMMC

P1D

Pl1

P12

PI3

P2

pgsTD

Pi5

円.£iTi

pie

P3_e丽

PlJ

T帚

fl"

U1

.盂至韭走-

?

■■-R

a

0

P

■Hl/

.PJ.

+W-

■和

H5

■in

LUMSti

T1■■r

«1-■-

PfaeAjCKfl.

A...-RP1-

-U3A.

rm.

JJ1

21Z.

312.

ZH:

:

•■J77U:

•.\R打阳.lOcI1W

-L2-

Q・

SCL

*140

fibA

AIM-I

Ml

AIHZAIHl

Al

2

*0"

1k*匸

蹲.

1fcrJ

1k

[——'H

儿T

«

"■'--L

■tea

图3.3在A0通道电压为

1.3V时电机的转速

 

总结

采用PCF8591对A0-A3的四个通道模拟量的采样,并在LCD1602液晶上面显

示,

对应的值,并将A0通道采集到到值输出给D/A去控制直流电机的转速,由于D/A的驱动能力很弱,因此加上了由LM358组成的电压放大电路,和由S8050

三极管组成的电流放大电路再去驱动直流电机,通过在Protues仿真验证此方案

是合理可行的。

 

附录A:

源程序

#includevreg52.h>

//PCF8591相关定义

sbitSCL=P^O;

//时钟脉冲

sbitSDA=P2A1;

//双向输入输出数据端

#defineSCL_SETSCL=1

#defineSCL_CLRSCL=0

#defineSDA_SETSDA=1

#defineSDA_CLRSDA=0

#defineAddWr0x90

//写数据地址

#defineAddRd0x91

//读数据地址

#defineadCon0x40

//AD控制字节

//LCD1602相关定义

sbitRS=P2A6;

sbitRW=P2A5;

sbitE=P2八7;

#definesetRSRS=1

#defineclrRSRS=0

#definesetRWRW=1

#defineclrRWRW=0

#definesetEE=1

#defineclrEE=0

unsignedinttime=0;

unsignedcharADFlag=0;

unsignedcharstr[8]="Ain.mv";

//延时1US

voiddelay(unsignedintent)

 

while(--cnt);

//延时IMS

voiddelayms(unsignedinttime)

unsignedinti;

for(i=0;i

delay(120);

II写数据,PO

voidwriteData(unsignedcharData)

setRS;

clrRW;

delay

(1);

setE;

delay

(1);

P0=Data;

delay(5);

clrE;

II写命令,PO

voidwriteCom(unsignedcharCom)

clrRS;

clrRW;

delay

(1);

setE;

delay

(1);

P0=Com;

delay(5);

clrE;

//清屏函数

voidclear_scr(void)

writeCom(OxOI);

delayms(5);

II写一个字符串在(X,Y)位置

//第一行

voiddisStr(unsignedcharx,unsignedchary,unsignedchar*str)

if(y==0)writeCom(0x80+x);

 

elsewriteCom(0xc0+x);

//第二行

 

 

while(*str)

writeData(*str);

sM++;

//LCD1602初始化

//显示模式设置

//显示关闭

voidlcdInitial()

writeCom(0x38);

delayms(5);

writeCom(0x08);

 

clear_scr();

//清屏

writeCom(0x06);

//显示光标移动设置

delayms(5);

writeCom(OxOC);

//显示开及光标设置

voidstart()

SDA_SET;

delay

(1);

SCL_SET;

delay(5);

SDA_CLR;

voidstop()

SDA_CLR;

delay

(1);

SCL_SET;

delay(5);

SDA_SET;

voidack()

SDA_CLR;

SCL_SET;

delay

(1);

SCL_CLR;

 

voidnoAck()

SDA_SET;

SCL_SET;

delay

(1);

SCL_CLR;

voidsend(unsignedcharData)

unsignedchari=0;

unsignedchartemp=0;

temp=Data;

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

SCL_CLR;

delay

(1);

if(temp&0x80)SDA_SET;

elseSDA_CLR;

delay

(1);

SCL_SET;

delay

(1);

tempv<=1;

SCL_CLR;

unsignedcharrecive()

unsignedchari=0;

//必须设置

unsignedchartemp=O;

SDA_SET;

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

 

SCL_CLR;

//拉低允许数据改变

delay

(1);

 

 

SCL_SET;

//拉高保持数据,等待读走

 

delay

(2);

if(SDA)temp|=0x01;

elsetemp&=0xfe;

if(i<7)tempv<=1;

//最低位发送完成不能移位,否则出错

 

 

SCL_CLR;

returntemp;

unsignedcharread(unsignedcharch)

unsignedchartemp=0;

start();

//确认芯片

send(AddWr);

ack();

//确认通道

send(adCon|ch);

ack();

〃读出数据,放进temp

start();

send(AddRd);

ack();

temp=reciveO;

noAck();

stop();

returntemp;

voidDAC(unsignedcharlight)

start();

send(AddWr);

ack();

 

send(0x40);

II写入控制位,使能DAC输出

 

 

ack();

send(light);

ack();

stop();

voiddis(unsignedchar*date)

floatj;

unsignedintk;

unsignedchari=0;

unsignedcharch1,ch2,ch3;

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

j=date[i]*10/51;

k=(int)j;

ch1=i+48;

str[1]=ch1;

ch2=k/10+48;

str[3]=ch2;

ch3=k%10+48;

stq5]=ch3;

if(i>1)disStr(i*8-16,1,str);

elsedisStr(i*8,0,

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

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1