上个帖子实现了单片机与PC端的通讯,现在使用该功能完成一个人体监测的小项目;- n# u, t$ v% P5 t
一:毫米波雷达知识分享:) h0 S. L! }9 B5 P9 A( r" p, f8 J
CEM5826-M11 是一款高灵敏度 24GHz毫米波人体微动存在检测雷达模块。区别于传统雷达通过检测人体移动的大幅度动作或肢体动作来判断人体存在,本模块主要特点是在传统人体感应雷达的功能基础上,同时具备检测积累人体微动幅度的运动,来判断人体的存在的功能。因此相比传统多普勒雷达来说,具备一定范围内的存在检测,准确率更高。不易漏报。
; {/ R% E/ V* F% R2.系统功能及工作原理简述
" a" A* v! B; v9 t7 U( l) ~% W本系统利用电磁波多普勒效应对运动目标进行探测。通过发射天线发射出24GHz电磁波信号,该电磁波信号遇到运动物体时会反射回带有频偏的 24GHz电磁波信号,此频偏即为多普勒频偏,反射回的信号被接收天线接收,通过对多普勒频偏及中频IQ 相位的采集计算分析可以较为灵敏地探测出附近的运动物体以及运动物体是靠近还是远离。当探测到有运动物体靠近时VO输出高电平,无运动物体靠近时 VO 输出低电平。
_% N% Q, Y7 S( R, k& U: _/ c3:模块的系统框架
" I K4 [- J% @& B Q# i6 p
; e5 P. L0 U Z) e4:模块接口信息如下所示:* c+ s: D) D5 n( a G' G, n
5 |4 A+ c y" e* b U2 ^% c+ }5:模块调试时候的几个指令:
) ^1 ^9 o) `: p: kth=**:检测闽值,默认值为 200。; h4 P1 p( B+ f# ^0 I. `; H
vmin=**:设置最小检测速度,单位为km/h,默认值为0。
# t2 `) F2 ?. Q% Q8 i: @vmax=**:设置最大检测速度,单位为km/h,默认值为100& s: x7 p Y: W
led_on_100ms=**:设置 led 电平维持时间,时间为 xx*0.1s,默认值为 10。2 N$ _) L! C' t9 ?
led_iflag=xx:设置led 指示模式,led_iflag默认值为0。当led_ifag=0时,高电平指示检测到目标,低电平指示未检测到目标。当led iflag=1时,高电平指示未检测到目标,低电平指示检测到目标。( q3 q e- m& B6 \
save:将当前参数存储到flash中,确保参数掉电不丢失
5 v9 L! O, C' b! J; c. n Eget_al: 获取当前参数值。
4 }7 m H6 [1 ]% c2 pVER:获取软件版本号。
N8 f$ o+ u( f" f+ B5 Q, L3 t* T基本的模块资料如上所示,下面使用cube MX 生成底层驱动函数;
4 c6 j5 i9 g8 o1 ?- @二:STM32 cube MX 软件配置:- F7 R+ N4 P# Z; J7 ]
& [1 q. f y+ n/ S6 i7 I
这里我们需要注意下,使用串口接收毫米波雷达数据时候,由于使用串口自动发送数据的模式,该款模块输出的速度太快,我们需要将串口6的优先级设置的高些,放置被其他模块所打断。
0 l7 n& k; I# m$ Q, R$ h) P三:软件代码如下:
8 g, K2 H. J4 I3.1 编写空闲中断处理函数,该函数中 在串口中断中被调用。
i( N. Q! X2 }: T9 f; r1 n- void UsartReceive_IDLE(UART_HandleTypeDef *huart) , f4 Y6 k: `- h4 {
- {/ a0 r9 t% A9 [
- if((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET)) ( \" D% X; _; K" D% ^0 w
- {
& o) M5 f$ A% k# H; g1 T - if(huart->Instance == USART1)
' R) C6 E8 d( n+ f. U/ N, ^0 W - {
1 n2 Q \% o7 z( P$ s* T* B& A+ x# l - __HAL_UART_CLEAR_IDLEFLAG(huart); l/ ]4 N. d* z- H: r" w" }4 r/ T9 z% ~
- HAL_UART_DMAStop(huart); & g& O$ y0 r3 Z% u1 F1 @) B, u+ R" ]
- usart1_rx_len = reclength1 - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx)); 8 J5 u( F( p8 ?" E0 B
- memcpy(Usart1_DEAL_RX_Buf, RecBuffer1, usart1_rx_len);/ I5 ~. j; Z% ~7 r, u4 j! P
- usart1_flag = 1;
2 v7 r) l0 h5 S, k0 D! H5 W& @ - HAL_UART_Receive_DMA(&huart1, (uint8_t *)&RecBuffer1, reclength1);) z. s {1 J0 _9 I9 {2 ]% _
- }
: a. n! ^, i, U8 X$ W4 r& w5 e" M1 C - else if(huart->Instance == USART6)$ V% e% ?, P2 y7 D. ` W7 _, ^
- {* \9 w! k2 r% K% z7 W4 u* ?: k
- __HAL_UART_CLEAR_IDLEFLAG(huart); $ b- v" N: T. ]2 S- X! z; [
- HAL_UART_DMAStop(huart); 5 L8 j+ B2 y% P) X3 U: r7 y
- usart6_rx_len = reclength6 - (__HAL_DMA_GET_COUNTER(&hdma_usart6_rx)); 5 O' T* N: T# d4 i4 |" j h
- memcpy(Usart6_DEAL_RX_Buf, RecBuffer6, usart6_rx_len);: |& r& p0 a% \$ d5 N5 W) T
- usart6_flag = 1; . Z( k& @% S# p* G4 b
- HAL_UART_Receive_DMA(&huart6, (uint8_t *)&RecBuffer6, reclength6);/ s0 c2 J- G7 l5 Q
- }
% \9 }! z3 B: x0 U - }% ?4 d4 N' Y8 w, `9 C% C
- }
复制代码 3.2 其他主要代码如下所示:9 I! B9 x7 \9 x! ~- X# S- R: E
串口中断处理函数
0 Q9 B; ^/ P* ^" c a- void USART6_IRQHandler(void)
1 A9 j3 j. Z; M7 y: @9 P/ `- ^ - {& V v C/ e, S. o* [! }5 E
- /* USER CODE BEGIN USART6_IRQn 0 */( C- p& j( [. t/ D! Y
1 A6 {$ f: a6 Y2 u& T& l& Q- /* USER CODE END USART6_IRQn 0 */
1 h) o+ C( `) ~' G( s - HAL_UART_IRQHandler(&huart6);8 P# ], @# F( g4 r- ]
- /* USER CODE BEGIN USART6_IRQn 1 */
; f, p; q2 `2 C+ ]1 m" K' B - UsartReceive_IDLE(&huart6);
3 [/ A$ y8 ?6 k, L - /* USER CODE END USART6_IRQn 1 */
* {" T. ^; }* ]$ G; P% U& { - }
复制代码 主程序如下所示:9 ?. g+ d, {+ \4 V2 j7 W
串口6接收到一组完整的数据后,将数据发送到串口1的PC端; f: E0 c3 J6 O+ M1 ]6 i
- if(usart6_flag == 1)
7 r4 i) x9 Y" Q. M - {
) N3 v& J# j) R - usart6_flag = 0 ;0 W% t4 J* w. E' I
- HAL_UART_Transmit(&huart1,Usart6_DEAL_RX_Buf,usart6_rx_len,100);! k/ X4 h7 G9 ?; o; `
- // printf("Hello STM32! Hello congcong! Hello STM32f769!\r\n");
2 `, X* ]: ]! a' I. K - }
复制代码 四:实物监控图片如下:7 e! I, X! V; s2 }
- h7 r9 @; h( a; U$ F$ y% T+ v5 E0 M. d
后记:这里重申一下中断的知识:1 D* F6 Y9 C# O+ r
$ g6 f9 i* C4 e. d, o/ tSTM32的串口中断是指当串口收到数据时,cpu会产生串口中断信号信息,通知单片机内部的中断服务函数去处理数据。此时,在串口中断服务程序中,我们可以将数据先放到串口的接收串口缓冲区内,当把所有的数据接收完整时,再去调用串口处理函数。7 I% h9 A2 G0 C9 v$ R) x7 B
通俗的说:串口中断服务函数需要使用中断接收功能实现。当有新的数据到达串口时,单片机触发中断请求,从而程序运行到中断服务程序里面。中断服务程序在处理完接收到的数据后,可以根据当时的要求进行处理。% ^! d# [; b1 A
采用中断的方式优点是:提高单片机的运行效率,减少了资源浪费。% W! F: Y" P' V
% j9 |6 m7 ~+ A6 g1 u( f2 ?总体来说:使用Stm32 cubeMX 软件来开发项目还是很方便的,欢迎大家一起交流学习。, u. Q2 d# z! g0 V8 _6 f0 v
|