基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx
- 文档编号:23252094
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:31
- 大小:1.03MB
基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx
《基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx》由会员分享,可在线阅读,更多相关《基于PCF8591ADDA转换基于nios的PCF8591控制器设计与实现.docx(31页珍藏版)》请在冰豆网上搜索。
基于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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于PCF8591ADDA转换 基于nios的PCF8591 控制器设计与实现 基于 PCF8591ADDA 转换 nios PCF8591 控制器 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)