本项目使用主控stm32f103c8t6(最小系统核心板),称重模块hx711,串口打印到电脑端显示数值。
这个传感器内部是一组半桥应变片,使用方法可以有以下三种:
1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。
2、使用二只传感器组成全桥测量,量程为两只传感器的量程之和:50kgx2=100kg
3、使用四只传感器组成全桥测量,量程为四只传感器的量程之和:50kgx4=200kg
我的称重组成是4个应变片半桥传感器串联组成一个桥路,供电后输出一组模拟电压信号。
连线: 黑线连信号正 白(黄)线连信号负 红线连 电源 。这里的V+连接E+,V-连接E-,Vout+连A+,Vout-连A-;hx711的另一边vcc接5V,gnd连gnd,SCK 和DT连自己设的引脚
桥结构图如下:
单片机称重AD模块-HX711
这个模块采用24位高精度的A/D转换器芯片hx711,是一款专为高精度电子称而设计的,具有两路模拟通道输入,内部集成128倍增益可编程放大器。输入电路可配置为提供桥压的电桥式(如压力、称重)传感器模式,是一款理想的高精度、低成本采样前端模块;
代码:
void Init_HX711pin(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//HX711_SCK
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOC
//HX711_DOUT
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入上拉
GPIO_Init(GPIOB, & GPIO_InitStructure);
//GPIO_SetBits(GPIOB, GPIO_Pin_1); //初始化设置为0
}
u32 HX711_Read(void) //增益128
{
u32 count;
u8 i;
HX711_DOUT = 1;
delay_us(1);
HX711_SCK = 0;
count = 0;
while (HX711_DOUT);
for (i = 0; i < 24; i++)
{
HX711_SCK = 1;
count = count << 1;
delay_us(1);
HX711_SCK = 0;
if (HX711_DOUT)
count++;
delay_us(1);
}
HX711_SCK = 1;
count=count^0x800000;//第25个脉冲下降沿来时,转换数据
delay_us(1);
HX711_SCK = 0;
return(count);
}
void Get_Maopi(void)
{
Weight_Maopi = HX711_Read();
}
//****************************************************
//称重
//****************************************************
void Get_Weight(void)
{
HX711_Buffer = HX711_Read();
if(HX711_Buffer > Weight_Maopi)
{
Weight_Shiwu = HX711_Buffer;
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。
printf("实物ad值是:%d\r\n",Weight_Shiwu);
Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue-0.0383); //计算实物的实际重量
//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 初始化RGB彩灯 */
LED_GPIO_Config();
delay_init();
/* 初始化USART 配置模式为 115200 8-N-1 */
USART_Config();
Init_HX711pin(); //HX711初始化
Get_Maopi();
delay_ms(1000);
Get_Maopi();
printf("皮毛值是:%d\r\n",Weight_Maopi);
while(1)
{
LED0 =~LED0;
Get_Weight();
delay_ms(4000);
weight=(float)Weight_Shiwu/1000;
printf("重量值是:%0.3fkg\r\n",weight);
printf("ad值是:%d\r\n",Weight_Shiwu);
}
}
代码中GapValue要自己根据传感器值的不同来调试,我是用一个5kg和一个20kg的重物来测的,因为ad值的重物的重量是有着线性关系的,相当于解一个二元一次方程组,提供二元一次方程计算器。 2个重物之间的值尽量大一些,准度会稍微准一点。
程序源码和电子秤HX711AD模块资料 :
链接:https://pan.baidu.com/s/1-tT6jRfDV8SAvVVFOBH8qg
提取码:dd11