ADC0804实验
实 验 报 告
实验名称: [ADC0804实验]
姓 名:
学 号:
指导教师:
实验时间: [2013年6月15日]
信息与通信工程学院
ADC0804实验
1.实验任务
AD0804 是 A/D 转换器。从ADC0804的通道IN输入0~5V之间的模拟量,转换成数字量在数码管上以十进制显示出来。
任务 1:将数码管中的显示数字对应单位“V”的位置加上小数点,使原来以“mV”
为单位的输出转变为以“V”为单位。
任务2:在任务1的基础上,将AD0804的8位2进制输出用点阵中的一列反映
出来,点阵的亮暗代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
该位为1或者0。
2.实验原理
2.1 ADC0804原理
ADC0804是8位全MOS中速逐次逼近式A/D转换器,片内有三态数据输出锁存器,可以和单片机直接接口。单通道输入,转换时间大约100us。ADC0804转换时序是:当CS=0许可进行A/D转换。WR由低到高时,A/D开始转换,一次转换共需要66-73个时钟周期。CS与WR同时有效时启动A/D转换,转换结束产生INTR信号(低电平有效),可供查询或者中断信号。在CS和RD的控制下可以读取数据结果。
ADC0804 为一只具有20引脚8位CMOS 连续近似的A/D 转换器, 其规格如下:
(1) 高阻抗状态输出
(2) 分辨率:8 位(0~255)
(3) 存取时间:135 ms
(4) 转换时间:100 ms
(5) 总误差:-1~+1LSB
(6) 工作温度:ADC0804C为0度~70度;ADC0804L为-40 度~85 度
(7) 模拟输入电压范围:0V~5V
(8) 参考电压:2.5V
(9) 工作电压:5V
(10) 输出为三态结构
1. 接脚说明见图1:
2. PIN1 (CS ):Chip Select,与RD、WR 接脚的输入电压高低一起判断读取或写入与否,当其为低位准(low) 时会active。
3. PIN2 ( RD ):Read。当CS 、RD 皆为低位准(low) 时,ADC0804 会将转换后的数字讯号经由DB7 ~ DB0 输出至其它处理单元。
4. PIN3 (WR ):启动转换的控制讯号。当CS 、WR 皆为低位准(low) 时ADC0804 做清除的动作,系统重置。当WR 由0?1且CS ,0 时,ADC0804会开始转换信
号,此时INTR 设定为高位准(high)。
5. PIN4、PIN19 (CLK IN、CLKR):频率输入/输出。频率输入可连接处理单元的讯号频率范围为100 kHz 至800 kHz。而频率输出频率最大值无法大于640KHz,一般可选用外部或内部来提供频率。若在CLK R 及CLK IN 加上电阻及电容,则可产生ADC 工作所需的时序,其频率约为:
6. PIN5 ( INTR ):中断请求。转换期间为高位准(high),等到转换完毕时INTR 会变为低位准(low)告知其它的处理单元已转换完成,可读取数字数据。 7. PIN6、PIN7 (V(+)、V(-)):差动模拟讯号的输入端。 ININ
输入电压V,V(+),V(-),通常使用单端输入,而将V(-)接地。 ININININ8. PIN8 (A GND):模拟电压的接地端。
9. PIN9 (V?2)?模拟参考电压输入端。VREF 为模拟输入电压VIN 的上限值。REF
若PIN9空接,则VIN 的上限值即为VCC。
10. PIN10 (D GND)?数字电压的接地端。
11. PIN11 ~ PIN18 (DB7 ~ DB0)?转换后之数字数据输出端。 12. PIN20 (Vcc)?驱动电压输入端。
图1.ADC0804引脚图
2.2 本实验原理
ADC0804的输入模拟电压用一个滑动变阻器对电源分压得到,它的8位输出AD0~AD7与FPGA的8个管脚相连,即input [7:0] data。而data就是数码管的动态显示数据。通过循环扫描,使数码管正确的显示出data的十进制数形式。
图2.ADC0804与FPGA连接图
3(实验程序
3.1任务1程序
要想在数码管上从右往左数第4位显示小数点,可以用变量“jishu”的状态作为判断条件,当seg_com选中第4位时,jishu=3'b100,所以我在程序中增加了下面一段用来显示小数点:
if(jishu==3'b100)
begin
case(shuju)
4'b0000:seg_data=8'b01000000;//0.
4'b0001:seg_data=8'b01111001;//1.
4'b0010:seg_data=8'b00100100;//2.
4'b0011:seg_data=8'b00110000;//3.
4'b0100:seg_data=8'b00011001;//4.
4'b0101:seg_data=8'b00010010;//5.
4'b0110:seg_data=8'b00000010;//6.
4'b0111:seg_data=8'b01111000;//7.
4'b1000:seg_data=8'b00000000;//8.
4'b1001:seg_data=8'b00010000;//9.
default: seg_data=8'b01111111;
endcase
3.2任务2程序
为了控制一列点阵,首先应该对FPGA试验箱中的几个复用端定义为输出并赋予合适的值。试验箱中点阵部分的连接图如下图:
图3.点阵与FPGA连接图 因此任务2在任务1的基础上在程序中增加下列指令: /*****fuyong
assign SEL[0]=0;
assign SEL[1]=1;
assign SEL[2]=0;
assign LL=0;
/***** 点阵的控制端!!
output [7:0] X;
assign X=data_led; 4.管脚分配
任务2管脚(任务1的管脚包括在任务2中)
图4.ADC0804管脚分配图
5.实验结果
5.1任务1结果
顺时针旋转滑动变阻器旋钮,数码管显示由4.980变换到0.000。逆时针旋转则逐渐由小变大。
5.2任务2 结果
当数码管显示的输出值为0.000时,点阵中左上方第一列全暗,随着数码管显示值的增加,点阵的那列从上到下依次表示ADC0804的输出AD0~AD7,所以点阵上半部分变化比较灵敏。当码管显示值为4.980时,点阵全亮。之所以数码管不能显示5.000,是因为公式(vo=5*data_led*1000/256)中data_led最大值只能是255。
6.实验心得
通过本次实验,加深了对分频模块的理解与应用.在实验中,分频的作用是非常大的,只有稳定的频率,才能够使得各个芯片和期间正常工作,只有真正的了解分频的原理和方法,才可以独立展开程序的读和写.
此外我还学习到了8位数码管的动态显示方法。本次实验中,通过上课加小数点的练习,加深了我对动态显示的理解和灵活应用。
通过实验,在课下准备与课上练习中,我的编程和逻辑能力进一步得到了锻炼和提高。
附录
任务2程序:
module jia0804(clkin, reg clkout; //becom zhongjian variable
data, reg clkout2; //提供显示数据时钟
seg_com,seg_data, reg [3:0] state = state_pre;
adcs,rd,wr, reg[7:0] jishu;
,SEL,X,LL); reg[3:0] shuju; //add.......+dianzhen program reg[31:0] vo;
input clkin; //时钟输入50MHZ //******分频
input [7:0] data; always @(posedge clkin)
begin output reg[7:0] seg_com; //位选
output reg[7:0] seg_data; //段选 if(DCLK_DIV < (CLK_FREQ / output reg rd,wr; CLK_out_FREQ)) output wire adcs; DCLK_DIV <= DCLK_DIV+1'b1; output [2:0] SEL; else
output [7:0] X; begin
output [5:1] LL; DCLK_DIV <= 0; parameter CLK_FREQ = 'D50_000_000; //系 clkout <= ~clkout; 统时钟50MHZ end
parameter CLK_out_FREQ = 'D5000; //输end
出时钟 'D500_000;
parameter CLK_out_FREQ2 = 'D50000; //输always @(posedge clkin) 出时钟$$$ gaiya begin
if(DCLK_DIV2 < (CLK_FREQ / parameter state_pre = 0; CLK_out_FREQ2)) parameter state_pre2 = 1; DCLK_DIV2 <= DCLK_DIV2+1'b1; parameter state_start = 2; else
parameter state_conv = 3; begin
parameter state_wait = 4; if(clkout2==1) parameter state_readpre = 5; begin
parameter state_read = 6; if(jishu<7)
jishu=jishu+1; reg [7:0] data_led; //LED显示数据 else jishu=0; reg [31:0] DCLK_DIV; end
reg[31:0] DCLK_DIV2; DCLK_DIV2 <= 0;
clkout2 <= ~clkout2; end
end else
end begin
//*******数码管显示 case(shuju)
always @(posedge clkout2) 4'b0000:seg_data=8'b11000000;//0 begin 4'b0001:seg_data=8'b11111001;//1
vo=5*data_led*1000/256; 4'b0010:seg_data=8'b10100100;//2
case(jishu) 4'b0011:seg_data=8'b10110000;//3
4'b0100:seg_data=8'b10011001;//4
3'b100:shuju=(vo)/1000; 4'b0101:seg_data=8'b10010010;//5
3'b101:shuju=((vo)%1000)/100; 4'b0110:seg_data=8'b10000010;//6
4'b0111:seg_data=8'b11111000;//7
3'b110:shuju=(((vo)%1000)%100)/10; 4'b1000:seg_data=8'b10000000;//8
4'b1001:seg_data=8'b10010000;//9
3'b111:shuju=(((vo)%1000)%100)%10; default: seg_data=8'b11111111;
default:shuju=4'b0000; endcase
endcase end
case(jishu)
3'b000: seg_com=8'b00000001; end
3'b001: seg_com=8'b00000010;
3'b010: seg_com=8'b00000100; //********led zhen
3'b011: seg_com=8'b00001000; assign X=data_led;
3'b100: seg_com=8'b00010000; //********ADC0804时序
3'b101: seg_com=8'b00100000; assign adcs=0;
3'b110: seg_com=8'b01000000; always @ (negedge clkout)
3'b111: seg_com=8'b10000000; begin
//default: out=6'b00000; case (state)
endcase state_pre : //0
if(jishu==3'b100)//if gaowei,add a begin
point wr<=0;
begin rd<=1;
case(shuju) state <=state_pre2;
4'b0000:seg_data=8'b01000000;//0. end
4'b0001:seg_data=8'b01111001;//1. state_pre2 : //1
4'b0010:seg_data=8'b00100100;//2. begin
4'b0011:seg_data=8'b00110000;//3. wr<=1;
4'b0100:seg_data=8'b00011001;//4. rd<=1;
4'b0101:seg_data=8'b00010010;//5. state <=state_start;
4'b0110:seg_data=8'b00000010;//6. end
4'b0111:seg_data=8'b01111000;//7. state_start ://2
4'b1000:seg_data=8'b00000000;//8. begin
4'b1001:seg_data=8'b00010000;//9. wr<=1;
default: seg_data=8'b01111111; rd<=0;
endcase state <=state_conv;
end state <= state_pre; //重新回到状
state_conv : //3 态1 进行下一次AD转换
end
begin endcase
data_led = data; //开始读数据 end
state <=state_wait; //*******fuyong
end assign SEL[0]=0;
state_wait : //4 assign SEL[1]=1;
begin assign SEL[2]=0;
wr<=1; assign LL=0;
rd<=1; endmodule