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

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

[复制链接]
STMCU小助手 发布时间:2023-2-9 17:42
背景& [8 `& t, Q% h5 L. G
        本文用于记录平衡自行车的制作过程,及制作中遇到的问题;总体方案如下:采用采用STM32F103C8T6作为主控单元、MPU-6050作为位姿采集单元、0.96寸OLED显示位姿、无刷电机带动动量轮调节小车平衡、1S锂电池配合5V和12V升压模块作为电源、蓝牙模块用于无线控制及调试、SG90舵机用于控制行驶方向。
1 M6 P4 r+ P  v& I, O9 x8 m: w3 l- \# X. f4 m
无刷电机简介; r" R2 H( a& H  _) M% O! R' p
        我用的无刷电机是在TB上淘的便宜货,小日本万宝至无刷电机,内置驱动,带100线双通道编码器,12V-24V的电压下均可运行。
0 H9 w9 G4 s$ S6 e! i6 G* }: d) K
, `" y2 S% ^  k
21ZNG9V]}G9}`O~$RJD~PD5.png
: M6 O! J3 Z! L

6 T, v0 n+ n* C( c无刷电机驱动7 M! B! N" p) x9 @& v* X$ I; r. v/ b/ W
        在上一篇专栏建立工程()的基础上,使用外部中断测量电机转速,使用定时器3产生PWM信号控制电机转速,从而实现电机的闭环控制。
6 g% H8 ~3 _$ J6 m/ m
: N* {1 X: Q- r1 x1、STM32外部中断配合编码器测独特速度
% W$ L0 I5 M6 L$ h% {
: q4 a" j/ H) ?- A0 t3 ]
将编码器A相与PA3连接,B相与PA4连接,并且连接编码器VCC、GND。
  ~) a) x; g( Q. a  F# A2 ]! @, q# X5 k/ s; W1 C1 C
在mian.c文件中重新定义外部中断回调函数:
  1. /* USER CODE BEGIN PV */( c) c7 I  g, R3 z" D0 |9 h
  2. int32_t counterA = 0;
    , Y# D4 d' W' |" |' W
  3. //重定义外部中断函数8 R+ @2 M3 m* B: U# j1 X1 H1 a
  4. /**2 S' N  c% X8 `* F2 j
  5.   * @brief  EXTI line detection callbacks.1 Y7 h4 R, G* @: O% w' }- h* I
  6.   * @param  GPIO_Pin: Specifies the pins connected EXTI line. }$ g. k4 A8 e( t
  7.   * @retval None
    5 n7 p5 W6 A1 ^3 R6 t& c5 D4 u& e0 m2 @
  8.   */9 c! _' t4 o4 @5 P) {+ B
  9. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    0 l3 `1 b, Z4 B; D1 q; y5 T
  10. {8 e. v  k# @. W2 F3 ~: Y  c
  11.    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == RESET)//检测编码器B相的电平,判断编码器转向
    - Q7 f5 H) B7 h: E  k6 K
  12.            counterA +=1;' _$ n3 K; A0 l' C4 x9 m
  13.    else
    1 g7 d1 V0 D4 J4 n3 f2 F
  14.            counterA -=1;; R- e3 u7 o, ]/ n$ O# O. ^- T
  15. }
    ! Q0 e; F" F) G+ T; Y. t
  16. /* USER CODE END PV */
复制代码

" {$ [6 d% p, j9 f- Z* G在mian()函数while循环中增加在OLED中显示编码器运动状态的相关代码:8 F9 ?6 W8 A, V( O! B8 J

' n# N" k' E6 l& ?
  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);
复制代码
, s8 F+ m! n: i" y7 C& t
最终演示效果如下:; I) c; a8 I  U2 S. J

% p) V( R9 s0 ]" y. P$ J
LTCC%{}`@99FN8TU52A2WQT.png + W# C, R& z# n
; C$ _6 Z2 _  I9 |
2、STM32定时器PWM控制电机转速
% y' i5 N/ \0 X! A1 Q% q
: ^; X& c% G7 w! D: F2 [  z, \$ d' `
2 Q) L6 o% A/ L9 k: D0 R( \. S, e0 b
在mian()函数增加下列代码,打开定时器3,并设置初始占空比为1(此时为PWM输出为高电平)5 f" T* _4 t' ]9 c/ Q* `, H

- q- ]( x# E# T9 c5 z( F( }
  1. //启动定时器3的通道1,控制无刷电机& z2 ?( h4 @! b' w4 E0 y; ?
  2. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);: p" k5 _9 A# [+ C- p
  3. //设置通道1的占空比,无刷电机0~1200' y. S6 [# [  z4 m0 U! p5 v; N! E
  4. __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,1200);
