双路HX711+STM32+CUBE+FREERTOS使用记录

 线路连接 

        购买模块如下图所示:

         连线表:

压力传感器HX711
E+
E-
A-
绿A+
HX711单片机
GNDGND
DTGPIO
SCKGPIO
VCC2.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************************/

有什么问题可以评论区提问,博主会尽力解答。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本人不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值