基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx

上传人:b****1 文档编号:23252094 上传时间:2023-05-15 格式:DOCX 页数:31 大小:1.03MB
下载 相关 举报
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx_第1页
第1页 / 共31页
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx_第2页
第2页 / 共31页
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx_第3页
第3页 / 共31页
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx_第4页
第4页 / 共31页
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx

《基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx》由会员分享,可在线阅读,更多相关《基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。

基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx

基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现

成绩

指导教师

日期

张歆奕

2013-11-28

五邑大学实验报告

 

实验课程名称:

SOPC技术

 

院系名称:

信息工程学院

专业名称:

电子信息工程

实验名称:

基于nios的PCF8591

控制器设计与实现

班级学号:

报告人:

 

实验三基于nios的PCF8591控制器设计与实现

 

1、实验绪论

1、基于nios的设计特点

利用SOPCBuilder构建微处理器系统,包括NiosII以及各种外设的添加和配置。

利用IDE针对构建的硬件系建项目,编写应用程序。

利用HAL库等,程序设计与底层硬件无关。

NiosII系列软核处理器是Altera的第二代FPGA嵌入式处理器,其性能超过200DMIPS,在AlteraFPGA中实现仅需35美分。

Altera的Stratix、StratixGX、StratixII和Cyclone系列FPGA全面支持NiosII处理器,以后推出的FPGA器件也将支持NiosII。

用户指令开发人员可以在NiosⅡCPU核内增加硬件,用以执行复杂运算任务,为时序要求紧张的软件提供加速算法。

Altera的第二代32位软核RISC微处理器,NiosII以及所有外设以HDL源代码的方式提供,可用于所有的AlteraFPGA使用QuartusII集成综合工具进行综合。

2、基于nios的PCF8591控制器的设计内容和设计任务

(1)、设计任务

用VerilogHDL设计PCF8591控制器,带AVALON_MM接口和I2C接口,可用C控制DA和AD工作,并可控制其速率;用SOPCBuilder的组件编辑器把控制器加入为自定义组件;创建硬件工程和软件工程,编写C程序,采样模拟输入电压(0-5V),AD后送到LCD屏显示,并送到DA输出;创建硬件工程和软件工程,编写C程序,把0-255的数据发送到DA输出,观测Aout。

(2)、设计内容

PCF8591的复位状态,Addressbyte及其作用,Controlbyte及其作用,DAC的启动及其时序,ADC的启动及其时序,内部振荡器的设置与作用,ADC采样频率的控制,DAC速率的控制。

2、PCF8591的简介

1、PCF8591的功能与特点

PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。

PCF8591的最大转化速率由I²C总线的最大速率决定。

PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。

PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。

PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I²C总线上接入8个PCF8591器件,而无需额外的硬件。

在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I²C总线以串行的方式进行传输。

PCF8591的操作电压范围2.5V-6V,单独供电。

低待机电流,通过I²C总线串行输入/输出,PCF8591通过3个硬件地址引脚寻址,PCF8591的采样率由I²C总线速率决定,4个模拟输入可编程为单端型或差分输入,能自动增量频道选择PCF8591的模拟,电压范围从VSS到VDD,PCF8591内置跟踪保持电路,PCF8591有8-bit逐次逼近A/D转换器。

2、PCF8591的内部框图接口

PCF8591内部框图接口

PCF8591引脚及接口图

3、PCF8591的时序要求

PCF8591的DA控制时序图

PCF8591的AD控制时序图

基于I2C的Bit传输

基于I2C的Startbit

三、PCF8591控制器的HDL设计

1、控制器的HDL设计与说明

根据PCF8591芯片介绍与ADDA原理图连接,如图所示:

控制器的HDL顶层设计图

2、控制器的HDL设计波形仿真图

控制器的HDL设计波形仿真图

4、基于nios的ADDA系统

1、控制器设为自定义组件

根据原理图及芯片的连接,将控制器设为自定义组件。

