线路连接
购买模块如下图所示:
连线表:
压力传感器 | HX711 |
---|---|
红 | E+ |
黑 | E- |
白 | A- |
绿 | A+ |
HX711 | 单片机 |
---|---|
GND | GND |
DT | GPIO |
SCK | GPIO |
VCC | 2.6-5.5V |
HX711主要特点
- 双通道。有A、B两个通道,增益不同。两个通道同时使用时需注意:
当 A/D 转换器的输入通道或增益改变时, A/D 转换器需要 4 个数据输出周期才能稳定,也就是频率降低到1/5.
-
该版本HX711模块右上角有个0欧电阻,用于输出频率选择(10HZ/80HZ),默认10HZ,见丝印。若想更改,将0欧电阻改至80HZ位置即可。
驱动代码
GPIO_TypeDef* SCK_GPIO_Port = GPIOB,*DT_GPIO_Port = GPIOB;
uint16_t SCK_PinA = GPIO_PIN_13,DT_PinA = GPIO_PIN_12;
uint16_t SCK_PinB = GPIO_PIN_14,DT_PinB = GPIO_PIN_15;
//读取计数值
int32_t ReadCount(GPIO_TypeDef* GPIO_Port_DT, uint16_t GPIO_Pin_DT,GPIO_TypeDef* GPIO_Port_SCK, uint16_t GPIO_Pin_SCK)
{
uint32_t Count = 0;
HAL_GPIO_WritePin(GPIO_Port_SCK, GPIO_Pin_SCK, GPIO_PIN_RESET);//开启AD转换
while(HAL_GPIO_ReadPin(GPIO_Port_DT, GPIO_Pin_DT)) {} //判断AD转换器是否准备好(DOUT应为低电平)
for(int i = 0; i <24; i++)//24个数据bit
{
HAL_GPIO_WritePin(GPIO_Port_SCK, GPIO_Pin_SCK, GPIO_PIN_SET);
Count = Count << 1;
if(HAL_GPIO_ReadPin(GPIO_Port_DT, GPIO_Pin_DT))
{
Count ++;
}
HAL_GPIO_WritePin(GPIO_Port_SCK, GPIO_Pin_SCK, GPIO_PIN_RESET);
}
HAL_GPIO_WritePin(GPIO_Port_SCK, GPIO_Pin_SCK, GPIO_PIN_SET);//第25个脉冲:增益128
int32_t intCount = (int32_t)(Count<<8);
/*关于这里的运算,手册上有写输出为补码,且有许多教程这里写的 Count^=0x800000。
实际有24位数据,所以用int32_t的话,左移8位即可,此时不加外力时数据接近0,加外力时根据外力方向有正负
*/
HAL_GPIO_WritePin(GPIO_Port_SCK, GPIO_Pin_SCK, GPIO_PIN_RESET);
return intCount;
}
//读取传感器A的值
void ReadWeightA(void)
{
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_PinA, GPIO_PIN_RESET);
for(;;) {
time_lastA = HAL_GetTick();//获取转换前时间
hx711countA = ReadCount(DT_GPIO_Port,DT_PinA,SCK_GPIO_Port, SCK_PinA);//读取数据
weight_realA = (hx711countA - weight_firstA)/1000000.0f;//weight_firstA用于数据归零,分母通过校准获得(这里随便给的)
time_deltA = HAL_GetTick() - time_lastA;//计算转换时间,便于计算帧率
}
}
//读取传感器B的值
void ReadWeightB(void)
{
HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_PinB, GPIO_PIN_RESET);
for(;;) {
time_lastB = HAL_GetTick();
hx711countB = ReadCount(DT_GPIO_Port,DT_PinB,SCK_GPIO_Port, SCK_PinB);
weight_realB = (hx711countB - weight_firstB)/1000000.0f;
time_deltB = HAL_GetTick() - time_lastB;
}
}
void ResetWeight(void) {
weight_firstA = hx711countA;//数据归零
weight_firstB = hx711countB;
}
/************************ RTOS *******************/
//线程创建
void HX711_TaskStart(void)
{
xTaskCreate((TaskFunction_t)ReadWeightA,"",128,NULL,6,NULL);
xTaskCreate((TaskFunction_t)ReadWeightB,"",128,NULL,6,NULL);
}
/***********************END OF FILE************************/
有什么问题可以评论区提问,博主会尽力解答。