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

基于STM32CubeIDE驱动无刷电机做的动量轮平衡自行车(四)

[复制链接]
STMCU小助手 发布时间:2023-2-9 17:42
背景" V' ]' ^% T6 m5 b2 V
        本文用于记录平衡自行车的制作过程,及制作中遇到的问题;总体方案如下:采用采用STM32F103C8T6作为主控单元、MPU-6050作为位姿采集单元、0.96寸OLED显示位姿、无刷电机带动动量轮调节小车平衡、1S锂电池配合5V和12V升压模块作为电源、蓝牙模块用于无线控制及调试、SG90舵机用于控制行驶方向。3 ?1 ~7 J) b, f6 C

& z  X6 \. }7 ]2 n/ f无刷电机简介8 }3 P4 Y* d6 k3 P, |6 n. M
        我用的无刷电机是在TB上淘的便宜货,小日本万宝至无刷电机,内置驱动,带100线双通道编码器,12V-24V的电压下均可运行。
  y' ?$ ?% }! J: t" |
5 o' q  i- d/ _) w/ Z
21ZNG9V]}G9}`O~$RJD~PD5.png 3 g/ l  c: E, R; V4 U
* e3 G  u# b. ^7 I
无刷电机驱动
! e6 a7 I3 c# |' g& v( c        在上一篇专栏建立工程()的基础上,使用外部中断测量电机转速,使用定时器3产生PWM信号控制电机转速,从而实现电机的闭环控制。
; K( Y% [' K7 K8 S7 F* Q! s# X# L9 T- K
1、STM32外部中断配合编码器测独特速度
# J/ Q% {, j- E& l

' Y" W, _7 s/ v: P/ m将编码器A相与PA3连接,B相与PA4连接,并且连接编码器VCC、GND。+ z" u- S9 x' R' j

7 k) Z4 F/ ]% I& F# l( t7 Z
在mian.c文件中重新定义外部中断回调函数:
  1. /* USER CODE BEGIN PV */
    0 t* Y# l! x/ j3 J! b
  2. int32_t counterA = 0;* I8 {  z4 X$ Q( s4 ?4 B
  3. //重定义外部中断函数  Z! E3 l. u" l# s, Q. L1 u# E
  4. /**% h) l: U3 K' c& w, l3 \
  5.   * @brief  EXTI line detection callbacks.+ H0 [; x2 O; E
  6.   * @param  GPIO_Pin: Specifies the pins connected EXTI line1 Y3 \9 D0 \5 h
  7.   * @retval None
    : s. N- }& B1 ?) V/ y9 W) r
  8.   */
    7 L% a0 {+ F8 s2 I. ]& g$ d  x
  9. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    9 |" s7 W+ u) r: z5 Z$ z
  10. {; \3 `9 T* r& f- w
  11.    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == RESET)//检测编码器B相的电平,判断编码器转向3 i/ y- W. E- l1 ^
  12.            counterA +=1;
    . I  q3 V$ q/ v) h) F0 w* D, L7 [
  13.    else5 l+ n0 K  I4 H& N1 x
  14.            counterA -=1;3 _, N- U, S' W, x& O" C/ P) E% S
  15. }/ |& g1 P! I+ e! [6 q
  16. /* USER CODE END PV */
复制代码

1 ]6 H% O7 o/ r4 V3 D2 y" t; j在mian()函数while循环中增加在OLED中显示编码器运动状态的相关代码:
" ]4 T9 Y/ @  \3 N7 ?# y8 S8 }* G  |1 T4 i7 w- p/ g
  1. /* **********显示编码器数值*********** */   sprintf(buffer, "%d", counterA);//int32_t转换成char[]   OLED_ShowStr(10,7,"Encoder:",1);   OLED_ShowStr(60,7,"        ",1);   OLED_ShowStr(60,7,buffer,1);
复制代码

0 _7 j0 o9 t2 [最终演示效果如下:$ F4 G0 Y6 X* ^, q/ T
& U. K* A# y  T- ?
LTCC%{}`@99FN8TU52A2WQT.png ( ~8 ?; Q( ^# y8 Y- O# z
/ f+ g/ J1 j3 {0 ?! ?) a
2、STM32定时器PWM控制电机转速, ]" E/ o( h5 H' c, t

5 Q/ J! \+ J% N* p: e

% A1 T8 }; f0 b; z3 m' w$ z( K在mian()函数增加下列代码,打开定时器3,并设置初始占空比为1(此时为PWM输出为高电平)
2 X6 O5 i. M- S. S' V! f) Q% s+ e* S
  1. //启动定时器3的通道1,控制无刷电机
    ( j- ]; I9 u1 @. U+ b# q
  2. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);  C5 e$ j, `: p' O+ \
  3. //设置通道1的占空比,无刷电机0~1200
    " i1 G* v+ G$ C- f
  4. __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,1200);
