使用HX711变送器模块+5kg的传感器。
0 i- P) K" a* _0 m" p; C
* i( e1 B+ [: m+ s: e5 q* {0 g- #define HX711_DATA PEin(0)
% A& k8 f& s$ E - #define HX711_SCK PEout(1)3 g$ h7 N' y2 f3 ?! n' A7 K8 K$ r
- # x e& b! `' t: p
8 s3 J( N; ]& ^- q- # ^ p0 M. V1 m5 B# T; H" |: C
- void HX711_init(void)- ?: I' D/ p+ w
- {, t" E# q1 {! D4 ?6 P
- GPIO_InitTypeDef GPIO_InitStructure;$ [+ N; \5 u( z* a2 H- w2 V
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);9 i" G& X N8 P; G8 p7 m, ]/ w
- 9 L2 a, D; d3 ^0 s' ~$ Y9 l. ?0 b1 N
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
6 A3 x. c1 M; W6 {9 m/ f0 e - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; S" ~( W1 L. o& w) f- [! [
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 k/ S+ q5 R- U. C* e0 m: j
- GPIO_Init(GPIOE, &GPIO_InitStructure);% r9 N+ h* Z7 ]! }
- GPIO_SetBits(GPIOE, GPIO_Pin_1);
1 X0 a: M4 _8 y; j
# Q4 w l$ d+ w- X2 m- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;7 j/ B( X) m4 R1 G
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
0 O% n5 T% K/ V. z$ O - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! [$ _ n7 Q0 {5 h$ k
- GPIO_Init(GPIOE, &GPIO_InitStructure);
+ G% G% C3 j# r: t3 D/ ? - }% Q" \9 L3 M! _7 S
' f$ D: A" a1 I8 @# \* W
: T5 W. }3 ?4 e2 v- uint8_t HX711_GetValue(uint32_t *value)
; }1 E4 \) G, W! T+ U2 B# ^ - {
T) n/ }7 m) }: k6 L& s - int retry = 0;
# W6 i+ B0 y( N) T, R - uint32_t ret = 0;9 |! U, o( f. i" P( Q. I: V7 c# w( Z
- ( L5 A9 N- w" D* h
- HX711_SCK = 0;
( k$ w* f; K# u - while (retry < 200); w( t4 M& v) f5 U+ o
- {
, C$ q, m& x V/ E' f- T - delay_us(1);9 [8 t+ k9 P7 Q) e, ]6 a
- if (HX711_DATA == 0)
7 G% k, ~0 K1 {3 A6 ~ - break;
5 ?1 @9 U7 t; d" Q4 \$ a& F4 N - else
1 e& D/ o4 }) u" N - retry++;
k& r2 k5 `0 D# g" B- l9 K - }
$ [+ k$ `, U9 s$ J2 t K* A - if (retry == 200) return 1;
. V6 M2 p; O8 W3 O - + r! p, q/ B% J `5 w
- for (int i = 0; i < 24; i++)0 U1 J' T' \/ [' X
- {
: k6 x7 ^& H8 R3 }+ I" [ u - HX711_SCK = 1;& i1 j8 z( k* @" a* j. t
- delay_us(1);
0 }# X9 J ?" R' X$ ~1 [$ F - ret = ret << 1;
& a/ M z4 t! K5 E% [! |. O - HX711_SCK = 0;
& N+ q6 A' P6 h - ret |= HX711_DATA;
! G( j! d6 w- t. A - delay_us(1);$ b8 |8 b; G7 Q- ?
- }7 B( r& h' U* n) A' Y+ |6 f8 K
/ q! Z; b! D5 w3 o8 X- HX711_SCK = 1;9 ?* e; W9 c& X; Q' g
- delay_us(1);# l1 T1 t0 l8 E6 C/ e
- *value = ret ^ 0x800000;6 R6 F. u$ y( t# H9 w
- //*value = ret;# t, a2 ~9 w& R( e+ S( g3 {8 X( A+ w
- HX711_SCK = 0;
1 V& \2 r$ _/ h0 n - delay_us(1);
- k9 x5 F9 x5 V - ! E1 J9 y9 k# H! A5 |4 Y$ v
- return 0;1 O/ N3 b2 e' w4 v! S. ^ _
- }7 [7 `7 Z7 t( ^; t3 ^
5 y8 F1 p( Q: q- 6 X2 S- ^$ v; \+ f
, }, Y" _% [, s9 R' A4 B- int main(void)
7 N5 q# l1 x2 M9 o2 g - {
, X% R& c0 x2 B5 j( j" L( ] - u16 t;
- _2 o7 j. ^& q: { - u16 len;
% G, u5 N( r: G5 l; p* m" F0 N - u16 times = 0;
' ]% W8 s$ M: P* |" k5 w d - uint32_t value = 0;
- _6 D5 P& ~" } - delay_init(); //延时函数初始化) t. ]! t/ L6 x+ p
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级3 r1 v" r0 C |, P* r! B
- uart_init(115200); //串口初始化为115200. y! l _7 o! {; t' Q
- LED_Init(); //LED端口初始化
: x: c# N( X7 y' R - KEY_Init(); //初始化与按键连接的硬件接口8 v" o8 J4 K( @$ R
- HX711_init();
8 j) Q1 H8 u! ^7 L - HX711_GetValue(&value);! @! p: a7 I- I9 l
- printf("0x%x\r\n", value);
3 ~* W! r! Z5 r$ V2 J/ f3 S - delay_ms(500);( e: {/ a( }" T6 a
- HX711_GetValue(&value);: e# l+ S% R0 a/ q8 Q
- printf("0x%x\r\n", value);
3 E0 k: x. |) B& ?& @$ Y - delay_ms(500);
$ [ E: S# c3 r! Q7 ? - HX711_GetValue(&value);( W- t+ f$ x( @; ^" ] B1 N
- printf("0x%x\r\n", value);3 d |4 R; W1 d' j4 F
- delay_ms(500);
7 g% {2 l+ [; K* h - HX711_GetValue(&value);7 Y& ^2 U3 a) Q4 n( J( p
- printf("0x%x\r\n", value);) k$ u# x+ U" g! N0 C
- delay_ms(500);* c0 w5 }2 u- i
- HX711_GetValue(&value);$ U2 o% M5 \6 D3 O* y
- printf("0x%x\r\n", value);
( ]8 O4 _) f. }9 i( h9 g2 X - delay_ms(500);* J8 `/ t7 ?0 b' z, m% A6 [
- uint32_t zero = value;
( [: S& A% z. T' q4 {$ h - printf("0x%x\r\n", value);- E$ ^# L; S/ x c
- while (1)
, s3 o" }" K2 |4 [ H - {
' b# _& B$ `1 u4 u+ W# v% ] - if (HX711_GetValue(&value) == 0)
2 E7 L" R; t P [2 F - {
( E/ R0 D9 @ [7 ` - printf("0x%x\t%d\r\n", value, value - zero);$ Z' o& b# k+ H. u# W0 `+ _& \1 L6 F
- if (value < zero) value = zero;
$ [' c/ G) s ~7 N F: b" ~$ _) b - uint32_t weight = (value - zero) / 430;5 [, H2 m" e( W
- weight = weight / 0.89;- j; F/ j: [& K/ z9 x/ r
- printf("%d\t\r\n", weight);2 P4 ]$ h9 M. h- u$ r: z
- }
! i$ ~5 D9 n7 Q - else
) M) o( u3 ^4 D - {. k6 [) A7 W" [4 M
- printf("read error\r\n");
# ]! E# W, V- M8 ^6 V4 T - }
/ z% \( u5 J0 J* r6 T/ H - delay_ms(1000);$ e, I3 {* N1 ]) l9 U$ l3 B1 _% ]
- }# g5 G- u0 G9 V# W
- }
' 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
) f+ l2 y1 {0 C" g5 c8 |+ y' K& F+ o
+ m$ }' m% w0 X) Z. K
+ 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 ?
|