点击tools->sopcbuilder,打开SOPCBuilder;如图;

添加on-chipmemory,指定为rom,datawidth为32,memorysize为2K,其它采用默认值,如图;在SOPCBuilder中改名为on-chipmemory.

添加on-chipmemory,指定为ram,datawidth为32,memorysize为1K,其它采用默认值,如图;

添加niosprocessor,选定niosII/s内核,resetvector为on-chipmemory;exceptionvector为on-chipmemory;如图;

点击next,指定instructioncache为2KB;

点击next三次,到图5界面,指定JTAGDebugmode为level1;然后点击finish,完成niosprocessor的添加。

添加systemID内核,采用全部默认值,如图:

回到QII,双击原理图编辑器工作区,找到软核的框图,调入工作区,并与输入输出连接,如图;

2、nios系统框图

顶层设计图

3、设计的C程序及说明

(1)、AD三通道实验程序

#include

#include

#defineAddWr0x90//写数据地址

#defineAddRd0x91//读数据地址

codeunsignedchartable[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//表:

共阳数码管0-9

unsignedcharl_posit=0;//显示位置

externbitack;

//引脚定义:

sbitkey1=P3^7;//定义按键1

sbitkey2=P3^6;//定义按键2

sbitkey3=P3^5;//定义按键3

sbitkey4=P3^4;//定义按键4

sbitkey5=P3^3;//定义按键5

sbitkey6=P3^2;//定义按键6

sbitSMG_q=P1^0;//定义数码管阳级控制脚(千位)

sbitSMG_b=P1^1;//定义数码管阳级控制脚(百位)

sbitSMG_s=P1^2;//定义数码管阳级控制脚(十位)

sbitSMG_g=P1^3;//定义数码管阳级控制脚(个位)

//函数声明:

voiddisplay(unsignedintda);//定义显示函数,参数为显示内容

voiddelay(unsignedinttimer);

unsignedcharReadADC(unsignedcharChl);//从ADC通道读数据

voidmain()

{

unsignedcharCHX=1;//作为通道选择

while

(1){

if(key1==0)//按键1按下,选择通道0,即光敏电阻实验

CHX=0;

if(key2==0)//按键2按下,选择通道1,即热感电阻实验

CHX=1;

if(key3==0)//按键3按下,选择通道2,板子未连接设备,可连接外围设备

CHX=2;

if(key4==0)//按键4按下,选择通道3,即电位器调节实验

CHX=3;

//if(key5==0){//按键5按下,

//}

//if(key6==0){//按键6按下,

//}

display((unsignedint)ReadADC(CHX));//显示变量内容

delay(100);

}

}

voiddisplay(unsignedintda)

{

P0=0XFF;//

da=da%10000;

switch(l_posit){

case0:

//选择千位数码管,关闭其它位

SMG_q=0;

SMG_b=1;

SMG_s=1;

SMG_g=1;

P0=table[da/1000];//输出显示内容

break;

case1:

//选择百位数码管,关闭其它位

SMG_q=1;

SMG_b=0;

SMG_s=1;

SMG_g=1;

P0=table[da%1000/100];

break;

case2:

//选择十位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=0;

SMG_g=1;

P0=table[da%100/10];

break;

case3:

//选择个位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=1;

SMG_g=0;

P0=table[da%10];

break;

}

l_posit++;//每调用一次将轮流显示一位

if(l_posit>3)

l_posit=0;

}

voiddelay(unsignedinttimer){

while(timer--);

}

unsignedcharReadADC(unsignedcharChl)

{

unsignedcharVal;

IIC_start();//启动总线

IIC_write(AddWr);//发送器件地址

if(ack==0)

return(0);

IIC_write(0x40|Chl);//发送器件子地址

if(ack==0)

return(0);

IIC_start();

IIC_write(AddRd);

if(ack==0)

return(0);

Val=IIC_read();

IIC_ACK

(1);//发送非应位

IIC_stop();//结束总线

return(Val);

}

DA输出程序

#include

#include

#defineAddWr0x90//写数据地址

#defineAddRd0x91//读数据地址

//变量定义:

codeunsignedchartable[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//表:

共阳数码管0-9

unsignedcharl_posit=0;//显示位置

externbitack;

//引脚定义:

sbitkey1=P3^7;//定义按键1

sbitkey2=P3^6;//定义按键2

sbitkey3=P3^5;//定义按键3

sbitkey4=P3^4;//定义按键4

sbitkey5=P3^3;//定义按键5

sbitkey6=P3^2;//定义按键6

sbitSMG_q=P1^0;//定义数码管阳级控制脚(千位)

sbitSMG_b=P1^1;//定义数码管阳级控制脚(百位)

sbitSMG_s=P1^2;//定义数码管阳级控制脚(十位)

sbitSMG_g=P1^3;//定义数码管阳级控制脚(个位)

//函数声明:

voiddisplay(unsignedintda);//定义显示函数,参数为显示内容

voiddelay(unsignedinttimer);

unsignedcharReadADC(unsignedcharChl);//从ADC通道读数据

bitWriteDAC(unsignedchardat);//往DAC通道写数据转换

//主函数,C语言的入口函数:

voidmain()

{

unsignedcharDAT=150;//数据输出,LED灯亮度变化在150左右值为最佳效果

while

(1){

if(key1==0){//按键1按下,数据加1,并输出转换

DAT++;

WriteDAC(DAT);

while(key1==0);//等待按钮释放

}

if(key2==0){//按键2按下,数据减1,并输出转换

DAT--;

WriteDAC(DAT);

while(key2==0);

}

//if(key3==0){//按键3按下,

//}

//if(key4==0){//按键4按下,

//}

//if(key5==0){//按键5按下,

//}

//if(key6==0){//按键6按下,

//}

display(DAT);//显示变量内容

delay(100);

}

}

//显示函数,参数为显示内容

voiddisplay(unsignedintda)

{

P0=0XFF;//

da=da%10000;

switch(l_posit){

case0:

//选择千位数码管,关闭其它位

SMG_q=0;

SMG_b=1;

SMG_s=1;

SMG_g=1;

P0=table[da/1000];//输出显示内容

break;

case1:

//选择百位数码管,关闭其它位

SMG_q=1;

SMG_b=0;

SMG_s=1;

SMG_g=1;

P0=table[da%1000/100];

break;

case2:

//选择十位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=0;

SMG_g=1;

P0=table[da%100/10];

break;

case3:

//选择个位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=1;

SMG_g=0;

P0=table[da%10];

break;

}

l_posit++;//每调用一次将轮流显示一位

if(l_posit>3)

l_posit=0;

}

//延时子函数,短暂延时

voiddelay(unsignedinttimer){

while(timer--);

}

//读AD转值程序输入参数Chl表示需要转换的通道,范围从0-3返回值范围0-255

unsignedcharReadADC(unsignedcharChl)

{

unsignedcharVal;

IIC_start();//启动总线

IIC_write(AddWr);//发送器件地址

if(ack==0)

return(0);

IIC_write(0x40|Chl);//发送器件子地址

if(ack==0)

return(0);

IIC_start();

IIC_write(AddRd);

if(ack==0)

return(0);

Val=IIC_read();

IIC_ACK

(1);//发送非应位

IIC_stop();//结束总线

return(Val);

}

bitWriteDAC(unsignedchardat)

{

IIC_start();//启动总线

IIC_write(AddWr);//发送器件地址

if(ack==0)

return(0);

IIC_write(0x40);//发送器件子地址

if(ack==0)

return(0);

IIC_write(dat);//发送数据

if(ack==0)

return(0);

IIC_stop();

}

DA波形输出

#include

#include

#defineAddWr0x90//写数据地址

#defineAddRd0x91//读数据地址

//变量定义:

codeunsignedchartable[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//表:

共阳数码管0-9

unsignedcharl_posit=0;//显示位置

externbitack;

//引脚定义:

sbitkey1=P3^7;//定义按键1

sbitkey2=P3^6;//定义按键2

sbitkey3=P3^5;//定义按键3

sbitkey4=P3^4;//定义按键4

sbitkey5=P3^3;//定义按键5

sbitkey6=P3^2;//定义按键6

sbitSMG_q=P1^0;//定义数码管阳级控制脚(千位)

sbitSMG_b=P1^1;//定义数码管阳级控制脚(百位)

sbitSMG_s=P1^2;//定义数码管阳级控制脚(十位)

sbitSMG_g=P1^3;//定义数码管阳级控制脚(个位)

//函数声明:

voiddisplay(unsignedintda);//定义显示函数,参数为显示内容

voiddelay(unsignedinttimer);

unsignedcharReadADC(unsignedcharChl);//从ADC通道读数据

bitWriteDAC(unsignedchardat);//往DAC通道写数据转换

//主函数,C语言的入口函数:

voidmain()

{

unsignedcharDAT=150;//数据输出

while

(1){

if(key1==0){//按键1按下,方波处理,LED灯保持一个亮度

while(key6){//长按6键退出

WriteDAC(0);

delay(500);

WriteDAC(250);

delay(500);

}

}

if(key2==0){//按键2按下,锯齿波处理,LED灯从暗到亮变化

while(key6){//长按6键退出

for(DAT=0;DAT<255;DAT++){

WriteDAC(DAT);

delay(500);

}

}

}

if(key3==0){//按键3按下,三角波处理,LED灯从暗到亮再从亮到暗变化

while(key6){//长按6键退出

for(DAT=0;DAT<255;DAT++){

WriteDAC(DAT);

delay(500);

}

for(DAT=255;DAT>0;DAT--){

WriteDAC(DAT);

delay(500);

}

}

}

//if(key4==0){//按键4按下,

//}

//if(key5==0){//按键5按下,

//}

//if(key6==0){//按键6按下,

//}

display(0);//数码管显示0000表示退出状态

delay(100);

}

}

//显示函数,参数为显示内容

voiddisplay(unsignedintda)

{

P0=0XFF;//

da=da%10000;

switch(l_posit){

case0:

//选择千位数码管,关闭其它位

SMG_q=0;

SMG_b=1;

SMG_s=1;

SMG_g=1;

P0=table[da/1000];//输出显示内容

break;

case1:

//选择百位数码管,关闭其它位

SMG_q=1;

SMG_b=0;

SMG_s=1;

SMG_g=1;

P0=table[da%1000/100];

break;

case2:

//选择十位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=0;

SMG_g=1;

P0=table[da%100/10];

break;

case3:

//选择个位数码管,关闭其它位

SMG_q=1;

SMG_b=1;

SMG_s=1;

SMG_g=0;

P0=table[da%10];

break;

}

l_posit++;//每调用一次将轮流显示一位

if(l_posit>3)

l_posit=0;

}

//延时子函数,短暂延时

voiddelay(unsignedinttimer){

while(timer--);

}

//读AD转值程序输入参数Chl表示需要转换的通道,范围从0-3返回值范围0-255

unsignedcharReadADC(unsignedcharChl)

{

unsignedcharVal;

IIC_start();//启动总线

IIC_write(AddWr);//发送器件地址

if(ack==0)

return(0);

IIC_write(0x40|Chl);//发送器件子地址

if(ack==0)

return(0);

IIC_start();

IIC_write(AddRd);

if(ack==0)

return(0);

Val=IIC_read();

IIC_ACK

(1);//发送非应位

IIC_stop();//结束总线

return(Val);

}

//往DAC通道写数据转换

bitWriteDAC(unsignedchardat)

{

IIC_start();//启动总线

IIC_write(AddWr);//发送器件地址

if(ack==0)

return(0);

IIC_write(0x40);//发送器件子地址

if(ack==0)

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

当前位置:首页 > 总结汇报 > 学习总结

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

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