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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-14 13:29
使用HX711变送器模块+5kg的传感器。
0 i- P) K" a* _0 m" p; C

  1. * i( e1 B+ [: m+ s: e5 q* {0 g
  2. #define HX711_DATA  PEin(0)
    % A& k8 f& s$ E
  3. #define HX711_SCK   PEout(1)3 g$ h7 N' y2 f3 ?! n' A7 K8 K$ r
  4. # x  e& b! `' t: p

  5. 8 s3 J( N; ]& ^- q
  6. # ^  p0 M. V1 m5 B# T; H" |: C
  7. void HX711_init(void)- ?: I' D/ p+ w
  8. {, t" E# q1 {! D4 ?6 P
  9.     GPIO_InitTypeDef  GPIO_InitStructure;$ [+ N; \5 u( z* a2 H- w2 V
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);9 i" G& X  N8 P; G8 p7 m, ]/ w
  11. 9 L2 a, D; d3 ^0 s' ~$ Y9 l. ?0 b1 N
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    6 A3 x. c1 M; W6 {9 m/ f0 e
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  S" ~( W1 L. o& w) f- [! [
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 k/ S+ q5 R- U. C* e0 m: j
  15.     GPIO_Init(GPIOE, &GPIO_InitStructure);% r9 N+ h* Z7 ]! }
  16.     GPIO_SetBits(GPIOE, GPIO_Pin_1);
    1 X0 a: M4 _8 y; j

  17. # Q4 w  l$ d+ w- X2 m
  18.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;7 j/ B( X) m4 R1 G
  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    0 O% n5 T% K/ V. z$ O
  20.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! [$ _  n7 Q0 {5 h$ k
  21.     GPIO_Init(GPIOE, &GPIO_InitStructure);
    + G% G% C3 j# r: t3 D/ ?
  22. }% Q" \9 L3 M! _7 S

  23. ' f$ D: A" a1 I8 @# \* W

  24. : T5 W. }3 ?4 e2 v
  25. uint8_t HX711_GetValue(uint32_t *value)
    ; }1 E4 \) G, W! T+ U2 B# ^
  26. {
      T) n/ }7 m) }: k6 L& s
  27.     int retry = 0;
    # W6 i+ B0 y( N) T, R
  28.     uint32_t ret = 0;9 |! U, o( f. i" P( Q. I: V7 c# w( Z
  29. ( L5 A9 N- w" D* h
  30.     HX711_SCK = 0;
    ( k$ w* f; K# u
  31.     while (retry < 200); w( t4 M& v) f5 U+ o
  32.     {
    , C$ q, m& x  V/ E' f- T
  33.         delay_us(1);9 [8 t+ k9 P7 Q) e, ]6 a
  34.         if (HX711_DATA == 0)
    7 G% k, ~0 K1 {3 A6 ~
  35.             break;
    5 ?1 @9 U7 t; d" Q4 \$ a& F4 N
  36.         else
    1 e& D/ o4 }) u" N
  37.             retry++;
      k& r2 k5 `0 D# g" B- l9 K
  38.     }
    $ [+ k$ `, U9 s$ J2 t  K* A
  39.     if (retry == 200)  return 1;
    . V6 M2 p; O8 W3 O
  40. + r! p, q/ B% J  `5 w
  41.     for (int i = 0; i < 24; i++)0 U1 J' T' \/ [' X
  42.     {
    : k6 x7 ^& H8 R3 }+ I" [  u
  43.         HX711_SCK = 1;& i1 j8 z( k* @" a* j. t
  44.         delay_us(1);
    0 }# X9 J  ?" R' X$ ~1 [$ F
  45.         ret = ret << 1;
    & a/ M  z4 t! K5 E% [! |. O
  46.         HX711_SCK = 0;
    & N+ q6 A' P6 h
  47.         ret |= HX711_DATA;
    ! G( j! d6 w- t. A
  48.         delay_us(1);$ b8 |8 b; G7 Q- ?
  49.     }7 B( r& h' U* n) A' Y+ |6 f8 K

  50. / q! Z; b! D5 w3 o8 X
  51.     HX711_SCK = 1;9 ?* e; W9 c& X; Q' g
  52.     delay_us(1);# l1 T1 t0 l8 E6 C/ e
  53.     *value = ret ^ 0x800000;6 R6 F. u$ y( t# H9 w
  54.     //*value = ret;# t, a2 ~9 w& R( e+ S( g3 {8 X( A+ w
  55.     HX711_SCK = 0;
    1 V& \2 r$ _/ h0 n
  56.     delay_us(1);
    - k9 x5 F9 x5 V
  57. ! E1 J9 y9 k# H! A5 |4 Y$ v
  58.     return 0;1 O/ N3 b2 e' w4 v! S. ^  _
  59. }7 [7 `7 Z7 t( ^; t3 ^

  60. 5 y8 F1 p( Q: q
  61. 6 X2 S- ^$ v; \+ f

  62. , }, Y" _% [, s9 R' A4 B
  63. int main(void)
    7 N5 q# l1 x2 M9 o2 g
  64. {
    , X% R& c0 x2 B5 j( j" L( ]
  65.     u16 t;
    - _2 o7 j. ^& q: {
  66.     u16 len;
    % G, u5 N( r: G5 l; p* m" F0 N
  67.     u16 times = 0;
    ' ]% W8 s$ M: P* |" k5 w  d
  68.     uint32_t value = 0;
    - _6 D5 P& ~" }
  69.     delay_init();            //延时函数初始化) t. ]! t/ L6 x+ p
  70.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级3 r1 v" r0 C  |, P* r! B
  71.     uart_init(115200);   //串口初始化为115200. y! l  _7 o! {; t' Q
  72.     LED_Init();              //LED端口初始化
    : x: c# N( X7 y' R
  73.     KEY_Init();          //初始化与按键连接的硬件接口8 v" o8 J4 K( @$ R
  74.     HX711_init();
    8 j) Q1 H8 u! ^7 L
  75.     HX711_GetValue(&value);! @! p: a7 I- I9 l
  76.     printf("0x%x\r\n", value);
    3 ~* W! r! Z5 r$ V2 J/ f3 S
  77.     delay_ms(500);( e: {/ a( }" T6 a
  78.     HX711_GetValue(&value);: e# l+ S% R0 a/ q8 Q
  79.     printf("0x%x\r\n", value);
    3 E0 k: x. |) B& ?& @$ Y
  80.     delay_ms(500);
    $ [  E: S# c3 r! Q7 ?
  81.     HX711_GetValue(&value);( W- t+ f$ x( @; ^" ]  B1 N
  82.     printf("0x%x\r\n", value);3 d  |4 R; W1 d' j4 F
  83.     delay_ms(500);
    7 g% {2 l+ [; K* h
  84.     HX711_GetValue(&value);7 Y& ^2 U3 a) Q4 n( J( p
  85.     printf("0x%x\r\n", value);) k$ u# x+ U" g! N0 C
  86.     delay_ms(500);* c0 w5 }2 u- i
  87.     HX711_GetValue(&value);$ U2 o% M5 \6 D3 O* y
  88.     printf("0x%x\r\n", value);
    ( ]8 O4 _) f. }9 i( h9 g2 X
  89.     delay_ms(500);* J8 `/ t7 ?0 b' z, m% A6 [
  90.     uint32_t zero = value;
    ( [: S& A% z. T' q4 {$ h
  91.     printf("0x%x\r\n", value);- E$ ^# L; S/ x  c
  92.     while (1)
    , s3 o" }" K2 |4 [  H
  93.     {
    ' b# _& B$ `1 u4 u+ W# v% ]
  94.         if (HX711_GetValue(&value) == 0)
    2 E7 L" R; t  P  [2 F
  95.         {
    ( E/ R0 D9 @  [7 `
  96.             printf("0x%x\t%d\r\n", value, value - zero);$ Z' o& b# k+ H. u# W0 `+ _& \1 L6 F
  97.             if (value < zero) value = zero;
    $ [' c/ G) s  ~7 N  F: b" ~$ _) b
  98.             uint32_t weight = (value - zero) / 430;5 [, H2 m" e( W
  99.             weight = weight / 0.89;- j; F/ j: [& K/ z9 x/ r
  100.             printf("%d\t\r\n", weight);2 P4 ]$ h9 M. h- u$ r: z
  101.         }
    ! i$ ~5 D9 n7 Q
  102.         else
    ) M) o( u3 ^4 D
  103.         {. k6 [) A7 W" [4 M
  104.             printf("read error\r\n");
    # ]! E# W, V- M8 ^6 V4 T
  105.         }
    / z% \( u5 J0 J* r6 T/ H
  106.         delay_ms(1000);$ e, I3 {* N1 ]) l9 U$ l3 B1 _% ]
  107.     }# g5 G- u0 G9 V# W
  108. }
    ' z- X  c. u' U! N
复制代码

% B$ U3 w/ U& ?; `) v6 Y0 d- r0 u代码中的*value = ret^0x800000;相当于把传感器读到的值加了0x800000,即原来的差分读出来假设是-2.5V ~ +2.5V,现在变成了0V ~ 5V,转换成了无符号数更加好计算。  n) w* H9 u! m% s$ E

7 @7 k3 x/ l7 L9 d3 y
20191108142438372.png ) f+ l2 y1 {0 C" g5 c8 |+ y' K& F+ o
+ m$ }' m% w0 X) Z. K
20191108142457887.png
+ a* ~2 ~1 ?7 U% c/ B- A9 [
4 e1 F. ?- k( d& r) U) p1 E测量出来的重量uint32_t weight = (value - zero) / 430;,由于应变片工艺问题,可能其值并不等效于,最终通过砝码标定,得出重量:weight = weight / 0.89;
/ w7 p6 x3 k4 W  H" g0 ]. C- E————————————————
) O& K2 j% O9 Y* R% u+ W. X8 V0 d版权声明:小盼你最萌哒
& b6 v& S' g( ]$ g* x如有侵权请联系删除( b( @: b+ F$ G4 M6 ?
赞 收藏 评论0 发布时间:2023-3-14 13:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版