STMCU小助手
发布时间:2022-3-25 13:34
|
URM04简介:, Z2 O; v+ M' j& Z0 n URM04采用了RS485串行通信总线的架构,支持多传感器的并行工作,有着两个RS-485接口,最多支持32个超声波的并联,8 w" Y; r$ U# B& p2 s' V, K' p 内置温度传感器辅助校正距离值,同时支持温度的测量6 o* F& p, V0 q* \8 H 应用场合:移动机器人,停车场,安全检测,超声波空间定位。 3 h; E# w5 U( w. T$ T
性能描述: U5 v8 X1 t% A8 K/ y( y0 S2 R 工作电源:+5V4 q4 b7 Y! L4 U2 c- V# j 接口方式:RS485 RS485总线通讯,6 o# l7 j4 z/ E# `; _ 超声波距离测量:8 G% h4 S! T9 { 最大距离4cm―500cm 测量范围角度: 60度 芯片型号:Atmel公司的ATmega8芯片 MAX202 MAX485 ST温度测量芯片 测量流程: 1触发超声波与温度测量指令% @5 b4 @: n. k& V* S; k7 G# Q
7 V7 T7 l1 C$ y, J 发送指令后,超声波开始测量,温度开始测量,无返回值 - J: n# N* T( I 2延时30MS, B! T9 L) K+ I 超声波最大测距5米,反射路径10米,声速度331米/秒) 10/331=0.03021 //30MS* X1 {# ]* Y& J% c, U / q3 n: |1 P; l/ N% o4 H: G! ]1 ? 3超声波测距读取指令! Y- @( Q$ P4 e& [
; y1 | k V }. _; c 测量完一次之后,数据会被存储在ATmega8芯片中,只有发送读取指令,才会有数据返回+ ^' u! ?$ j' x1 } 返回值:8 D a8 b! x. ~6 B: o9 i
* E5 n& U1 Z4 R0 f 测量成功返回16位距离数据,两字节0XFF表示测量失败* c9 V7 Z4 J$ v7 T5 v& {; Q j 4温度读取指令:- B' P# W# p0 E& l & [/ ?/ L& |, P% X& f) Z! _
/ L }" y" M v& T$ [ 与超声波只有命令字节不同+ h8 d0 Y3 n9 y- D4 d ' ]! _3 ?% |6 i. [ 返回值:) h7 |7 s! z* |/ e1 X7 a
( Z' D+ q7 ^+ _2 U 调试经验: 1注意超声波要接的是5V,不是3.3V,使用下载器时一般都是3.3V供电,这就导致在线调试没有数据,应该给板子供上电,下载器不供电,超声波接到5V电源口,并且检测下是不是5V. * H5 l" N6 u- w# y7 L$ j, L( v0 x 2.测距时不要距离太近,会导致数据不准确 PS: 太近超声波会有回波干扰 7 j7 g3 J3 U+ b* U: _ ! ~/ Y6 c" G, ^( a0 q6 Z 3.超声波测距的性能与被测物表面材料有很大关系,如毛料、布料对超声波 的反射率很小,会严重影响测量结果。2 P& s3 g6 n- f4 w 4.测距等待一定的时间,如果超时后依然没有数据返回,就放弃,而进行下一次测量。9 D7 \, y2 y; h7 ?4 [ 4.URM04 V2.0 如果与主板有数据交流,其上的LED灯会一闪一闪的 5.URM04 V2.0 的波特率为固定值19200。或1152008 W8 j! l a2 R: ~, N ' c, P- C v/ @9 q 关于这个找了半天发现是在10年七月之后买的都是19200 之前买的都是115200,# k& A3 Q& b# p0 B6 T4 {6 c
: ]& x7 x! T+ g. N# l9 D) Z 6 UATR接收数据的中断要改!!可以自己根据返回的数据特征做相应处理,或者接受8个字节直接退出 , F6 \: w! f7 {/ _ 1 O% Z- I& W) L+ b9 o 话不多说我们直接看代码:& ~" o+ ?/ B3 w! ]# ` 9 z1 r1 g5 L" i9 D" j 超声波数据测量
发送温度就是将Tcmd[4]改为0x03 自行修改即可7 l5 u5 T. H; ]: {" X% H( ` 超声波ID改变& \# k7 T& j8 v# ] /*! * @brief 超声地址改变 * @since v1.0' O. T7 A; \( [1 u" S: ^5 n( ]% h * @param device 超声波地址 * @return 1 表示成功 0表示失败6 ~; \4 c. L% o* H3 U1 e * @author Z小旋* X4 f/ D) j4 h3 p) U, r */! ~. x8 J3 s! p int ID_Change(u8 device) { int i = 0; u8 data[8];) N! q+ p! M) E; J$ b/ l% N$ T u8 Scmd[7]={0x55,0xaa,0xAB,0x01,0x55,0x11,0x00}; //触发超声波与温度测量指令- G) ]# W3 W2 D) S& z' h# R* g& Z- E Scmd[5] = device; for(i=0; i<7; i++) l7 s9 ?" Z3 B/ S0 ] {. @ T5 D% L/ i USART_SendData(USART1, Scmd);* k( X- B3 r3 Z- o while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束* E- P& ?: i D! V6 v8 m Scmd[6] += Scmd; } delay_ms(20); for(i=0; i<10; i++) //获取十位返回数据,检测是否含有0x01 {* r4 }; {3 I V8 u" D, _ if(USART_RX_BUF==0x01) 4 y: O2 c8 S" M* ~ {* I0 _, k# y9 t& ?, w; h return 1;$ C6 j9 D: x0 Q% s# j& ? } & C2 A3 V# U. I. i } return 0; } : g' N; F4 j! j, l }- n. G1 _7 l 超声波接收数据 /*! ' `+ Z" w: @$ a9 @2 b& L * @brief URM04v2超声波传感器返回测量的距离或温度 * @since v1.0; o* L4 r4 R! P0 K" }3 G * @param None * @return 测量距离 -1表示上次测量超出范围或不成功 * @author Z小旋, `* @6 Z" x, o7 h) ?4 J' k */9 O$ U3 E H: C% v5 D ) ]$ @) W4 U4 i4 r% E6 [ int ReadDistance() # \+ d& L! c3 }# B& K: h+ K {7 Y+ z a6 v! k% }. S; l u8 data[8]; unsigned int temp; int counter = 0; int result = -1; 6 U" c" t0 T6 q. }& |4 F8 d- g int i = 0,j = 0; for(i=0;i<200;i++) //数据缓存区最大为200 我们就循环200次9 v) `0 f* L I' E4 \+ } {* e* J- T8 z1 }* c. P - c; l% X( c# @% B4 R v1 h if(USART_RX_BUF==0x55&&USART_RX_BUF[i+1]==0xAA) //检测到回复的字头 { % L. \" V0 Y: a% ~ " b* o) i. [ x+ m! i* v! r for(j=0; j<8; j++) 7 e) O/ F1 R% X; D+ E1 ^9 b { data[j] = USART_RX_BUF; //获取返回数据' z3 @* G5 ^' v' M6 P i++; } if(data[3] == 2 && data[4] == 2) //如果为距离 桢长度为2 命令字为20 G% B' o7 K& i5 R1 K; `8 L {! x* }5 ]5 ?* E/ @) i // result = (((unsigned int)data[5])<<8))|data[6]; 数据合并 如果需要测到255以上用这个" N( {# ?# `- T, a% U. W result = data[6]; //返回所测距离 最大255 } * t- i1 m- ?! a if(data[3] == 2 && data[4] == 3) //如果为温度 桢长度为2 命令字为39 J9 @; H% i# \2 i7 C* t3 g {6 `! u1 v. O8 y* r4 h/ b3 u7 j4 e5 U+ v if(data[5]>=0xf0) //高四位都为1 温度为正8 u/ k* r v; L: D2 G) W1 | { // result= ((data[5]-0xf0)*256-data[6])/10; //返回所测温度- b8 ?" ?& Y& q R result= ((unsigned int)(data[5]-0xf0)+data[6])/10; //返回所测温度 } else 温度为负 { # e! \6 T5 Z2 n' F //result= ((data[5])*256-data[6])/10; //返回所测温度 result= ((unsigned int)(data[5]<<4))|data[6]; //返回所测温度3 |; U" m' A9 b }: d& z6 }9 l; X9 |' x Z } USART_RX_STA=0;. B" P( g7 ^( t. F$ q return result; } else % u: q, {4 Z1 p' O+ E { delay_us(250);: Y% }+ ] ^+ S! g6 m counter++; if(counter==200) //如果50ms还没有数据返回,退出测量并返回-1 l; o7 }* ]0 b% u2 V* f3 c5 V- f { return result;2 D$ X; L! i* a6 h } } 8 t {6 u2 x# C& |! b1 N) [; A } } # s% n& t3 n3 X) U ; t) x. t4 Z9 e$ y" u' T 这里只接收低八位,保证最大能到2.55米 ,如果需要测得远用注释的那行就行,还有很多事,本来想写一套完整库,但是没很多时间,就到这里吧,没有心情去继续完善这个了,万分抱歉,很您可以参考一下,希望能有一点用 ,不足的就是接收数据,需要修改UATR的接收中断的数据处理,我改的不满意,就不上传了* x- G2 o8 y) P. j2 ]5 ] 您可以自行修改,还有要注意检测不到数据需要及时退出,不要死等,单片机里最好不要有可能是死循环的存在' k: Z' g2 P! _ void distance()$ p0 M. j" }$ ]# ^. v) }. ? { ; V* g m2 M, G% F7 _# M. [ int Distance=0;/ ~: O& w$ |3 D/ d+ ^ MeasureDistance(0x11);) z4 V0 h- h; |1 p4 p* L6 Y9 j Distance = ReadDistance();8 i' p7 O& q B& ~! X- ~( M6 T delay_ms(1000);, Q5 [! u- \: o2 d. w# ^: l } " f$ {4 @; K1 S0 j$ E* V8 q 8 Y3 G! ~; r* P6 A' ~ 1 l/ {' ^" |1 b- m |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版