复制代码

* `# @3 s! I1 A. w4 k+ q7 ~/ j在mian()函数while循环中增加下列代码,是PWM占空比由1-0逐渐下降
6 R, m2 p( w+ G7 {; J& Z
  1. /* **********调试无刷电机转速*********** */( x$ |1 Y* }+ Q, x/ c
  2. static uint16_t brushless1 = 1200;
    + ]5 o& t, r* l" H1 q! G
  3. __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1,brushless1);5 G) Q; Y: H) d
  4. brushless1 -=5;  U* O, E0 l% Q9 U1 ~0 m
  5. if(brushless1<=0) brushless1 = 1200;0 t" A- z0 i4 g7 G" o* S( L

  6. 1 t& n, r8 f1 ]* p- B! P
  7. sprintf(buffer, "%d", brushless1);//int32_t转换成char[]; f& v" r7 A8 j7 k( p
  8. OLED_ShowStr(10,7,"BMoter:",1);
    - P8 D  i6 t7 ?/ M5 F& n0 I
  9. OLED_ShowStr(60,7,"        ",1);' ]' _% M: D' f: A1 q2 Z# G" ?
  10. OLED_ShowStr(60,7,buffer,1);
复制代码

: f- _* a# `) E通过测量PWM输出引脚的电压变化,大致判断PWM输出是否正常,如下所示:/ i4 o3 V+ j% O, Y5 V

0 q5 m& d; w6 r
JNE8L%K7EIO6WUV7W{3UOVW.png
6 C' ?8 w' n) S: `

. S2 R8 r" c7 s( K; |- B. s3、STM32F103C8T6引脚、外部中断、定时器3配置如下:
* `0 C7 a* m7 s3 ~2 b4 V3 k; c设置PA3引脚为GPIO_EXTI3;PA4引脚为GPIO_INPUT;* Q" f: p) J, s4 N3 V& A

) m& y9 B/ b1 Y/ [. ^  j
]13O5_K{{)`S)D2JA0P{BLD.png
; A7 Q, v2 j$ p; M0 P; ?9 h5 c# ^- ~; w; ]0 c! t: }
打开外部中断3
# [# o5 E9 Y, b: B3 P$ c& a- M; F' a# l1 ^1 v  ^. |( _
)AL0D$BCH9MXUIO@`0PW}U8.png
( @2 d7 Y4 r7 s" _0 S
# m" n! `/ h& f4 M0 x( T( P
设置外部中断引脚PA3为上拉,触发模式:上升沿触发" H2 Q' m/ ?, l5 V) u* U

% v" b7 V  m4 F( I4 o
TX_QXT`5X`)X3}~5`XM%E_4.png
. I  R* q" X4 ^4 \, @. j: s! r$ E4 l7 }* F. u8 b
设置引脚PA4为上拉
" M3 s1 b) Y0 C' W
  G4 L. E) E/ G$ @/ E* {. W
9XW@}7(2M%]9T)K[_FV%(.png
7 n0 W5 D6 z4 @' Y8 m

; G; y3 u* Q5 b4 L: i. Y. i4 B5 T设置定时器3通道1位PWM输出模式,PWM频率位20kHz(计算方式参考()),初始占空比为1000。) V4 U* h# z; t" A5 \, {

! E1 G! q: w8 a& q+ ^( P- y) W2 f _{8N]~`I4]QEILQNJ(5Y`9I.png
7 d5 c4 ?! }+ K  c- g, Q, f" c+ R  f
作者:DIY攻城狮 https://www.bilibili.com/read/cv21718261?spm_id_from=333.999.0.0 出处:bilibili( m, ]" D' V+ P
1 D% m6 ^( Z4 f! _2 a

5 L" G# ~4 U6 ?: O& D, 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 手机版