复制代码
2 b( y. M9 _) Y0 Z" ]
在mian()函数while循环中增加下列代码,是PWM占空比由1-0逐渐下降  h' \  ]7 n! \1 ?/ S( i8 s( A
  1. /* **********调试无刷电机转速*********** */& a( |: I) T- U! A, R$ b: a
  2. static uint16_t brushless1 = 1200;
    9 n* r$ B+ ?4 F8 g* K
  3. __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,brushless1);0 b9 d  w2 I, Y- a: Q
  4. brushless1 -=5;1 _9 i6 w7 I5 |  s1 @9 k" M
  5. if(brushless1<=0) brushless1 = 1200;
    # X: G6 p& p4 x% W3 T
  6. & h& Q# d9 y; ?; n! g$ p$ k
  7. sprintf(buffer, "%d", brushless1);//int32_t转换成char[], B( W+ S: m- J* g/ `# P
  8. OLED_ShowStr(10,7,"BMoter:",1);
    " c5 |9 R0 }, ?, K  Q8 ^
  9. OLED_ShowStr(60,7,"        ",1);( M; r5 O4 V' t% X* B, A+ {
  10. OLED_ShowStr(60,7,buffer,1);
复制代码
: k; d  k( w5 |9 N$ m6 ~
通过测量PWM输出引脚的电压变化,大致判断PWM输出是否正常,如下所示:- O7 b* e& x% x, U8 i+ B0 @

0 Y6 \& _8 I% F$ W! s4 u' X) p
JNE8L%K7EIO6WUV7W{3UOVW.png
. v1 \) S( P: g' O9 u
3 v4 B6 f0 Y. W& T# e5 r! Y0 M
3、STM32F103C8T6引脚、外部中断、定时器3配置如下:
# n4 y  n) `* ]% H9 h6 i设置PA3引脚为GPIO_EXTI3;PA4引脚为GPIO_INPUT;8 E* X% d" U/ h$ ?
) ]7 `/ j) E+ Z
]13O5_K{{)`S)D2JA0P{BLD.png
9 t: K% }6 T* P2 j  l' O2 E- n7 v( v3 O  }0 ]9 W3 O5 e
打开外部中断3( x- T; \! Y4 b3 K

" U6 W2 U2 T& G5 Z
)AL0D$BCH9MXUIO@`0PW}U8.png $ {. R0 o6 W6 U6 k
0 |, {; D& c5 p! p# {! @" e
设置外部中断引脚PA3为上拉,触发模式:上升沿触发
; C& g8 l5 ?9 u' i2 o+ ]8 e$ H( G
% l5 M: \: }8 p. V3 O$ X( ^3 {, q
TX_QXT`5X`)X3}~5`XM%E_4.png
8 D' P" y* q6 M5 T* C
( m1 N$ w9 C+ m- Y8 ]设置引脚PA4为上拉
) l' u" x$ T) R; i
# S0 a, g$ S, Z, z) B
9XW@}7(2M%]9T)K[_FV%(.png 3 v* z# h, a* g

. Q- R6 W4 W  b0 `4 H设置定时器3通道1位PWM输出模式,PWM频率位20kHz(计算方式参考()),初始占空比为1000。. O8 z1 \3 Y! E2 t
: M+ m$ B5 \  @2 G* p" J+ V$ s$ x
_{8N]~`I4]QEILQNJ(5Y`9I.png
, x( n4 O, w: X
( _: q5 M" t' M( Q 作者:DIY攻城狮 https://www.bilibili.com/read/cv21718261?spm_id_from=333.999.0.0 出处:bilibili% V+ M. r) E' ?( C8 }4 F
+ S; m, _! z6 Z- l+ D
" V1 w" z) i! H( N1 P
赞 收藏 评论1 发布时间:2023-2-9 17:42

举报

1个回答
STMWoodData 回答时间:2023-2-10 15:08:58

学习学习

所属标签

相似技术帖

官网相关资源

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