名称:体脂秤(压力传感器和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
555