内容介绍
内容介绍
利用ADC制作一个数字电压表
实现功能如下:
1.旋转电位计可以产生0-3.3V的电压
2.利用板上的串行ADC对电压进行转换
3.将电压值在板上的OLED屏幕上显示出来。
串行ADC 这个第一次接触,学习了一下,感觉这个性价比很高,只需通过便宜的比较器就能实现ADC采集,大大降低了硬件成本
串行ADC 采集原理如下
1)FPGA 输出 PWM 高速反馈信号,通过RC 滤波与模拟输入通过高速比较器进行比较
2)FPGA 进行采样、滤波后进行数字输出
这里采集的的电压范围为0-3.3V
实现框图如下
这里主要使用了PWM_V2 输出 及 C_OUT2输入,软件的管脚定义使用的是pin定义,反应了好久,后续将原理图进行了标注
实现过程如下:
1.例化官网代码
sigmadelta_adc sigmadelta_adc_ul (
//.clk(adc_clk1),
.clk(clk_12mhz),
.rstn(1'b1),
.digital_out(sd_adc_out),
.analog_cmp(adc_cmp),
.analog_out(adc_pwm),
.sample_rdy(sample_rdy)
);
2.采集数据转换
将采集到的sd_adc_out 数据乘以13,方便进行后续的 除以1000 进行电压转换。
assign calc_adc_out = sd_adc_out*4'b1101;
3.bin 转bcd实现
通过移位等操作实现二进制转十进制操作,转换后4bit 代表一位数据
module bin_bcd(rst_n,binary,bcd);
//rst_n为使能端,binary为待转换的二进制数,bcd为转换后的BCD码
parameter B_SIZE=12;
//B_SIZE为二进制数所占的位数,可根据需要进行扩展
input binary,rst_n;//rst_n高电平有效,低电平时bcd =0
output bcd;
wire rst_n;
wire [B_SIZE-1:0] binary;
reg [B_SIZE-1:0] bin;
reg [B_SIZE+3:0] bcd; // bcd的长度应根据实际情况进行修改
reg [B_SIZE+3:0] result; //result的长度=bcd的长度
always@(binary or rst_n)
begin
bin= binary;
result = 0;
if(rst_n == 0)
bcd <= 0;
else
begin
repeat(B_SIZE-1)//使用repeat语句进行循环计算
begin
result[0] = bin[B_SIZE-1];
if ( result[3:0] > 4 )
result[3:0]=result[3:0]+ 4'd3;
if(result[7:4]> 4)
result[7:4]=result[7:4]+4'd3;
if(result[11:8]>4)
result[11:8] = result[11:8]+4'd3;
if(result[15:12]>4)
result[15:12] = result[15:12]+4'd3;
result=result<<1;
bin=bin<<1;
end
result[0]= bin[B_SIZE-1];
bcd<=result;
end
end
endmodule
4.oled显示
oled参考基础代码,在main状态机内添加电压数据显示
最终输出的16bit 及为A.BCD,A为整数,B C D为小数(转换出来的10进制除以1000)然后通过OLED进行显示出来
5'd9 : begin y_p <= 8'hb3; x_ph <= 8'h12; x_pl <= 8'h00; num <= 5'd1; char <= volNum[15:12];state <= SCAN; end
5'd10 : begin y_p <= 8'hb3; x_ph <= 8'h13; x_pl <= 8'h00; num <= 5'd1; char <= "."; state <= SCAN; end
5'd11 : begin y_p <= 8'hb3; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd1; char <= volNum[11:8];state <= SCAN; end
5'd12 : begin y_p <= 8'hb3; x_ph <= 8'h15; x_pl <= 8'h00; num <= 5'd1; char <= volNum[7:4];state <= SCAN; end
5'd13: begin y_p <= 8'hb3; x_ph <= 8'h16; x_pl <= 8'h00; num <= 5'd1; char <= volNum[3:0] ;state <= SCAN; end
整体软件框图如下
软件资源占用如下
5.总结
此次项目学习了sigmadelta_adc 的实现,在后续工程项目中可作为引用,感谢老师、同学的指导,学习了很多东西,希望多举办这样的活动
实际效果
软硬件
元器件
附件下载
ssd_adc.zip
团队介绍
苏州嵌入式攻城狮一枚
评论
0 / 100
查看更多
猜你喜欢
基于ICE40UP5K的数字电压表设计基于2022冬寒假在家练项目,利用所提供的ICE40UP5K FPGA 学习平台,实现了测量旋转电位计电压并显示到OLED屏幕上的功能。
smallcracker
1181
基于iCE40UP5K的数字电压表在本文中,我们将使用硬禾学堂的“基于iCE40UP5K的FPGA学习平台”开发板来实现一个Σ-Δ ADC采集,并制作一个简易的数字电压表。
raincorn
1414
基于ICE40UP5K FPGA实现的数字电压表本次实验基于ICE40UP5K FPGA学习平台,结合板卡上的电压比较器编写的数字电压表,使用了Lattice官方提供的SSD ADC代码和硬禾学堂的OLED驱动程序,来完成本次实验
amirror
1519