名称:体脂秤(压力传感器和HX711)设计Verilog代码Quartus仿真
软件:Quartus
语言:Verilog
代码功能:
基于FPGA的体脂秤设计(压力传感器和HX711)
研究思路和方法:
整体方案基于BMI法计算得出体脂。相比于传统的四电极方法,由于使用者要赤脚并且双脚同时站在四个电极上,由于使用者用餐前后身体内水分会有变化,从而导致导电性有所差异,会导致体脂测量出现误差,出现同一天内,测量结果不一致的情况,且考虑到赤脚测量带来局限性,不能更方便的随时随地检测,本设计决定将国际通用被认可的BMI 值计算公式写入设计,可以得到具有参考价值的身体健康指数。
本设计采用FPGA作为主控芯片;利用四片 50kg 量程的传感器串接成 200kg 量程的压力传感器与一片 HX711 芯片组成人体体重测量模块;使用矩阵键盘实现按键输入身高以及控制模式切换的功能;采用LCD1602显示模块显示相应的体重以及体脂等数据;使用EEPROM储存之前所测的体重以及体脂数据。
通过hx711测人体体重,矩阵键盘设置身高,按下按键15确定,计算得出体脂
按下按键12体重秤清零
按下按键13进行体重储存,按下按键14读出上次的体重数据
清单:
FPGA最小系统
4个50kg压力传感器
HX711模块
矩阵键盘
EEPROM
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
顶层模块
e2prom_rw模块
hx_711模块
i2c_dri模块
Keypad模块
Oled模块
pLL模块
部分代码展示:
module fpga_body_scale( inputsys_clk_1, inputkey, outputoled_scl, inoutoled_sda, inputhx711_out, outputpd_clk, output eeprom_scl, inout eeprom_sda, outputregled, outputreg[1:0]yu_out, input [3:0] key_row , output[3:0] key_col ); parameter SLAVE_ADDR = 7'b1010000 ; //器件地址(SLAVE_ADDR) parameter BIT_CTRL = 1'b1 ; //字地址位控制参数(16b/8b) parameter CLK_FREQ = 26'd50_000; //i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FREQ = 18'd250 ; //I2C的SCL时钟频率 reg[3:0]code[2:0]; reg[3:0]yuzhi[2:0]; reg[2:0]code_num; wire dht11_done; wire[7:0] tempH; wire[15:0] tempL; wire[7:0] humidityH; wire[7:0] humidityL; wire[3:0]key_value;//按键值 wirekey_flag;//按键按下的标志位 wire dri_clk ; //I2C操作时钟 wire i2c_exec ; //I2C触发控制 wire [15:0] i2c_addr ; //I2C操作地址 wire [ 7:0] i2c_data_w; //I2C写入的数据 wire i2c_done ; //I2C操作结束标志 wire i2c_ack ; //I2C应答标志 0:应答 1:未应答 wire i2c_rh_wl ; //I2C读写控制 wire [ 7:0] i2c_data_r; //I2C读出的数据 wire rw_done ; //E2PROM读写测试完成 wire [ 7:0] rw_result ; wire [23:0] weight; wirelocked; wiresys_clk; regsys_rst_n; reg [3:0]rst_cnt; assign dht11_done = 1'b1; assign tempH = 8'd73; assign tempL = weight[7:0]/((yuzhi[0]*100 + yuzhi[1]*10 + yuzhi[2])*(yuzhi[0]*100 + yuzhi[1]*10 + yuzhi[2])/10000); assign humidityH = 8'd178; always @(posedge sys_clk_1 ) begin if(locked == 1'b0) rst_cnt <= 4'd0; else if(key == 1'b0) rst_cnt <= 4'd0; else if(rst_cnt==4'd10) rst_cnt <= 4'd10; else rst_cnt <= rst_cnt + 1'b1; end always @ (posedge sys_clk_1)begin if(rst_cnt<4'd10) sys_rst_n <= 1'b0; else sys_rst_n <= 1'b1; end
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1131
1321