你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32使用HX711读取电子秤经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-14 13:29
使用HX711变送器模块+5kg的传感器。

  1. #define HX711_DATA  PEin(0)
  2. #define HX711_SCK   PEout(1)



  3. void HX711_init(void)
  4. {
  5.     GPIO_InitTypeDef  GPIO_InitStructure;
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10.     GPIO_Init(GPIOE, &GPIO_InitStructure);
  11.     GPIO_SetBits(GPIOE, GPIO_Pin_1);

  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(GPIOE, &GPIO_InitStructure);
  16. }


  17. uint8_t HX711_GetValue(uint32_t *value)
  18. {
  19.     int retry = 0;
  20.     uint32_t ret = 0;

  21.     HX711_SCK = 0;
  22.     while (retry < 200)
  23.     {
  24.         delay_us(1);
  25.         if (HX711_DATA == 0)
  26.             break;
  27.         else
  28.             retry++;
  29.     }
  30.     if (retry == 200)  return 1;

  31.     for (int i = 0; i < 24; i++)
  32.     {
  33.         HX711_SCK = 1;
  34.         delay_us(1);
  35.         ret = ret << 1;
  36.         HX711_SCK = 0;
  37.         ret |= HX711_DATA;
  38.         delay_us(1);
  39.     }

  40.     HX711_SCK = 1;
  41.     delay_us(1);
  42.     *value = ret ^ 0x800000;
  43.     //*value = ret;
  44.     HX711_SCK = 0;
  45.     delay_us(1);

  46.     return 0;
  47. }



  48. int main(void)
  49. {
  50.     u16 t;
  51.     u16 len;
  52.     u16 times = 0;
  53.     uint32_t value = 0;
  54.     delay_init();            //延时函数初始化
  55.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  56.     uart_init(115200);   //串口初始化为115200
  57.     LED_Init();              //LED端口初始化
  58.     KEY_Init();          //初始化与按键连接的硬件接口
  59.     HX711_init();
  60.     HX711_GetValue(&value);
  61.     printf("0x%x\r\n", value);
  62.     delay_ms(500);
  63.     HX711_GetValue(&value);
  64.     printf("0x%x\r\n", value);
  65.     delay_ms(500);
  66.     HX711_GetValue(&value);
  67.     printf("0x%x\r\n", value);
  68.     delay_ms(500);
  69.     HX711_GetValue(&value);
  70.     printf("0x%x\r\n", value);
  71.     delay_ms(500);
  72.     HX711_GetValue(&value);
  73.     printf("0x%x\r\n", value);
  74.     delay_ms(500);
  75.     uint32_t zero = value;
  76.     printf("0x%x\r\n", value);
  77.     while (1)
  78.     {
  79.         if (HX711_GetValue(&value) == 0)
  80.         {
  81.             printf("0x%x\t%d\r\n", value, value - zero);
  82.             if (value < zero) value = zero;
  83.             uint32_t weight = (value - zero) / 430;
  84.             weight = weight / 0.89;
  85.             printf("%d\t\r\n", weight);
  86.         }
  87.         else
  88.         {
  89.             printf("read error\r\n");
  90.         }
  91.         delay_ms(1000);
  92.     }
  93. }
复制代码

代码中的*value = ret^0x800000;相当于把传感器读到的值加了0x800000,即原来的差分读出来假设是-2.5V ~ +2.5V,现在变成了0V ~ 5V,转换成了无符号数更加好计算。

20191108142438372.png

20191108142457887.png

测量出来的重量uint32_t weight = (value - zero) / 430;,由于应变片工艺问题,可能其值并不等效于,最终通过砝码标定,得出重量:weight = weight / 0.89;
————————————————
版权声明:小盼你最萌哒
如有侵权请联系删除
收藏 评论0 发布时间:2023-3-14 13:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版