基于ICE40UP5K的电压显示器
主要实现项目1 - 利用ADC制作一个数字电压表 旋转电位计可以产生0-3.3V的电压 , 利用板上的串行ADC对电压进行转换 将电压值在板上的OLED屏幕上显示出来
标签
FPGA
OLED
电压表
2022寒假在家练
xinshuwei
更新2022-03-03
南昌大学
937

                                       利用ADC制作一个数字电压表

实现功能如下:
1.旋转电位计可以产生0-3.3V的电压

2.利用板上的串行ADC对电压进行转换

3.将电压值在板上的OLED屏幕上显示出来。

 

串行ADC 这个第一次接触,学习了一下,感觉这个性价比很高,只需通过便宜的比较器就能实现ADC采集,大大降低了硬件成本

串行ADC 采集原理如下

Fjpt80AWXQeFkMNVTiR3qax476qc

   1)FPGA 输出 PWM 高速反馈信号,通过RC 滤波与模拟输入通过高速比较器进行比较

   2)FPGA 进行采样、滤波后进行数字输出 

 

Foi6xOq5wlc1xqNRxzE05FcSoLcX

      这里采集的的电压范围为0-3.3V  

实现框图如下 

Fkv-xgv6uocsTtdnyt_JMjOEcBbd

这里主要使用了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

整体软件框图如下 

FrHKxiMDOiLdTBpD0ihOSkr1IKil

软件资源占用如下

FkzWNHSG64ekIzAt5K_IfFnKBmjA

 

5.总结

  此次项目学习了sigmadelta_adc 的实现,在后续工程项目中可作为引用,感谢老师、同学的指导,学习了很多东西,希望多举办这样的活动

实际效果 FupcbTrwKysF-qeHItx8QMU7mH_i

软硬件
元器件
ICE40UP5K
超低功耗FPGA、5280 LUTs, 1024kbit SPRAM,1.2V、48-pin QFN (7 x 7 mm)
附件下载
ssd_adc.zip
团队介绍
苏州嵌入式攻城狮一枚
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号