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

【经验分享】STM32送药小车:Openmv与主控芯片STM32的配合

[复制链接]
STMCU小助手 发布时间:2022-5-10 22:48
前言9 m/ w) N, j7 q0 f' z/ O
我们通过分析从Openmv中发送到主控芯片的信息,从而对小车进行相应的控制。
" g- O0 O* a( A% F# ?% @+ e9 K; g) F& b: |" D
一、接收信息的处理  K9 `' O) f7 @6 {- L
我们使用Openmv发送的打包数组中,其中第1个数值为小车的状态,第2个数值为中线偏差量,从而使用的通过分析打包数据,对小车进一步控制。- Z" x  e; `6 [6 C

9 C4 T- t; D+ x/ z9 Z8 p0 p部分代码如下:
0 n. k) S% U1 }' r9 p4 c/ g
6 p  ?. }4 c( |
  1. void Blueteeth_control()
    ; w2 L- N8 n1 X& s% d, n
  2. {5 O! Y0 X( J5 r6 \' N
  3.     unsigned char uart1_data;
    9 L5 b9 U% Z% b$ P
  4.     while (HAL_UART_Receive_IT(&huart1, &res, 1))5 x! L, ?9 l: Q6 [- r' E# a( r
  5.     {& }5 r! i1 O) \
  6.         state=res[0]//接受传回的第一个值,即状态6 A- P' t2 s5 p' D6 K0 \# z
  7.         angle_error=res[1]//PID角度偏差,先储存起来
    % B! l" ]5 Y, n
  8.         switch (state)( p$ D, N) w8 K9 B( g
  9.         {  W' ?: K! g6 v  K
  10.             case 'x':Motor::RunPID(angle_error);break;//正常巡线
    * |  f4 L* q& V& L' p" _
  11.             case '+':Motor::PID(0);break;//十字停车
    * x7 ^- l# G1 s
  12.             case 'l':Motor::PID(1);break;//左转4 V! z4 L  o9 A6 w
  13.             case 'r':Motor::PID(1);break;//右转  q0 D  Z2 s8 o# e; m; N9 W
  14.             case 's':Motor::PID(0);break;//到达黑色虚线,停车
    & \0 B7 M5 N1 L; J& k4 @* }; G" j+ k
  15.         }
    3 \% A' U; g+ x- u
  16.     }. n. A' k& ~; ^# V& M
  17. }
    & i: Z4 V/ g2 I0 r- O2 E
复制代码

! W4 j( c0 c. p. G$ N1 n% a; J二、电机PWM输出
" j  m( H6 J+ t( g& u! [; ^1.正常巡线( p9 m; p8 Z5 F
因为我们是三轮车,左右转依靠差速来实现,所以我们利用差速因子来对中线偏差进行PID调控。
- R! ]8 U8 R! A9 ^- i
* O7 J) b- g( y' }6 S* I4 Q代码如下:
( l- w" `- w$ M, L6 W5 _6 a+ h4 _! g9 J
  1.   if (error >= 0) //右
    8 X- [1 G* k3 ~2 N) ~& Q9 O
  2.   {
    8 t. Y/ s' M8 T3 f) `2 X6 H$ m5 n
  3.     L_motor.exp_speed = PWM_default - (int16)(Island_l_reduce * error) - PWM_decrease;1 f, M6 @+ x& |
  4.     R_motor.exp_speed = PWM_default + (int16)(Island_r_add * error) - PWM_decrease;
    * ~& d5 T& t) V2 b, l# t, a
  5.   }
    " m9 I% |* ]; m8 V' g
  6.   else if (error < 0) //姿态在左
    ! \" `, ?3 {/ s) x
  7.   {
    ; }/ Y+ G& d; U
  8.     L_motor.exp_speed = PWM_default - (int16)(Island_l_add * error) - PWM_decrease;
    3 {* _. F2 x# E7 z
  9.     R_motor.exp_speed = PWM_default + (int16)(Island_r_reduce * error) - PWM_decrease;7 K+ ^6 m5 ^: n  N
  10.   }
复制代码

' t# A. o0 o$ W2.特殊标志位
9 J0 X: s/ s6 D, U; v6 p5 `/ N1.停车

7 a3 [2 K6 P5 P$ r7 l停车我们直接让四路PWM等于0
, ?" s! x% ]+ a7 `, @$ V2 t' O$ k+ a1 r' E2 p
代码如下:
, z- M% O1 H# K; V  m' z! j$ h, t+ l$ D/ M
  1. void Motor::Stop()
    ( ?- M* d% t5 o0 g/ B& e
  2. {
    4 h/ I& G; m3 F: @  E) J/ _4 z
  3.   Motor::PWM_OUT(0, 0, 0, 0);7 F! S% E6 k% d" c
  4. }
复制代码
9 I! x% z5 U. X) |: N& A
2.转向
! N+ z1 b3 s# v" @' X我们通过左右轮的差速进行转向,通过MPU6050判断是否达到相应的角度
- n7 Z# L& m" g" _; [! ?/ K& ?5 i, e) l+ _5 f
部分代码如下:: q* Y5 C% w: T) e% |

+ h* R7 {1 O6 C  o( ?
  1. void Motor::Turn(u8 dir)
    / O+ q# m* m  q& i! N
  2. {8 |: Y+ A# _8 u, w
  3.   switch (dir)/ \! P! I4 _  a7 S- v
  4.   {
    7 a$ c1 [( Q' J8 U
  5. /*左转弯*/4 i* l) H& p' G' f, ?8 {' u
  6.   case 1:: d4 d/ s  S/ [# ~- C+ F  T
  7.     Motor::PWM_OUT(0, 2000, 2000, 0);
    . S9 m6 D/ ~) q# v
  8.     break;+ c: J1 }' ]5 E, T
  9. /*右转弯*/  2 S* X6 Z, [7 e2 p" D) s4 u% B/ G
  10.   default:- Q# g4 t: y# a. s! e
  11.     Motor::PWM_OUT(2000, 0, 0, 2000);
    8 A- Q) }) ~6 W, o* g( Y
  12.     break;
      x1 J( s8 t# J# m# s6 p
  13.   }. y4 B5 p) g1 R, @# }
  14. }  
复制代码

( v+ f5 {% ?' F8 e8 b& S- y  s7 y6 h7 e5 L& K7 q( W1 m6 b, Y
总结
+ y4 W8 E4 S. |这个项目是完成了大部分代码,但小部分没有调试,因为个人时间关系也是不会再去完善和调试的了,这些思路希望对大家有所帮助。/ U. |9 h8 D, a1 a% ]* j
0 h3 o/ {" n5 X  U: O3 D; L% G

5 Z+ o+ i2 @' B. e$ \& K6 y% M5 j9 |3 f
/ k" u! p- a/ a5 S+ B
赞 收藏 评论0 发布时间:2022-5-10 22:48

举报

0个回答

所属标签

相似技术帖

官网相关资源

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