使用HX711变送器模块+5kg的传感器。
#define HX711_DATA PEin(0)
#define HX711_SCK PEout(1)
void HX711_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE, GPIO_Pin_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
uint8_t HX711_GetValue(uint32_t *value)
{
int retry = 0;
uint32_t ret = 0;
HX711_SCK = 0;
while (retry < 200)
{
delay_us(1);
if (HX711_DATA == 0)
break;
else
retry++;
}
if (retry == 200) return 1;
for (int i = 0; i < 24; i++)
{
HX711_SCK = 1;
delay_us(1);
ret = ret << 1;
HX711_SCK = 0;
ret |= HX711_DATA;
delay_us(1);
}
HX711_SCK = 1;
delay_us(1);
*value = ret ^ 0x800000;
//*value = ret;
HX711_SCK = 0;
delay_us(1);
return 0;
}
int main(void)
{
u16 t;
u16 len;
u16 times = 0;
uint32_t value = 0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
HX711_init();
HX711_GetValue(&value);
printf("0x%x\r\n", value);
delay_ms(500);
HX711_GetValue(&value);
printf("0x%x\r\n", value);
delay_ms(500);
HX711_GetValue(&value);
printf("0x%x\r\n", value);
delay_ms(500);
HX711_GetValue(&value);
printf("0x%x\r\n", value);
delay_ms(500);
HX711_GetValue(&value);
printf("0x%x\r\n", value);
delay_ms(500);
uint32_t zero = value;
printf("0x%x\r\n", value);
while (1)
{
if (HX711_GetValue(&value) == 0)
{
printf("0x%x\t%d\r\n", value, value - zero);
if (value < zero) value = zero;
uint32_t weight = (value - zero) / 430;
weight = weight / 0.89;
printf("%d\t\r\n", weight);
}
else
{
printf("read error\r\n");
}
delay_ms(1000);
}
}
代码中的*value = ret^0x800000;
相当于把传感器读到的值加了0x800000,即原来的差分读出来假设是-2.5V ~ +2.5V,现在变成了0V ~ 5V,转换成了无符号数更加好计算。
测量出来的重量uint32_t weight = (value - zero) / 430;
,由于应变片工艺问题,可能其值并不等效于,最终通过砝码标定,得出重量:weight = weight / 0.89;