【年中粉丝节】+超声波距离传感器 今天分享下板子上比较大的传感器,就是超声波距离传感器。使用超声波距离传感器就比较简单了。 首先看下超声波测距传感器的原理,一端发射声波,当声波被物体阻挡就会反射回来。被接收端收到,只要我们算好这中间的时间差,加上声音传播速度就能算出距离,有如下公式: 原理图是这样的比较负责了,用了一个555定时器产生38Khz的方波,接收端其实是使用了一个CX20106A的红外解码芯片,其实这样是频率对上了,之后是为了程序方便,初始化一个定时器中断,每10US中断一次,然后把接收端也放一个中断,这样,开始发射时计数清空,然后定时器中断计数,这样来算时间,之后通过IO中断,来判断接收到了。在根据上面公式就能算出距离了。 - void Ultrasonic_Port()
6 y( B a5 Y# W T6 A) K' |
& e; ?0 U) B( W9 X3 V& P- {6 G) w% W( w) S: h5 U) n4 [5 u) u
- # ^5 ~: d- p9 Z4 O% ^7 Y
-
3 W R* ?% M7 n3 Y9 n7 V8 }1 C3 I - 6 f2 L Y) i' B' ]+ A
- GPIO_InitTypeDef GPIO_InitStructure;+ B- l( ^- W6 w, i, L1 O, c
& M9 `# s x% H6 L-
' K* q! Q6 M# z' U! N# L
0 S& I" w# ~# Y7 v0 _- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
' ^2 m, G& d6 d9 C - 8 A/ ~0 W, e$ ? _
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);" A8 c( C% I* Z7 Y7 p' f6 B
- . f9 N, h( ?1 q' @( J
- //改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable JTAG-DP 失能 + SW-DP使能
- c! \/ _; t& j9 K4 F7 g: `
: V* N7 f! {( A7 A) `8 E- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
) p* {2 Z' w3 h0 T6 Q Y
: t6 c1 k. K& I/ ~6 S- + m ~! V1 i* H; B, x! W
/ @4 F0 u. o1 s' f4 @- //PB6-SCL PC2-ADDR
; K1 q- ]9 x6 b8 M D6 l
" \8 m( t9 H+ q5 O+ q( l3 ?, O- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15
+ a: t' p7 j. w) ~! t0 }( A - & ?) x; O" Z* ~' x6 F
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/ w# K# r; b* P- Q
+ Q' i: L2 h. l% J; m- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出$ {$ L# @8 g- c% N6 G
- " {, ]0 e. r8 [, k3 @
- GPIO_Init(GPIOA, &GPIO_InitStructure);8 {! w; l2 j- |* m: L& b
& S# l, I( P7 w/ v0 S-
0 ^" z8 f! ~, i( J; t
6 a, i+ f' X3 B! p+ ~1 r o- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
$ S& a8 _. ?! T: h1 r2 m0 c: j; F0 `
( q, a! Z V4 n1 k1 F6 I; O0 f( y- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
" q; ?3 W6 d7 m7 k) T2 n' p5 W# | - ' R. T& U4 P3 O3 {, R; h) p: D- @
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
. H7 {; ~0 s( E# @7 c$ ?) B7 V - 5 w9 Y% B' I! X6 c/ ^
- GPIO_Init(GPIOB,&GPIO_InitStructure);
" p+ Q2 q' u, o: o$ Z0 g; Z
; T6 j h+ p3 ?( R1 w7 U1 _- }* {. g) ?4 R; r- r
! h6 A1 W# j7 A) k: q6 V-
" O0 @9 E Y& p( B. n: b% K5 O# H6 i - 1 P: F' P( `, q
- : o% S1 ~) G, j, T. D3 I2 |
- . l8 F5 k: x P, F
- void Ultrasonic_TIM(uint16_t arr,uint16_t psc)) m, B ]& k; _" v5 b! _! B) i
- $ X7 D6 \: m! p- O3 C
- {" _1 ^# K( e, l2 @! ]+ ]
. S& v) G% c% t& m3 [4 ]- b- % i$ x8 Q' q9 n
& }7 I+ ^0 M4 w& a1 d @' ^- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;$ ]: C" ~) f! V& f e
- 1 Q6 w2 p3 N$ k+ `; ^# k
- NVIC_InitTypeDef NVIC_InitStructure;
: i D$ _$ ?8 |8 n/ ]3 e2 r$ _
; c6 _( B. n* s- , h4 p! t% e: q
- - Q! n% M* H/ V# w; E. y% C
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
% Z% ?: O# {5 C) Z* V2 R
6 q ]. G: j( ]- y% f+ Q-
7 `+ l; b9 _5 R1 k - % l- x+ h9 y+ }" N5 \/ H7 l
- //定时器TIM3初始化
" p! F) t/ ]! K" k; b7 p
+ l- U& Y; l* E8 ^2 z* g1 L- TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
$ l2 k% p$ S- a5 h7 y0 @! E2 o - # d4 s- f' }5 D
- TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
6 T! R& s% B }/ M. {3 L! a - , [+ u/ o e& x) F5 C8 N
- //TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
# V* A1 ]+ z" O8 L( a! O - & o* W: g& R* z& G4 X0 O/ W" r
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
3 t$ f6 H% H% `; u# H# k% w
0 g- y9 i8 |0 m- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
' a- K# ~8 R$ X1 G- j* g I - , Q& G( g3 R: C3 V0 K* g$ I
- 3 s; b3 z+ i2 O+ j% b
- : e/ t1 D; l( B; }$ I+ E& V1 u
- //中断优先级NVIC设置' A# |; i: m% q3 d
; ^8 j! o* G1 x- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断- _- S# @* H. a( N1 F: _
( d) b3 k0 e. k6 F* k/ j- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级1 v# j7 D: B8 y+ d9 N
- 8 o- e$ w W+ ?+ l% k& V
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8; //从优先级3级
$ D9 K4 e9 G( ]# }7 Z - ' T: I: h% ]) ^- @! c% e+ ~
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
% }$ [3 P! N6 w; g; K - 7 Y# i' ~: G5 ?7 O8 X
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器1 A _ b, ?2 F% V- f% e3 c7 r7 Y% u
- * s' X. I: L0 l
- " `1 e( G! L& P7 E2 _
3 i, o/ d) ~* n$ _: k( a! s- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
7 F- c& c+ S! B! U7 L
1 S3 _ h1 \+ V: v I- TIM_Cmd(TIM3, DISABLE); //使能TIMx
' L+ s# d2 o) X: L4 V$ m - 0 _; l( V! k# R1 w
- }7 y9 G# q) U& F( T t
" M* }4 d2 d# U" |: g' @; h3 @-
6 H# p/ }0 `- w8 e5 g
" v6 |3 u7 f" S/ v* q- B" {- void Ultrasonic_EXTI()
. O7 ]( |8 k2 d8 r - % P+ z8 X: c p# M/ p
- {& v8 Y, p( L5 o/ g& I
- 0 [4 H$ Q3 D8 V" k M5 G0 O
- EXTI_InitTypeDef EXTI_InitStructure;# }! ~8 \0 U: ]6 l
- 8 z0 v! B* W' d0 }: v: C" H, w
- NVIC_InitTypeDef NVIC_InitStructure;$ G' g3 l1 h1 e9 `
) p9 f$ K% Z' k$ {+ A0 [6 g! j2 V- 9 u) f# X! `) q2 z. g0 X5 \
- 5 K' F6 L; A x
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
0 N; B: o! \8 K% ~1 ]0 {4 f - ' E9 S a5 k1 A* w# m% q. _
- # Q' f" W- t8 D. Q, X8 P
- ' b- ^ P" @) {% j( f& Y* d3 c+ j/ E
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
; y' k, u9 i; G0 b - ; M1 Q8 ~6 B* b1 g5 y
- " g% { Z9 s V- {, d
: \3 h8 {4 @( s- //GPIOE.2 中断线以及中断初始化配置 下降沿触发. t& [" g# _ r. T1 L
- % Z9 y- x& j# H. y9 ]
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);: f+ X& |' |1 W" p, r
- : n- Y/ ^3 a7 E' D
- 0 M |# E7 a9 c0 @
7 ]$ e; F( k# d4 ]! |- EXTI_InitStructure.EXTI_Line=EXTI_Line8; //KEY2! g8 J# T, y7 Q
+ W* f" f# C+ O, ~# l- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
# f! t& f3 _9 Y9 t$ B9 r5 f) _) U5 ]/ z - 6 G0 h4 ^9 @4 `; r2 k5 A1 W, O% W- u/ P* o
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;# S3 c3 N& k5 _5 w
- 1 ^4 N. k/ T9 u7 N& l' d& I" Q
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;, t" a4 ?' b0 G$ R/ `1 A
- % J( d; j9 }3 V2 L8 l4 y) p
- EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
9 a7 R5 x* P, Y* Q. j
% g- G# }# s2 {4 t! m-
4 [0 Z+ [5 ~, n0 b5 \4 P* P: @ - 0 y- z1 u" E! D) b# r/ B* j
- NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按键KEY2所在的外部中断通道
- d0 I, Q: y( J0 @. T( R d3 F* Z* H - ( [' l0 ]7 I9 t" F l
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级2,9 Y4 v) O& t5 P" C1 i7 l
- 1 W: v) Z# E0 g
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7; //子优先级2+ M, D9 ~ X! w. h* y
0 D; L& l/ d* w, V5 v- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 g1 a2 n n5 U: D; F7 b6 t% N: x
, k: F3 N* J6 l- NVIC_Init(&NVIC_InitStructure);/ }: ^% j7 O( w J D: g8 K
- 6 h+ q9 R" W1 m6 R. \5 @& l3 `
-
* R: @ W* q- W+ j
& N. a5 A" j( B r6 v& \, O- }
7 X1 |! _5 C4 ?+ ]" z( h - + d8 E* w; w4 ~- u* S
- & ^1 M) U" |9 F; r
- V9 ], L2 t0 P
- void Ultrasonic_Init()
. k- l! I+ b- M5 S1 V- G2 Z- r' t$ ?! } - 3 x. Z% g4 G# Z' R6 B3 \; N
- {. @5 m, k" n' j, v8 j; e
- : u# z0 H4 n! {$ W& W) v' b6 M3 x
- Ultrasonic_Port();, i: ?; K, c9 S2 Z( W3 c
! i% t, b: o# W- Ultrasonic_TIM(9,71);//10us6 g( n4 M# r& a, N$ i
5 E F5 J: [6 F, g. V. A- Ultrasonic_EXTI();
$ \ l6 H8 d3 b$ A8 K+ X( y
7 B+ y) Z( Y6 t; H6 r m- }
, d. C( W0 y9 L
/ E4 J) r7 s \& g-
# s( t+ ]$ l7 P+ K - ' R3 o5 K( X8 A9 ^' Q2 j
- / B ?1 V/ D! ~
, t% S" L& ]# }' J- //超声波测距& f! ^ Y% H+ n) z2 U
- * [' E6 M( J8 A
- void Ultrasonic_Ranging()# D0 B4 ~" j7 I! e4 |
' {. O# C# x/ }9 O; N/ z! `- {1 J5 ], j2 k( F: Q/ w7 y
- $ `/ O" h) G: Z2 ^4 k
- INC = 1; //关发射 , u- G) O* V# K0 e
- . c6 {5 l0 F4 I0 e! X6 I
- delay_us(3);9 X( P+ b7 E1 \0 g
- 6 `- ~0 H B; m
- INC = 0;. H# C4 F" R- f
- % ^( e, {8 |0 Z7 @6 m
-
# L4 }5 A* R8 c) N - & @1 T2 \; w7 h- f! U
- TIM_Cmd(TIM3,ENABLE);6 r1 s% t1 C. e
- # j% Z# F+ z$ ^$ g1 ]
- //EXTI_ClearITPendingBit(EXTI_Line4);
& W9 z% b. u! ~! r' C9 ?3 W& H - . F( m" k$ r- a* X1 V" U( n, x
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
! l& o" A0 G5 e+ R* Z" ~+ O5 e - # x) ]+ ?/ j$ y5 ^# e5 v6 f
- * @% `+ P! x& H& ?4 \
+ t W0 a% p0 d' T: `- Ultrasonic_Num = 0; // 定时器清零0 |% V$ k: P1 m3 m6 b6 h f$ `8 I
. N, V X6 E! J7 j3 a6 @) ~-
7 I1 W. E* `2 q! W! u" D( O - 8 r& O' g0 r$ B, Q) W
- delay_ms(30); //等待一段时间,等待发送超声波控制信号, ~* K1 u; F0 @0 C( ^& N+ w& J- C
3 {; w* }. P; f* U# C- INC = 1;
) U4 Z9 B- [# k% `$ c4 `$ P8 ] - 9 c! h% F: ~+ }
- delay_ms(5);$ F. p7 @# p3 C# F8 e! t7 g
- 0 M+ n% M/ s' M& W" p* q- E
- }0 B- U. M' g/ H( A0 L
- 4 w: d% Q3 L& z& F
- 9 U7 `0 M4 J7 m4 s$ `
- ) _1 s% J) z4 @& h" W' y, V
- //定时器3中断服务程序" F' ] \ K0 L; C+ L. H9 Q
% C0 [3 Z% b% y$ U- void TIM3_IRQHandler(void) //TIM3中断7 \5 h R- d% V) T( j! z) s" C
; W+ k2 H2 |, ~' C$ y" D- {+ j) q2 C1 j R) b
- ( v* k; _! { a3 e
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) //检查TIM3更新中断发生与否
8 R6 c; Z p' J+ ?1 c - & O7 o) c* _3 Q$ L) m3 s7 l( C* q
- {
}" l( N, g: z4 w9 _% n2 C6 _ - * V' w3 W+ ]# f2 |7 @* _) X
- Ultrasonic_Num++;
' Q8 y, v) \7 ^# p5 {9 w# v6 b - ' c* W. Q$ w3 D7 M/ s
- }5 o6 l, Q, B2 p+ n
% u9 _7 [! y' O6 b6 d: J- TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx更新中断标志
/ S3 {; M4 t% N% x0 A, d2 T
+ X. U5 v; R# P3 T4 E/ m) S; @- }
: f7 m% T4 x5 K4 Y" e; A# U - 9 M# L& L; |+ I: ]% D- @1 u* y
- : w t2 P0 ~1 ?- X
- " D* s: @) B0 Z* o3 f4 J
- //外部中断2服务程序7 z) W3 P4 [: E0 C9 _
- " h( L6 d# e' h/ U5 H m
- void EXTI9_5_IRQHandler(void)6 _; w: L' m, F
- ' P5 h. m9 t2 H/ c) |! m. d5 n% y4 Q
- {
* P' b: |+ i5 } - . f( W8 X- |2 L
- if(EXTI_GetITStatus(EXTI_Line8) == SET): d& P, g' I, b: f9 i/ c
- , W0 d, L3 F2 M8 o" q
- {
" c S# F3 _7 D% ^4 U2 O- ?
4 f/ o$ A, S' [. U- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) == RESET)
: V# z7 C) d5 u8 n# c
" K/ l8 Z4 [/ W+ {: E( \6 ]! l! k- {
0 A: o9 s$ w+ ` - 1 e* ?) e, r2 ] m4 i' E( R# g
- TIM_Cmd(TIM3,DISABLE);1 h% ]1 a" j" g `* u! F& S. H3 e
- " ~- `; W$ v% g! M' H: h4 u2 m
- Ultrasonic_Value = Ultrasonic_Num;& T0 |$ O( O. T5 Y$ O; _) U& y
: q/ @5 j0 _: `9 z G# ?5 N! J- Ultrasonic_Value =(float)Ultrasonic_Value*1.73; // 计算距离定时10us,S=Vt/2(减2是误差补尝)
0 z8 W) m" t+ `% O; v* `
7 r% N6 I! {: Y9 ]% K- dis = (uint16_t)Ultrasonic_Value;
0 D* e$ ?% [2 S" k" _
8 @# t9 k- e3 P- z- }
$ Y2 O% S+ m+ U7 y) f5 _+ Y) D
0 c+ ~9 h+ _/ C. Z* l* e- e- EXTI_ClearITPendingBit(EXTI_Line8);# C2 I9 j4 `- z6 P# b: y4 T: i4 t
7 w# Y4 X* Y& }* o- x% b3 b% r- } # y* j6 X- N9 ]5 Z) K( R/ f8 o
: k8 A) h) \9 v Y. Q0 c- }
复制代码
/ X1 s+ {( `/ \( k3 A% H, \ 实际测算还是会有点误差的。
1 V7 y& \ w! u' t. a |