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

STM32控制舵机转动_从0到1

[复制链接]
STMCU小助手 发布时间:2022-11-25 14:06
MG90S舵机
' M5 I1 Z% Z$ D8 S/ X如图所示,舵机有三根线,红色接5V正极,黑色接地;黄色为信号线,接收PWM信号* K5 E7 j- e4 E* g; }0 N9 T
8 b* ^- S+ K; K& `0 G" l
8b9227d0e9874d9994fcaee9d912ca7c.jpg / t3 Z1 u- Z9 B& ^
8 I( e' ~1 C/ c: Y4 Y
实物图
, e& N9 ?6 ~+ A+ x7 M8 z  O- |$ H* N5 e- \
9ec540d0713c4bafafab0fb680229cf9.jpg 0 T; x$ m/ r% l: z7 t$ |
: Y# z$ |5 n6 Z( [% v" H  |
输出PWM控制舵机4 O, ~( k5 }8 I( {& b
STM32控制舵机,总的来说是向舵机信号线发送周期为20ms的PWM(Pulse Width Modulation 脉冲宽度调制)信号来控制舵机转角,PWM脉冲的占空比决定了舵机的转角位置,对应关系如下图;
& N% k, w9 x( u: X4 R& y9 }6 B  L. q
5c0787f2ee1c439691168c4195543b8f.png 8 v' \7 I1 z& N/ {. l
8 ]" [! V% @3 Y) g; O" Q) ~
STM32靠定时器TIM实现PWM信号的输出,STM32有多个定时器,分为通用定时器和高级定时器,每个通用定时器都可以输出4路PWM,本文采用TM2_CH4,及定时器2的第4路PWM;对应STM32F103C8T6上的PB11引脚;
% x4 c. ?9 o1 k; x
, b" r- U1 {1 ~1 L4 U1 a1 [创建工程输出PWM6 l+ _! m1 W( Q4 V9 }2 V  ?
本文使用STM32CubeMX创建工程,更加简单高效,即便对单片机不熟悉也可操作成功;8 y' x; c2 t0 N: K- e% K- S. m
9 W' z. v3 C" Q: z
一、打开STM32CubeMX,新建一个工程,搜索并选择STM32F103C8,然后start project;
' i! S, [7 i4 [3 ~. L0 x" w+ f7 {- v( w( ?
, H) G& ?+ S; p% R6 h eeeec04bd7ad4471bd59b8c827f59d84.png - v6 y! e. y1 H+ e) p5 e0 H3 d9 O' A+ ^
7 q* [4 Y3 g) n4 S
二、进行基本设置,配置RCC、SYS、HCLK
2 i; M, t) Z* O" l+ U% S  ~1 W8 m% ?' R$ K
RCC -> 设置高速外部时钟HSE 选择外部时钟源, r7 L+ P$ u# C- H, \- B
SYS -> 选择Debug方式 serial wire  W% j. n8 J+ H2 }7 [; {0 @9 F
HCLK -> 设置为72MHZ' d$ \. l+ @+ G' w/ a
0 B( P6 K- j) @, b. R
25780c297e424bb1ad28900218ed3255.png 2 h, i; e# _6 ?
48835eaabb59415f82f22f5a5eed7927.png
! I) {9 t+ K+ N/ l# C) p" I0 ^, |8 X; b8 L6 w& Y% M
be6004363d9f4dedbd5b2c0c1740f630.png ! q1 Y( {/ d2 {0 {( j1 l# @
1 g% }- E4 p, C! J
三、设置定时器
4 W% O; k# @5 y, s1 f: j
1.选择TIM2
4 J0 `# |* {' [5 i3 j* F2.选择内部时钟源
/ i& E6 \  |7 t3.设置Channel4为PWM模式/ F# K) t; b  U& K4 j- L( ^4 B$ L
4.右侧对应管脚自动设置为复用模式7 L) ]% R: Y5 H5 W- W' t! u/ ~8 x

$ T2 @0 ?: B! d) H- d; g) T a07a765fb4114ac2a3313f51c8423d80.png
( _8 i% }# e$ F) Y6 h" Y4 D% ]' k7 s, P/ O
设置定时器参数/ b- ^' {5 X5 d6 }1 B
控制舵机我们需要设置PWM输出一个周期时间为20ms的信号,定时器时钟为72Mhz
, N3 c3 v  J% j* w( Q1.预分频Prescaler设置为720-1,则单周期为72M/(Prescaler + 1) = 100Khz(0.01ms)* U- S; ?. q) S+ M* a0 y
2.以20ms为周期,则Counter Period为20ms/0.01ms - 1 = 1999, E) C9 H0 c6 e, A: z; |
3.此处可设定默认脉冲宽度为0.5ms,及0.5/20*2000 = 50
  i4 w1 {  y" J0 [; C8 X; I# m( ?$ G5 T# U
baf8eb22dd2840ecbf7105fa69d164ca.png 5 P$ r1 l" |2 Q$ _4 m* P5 W
2 F4 F) C3 Z$ {6 f
四、接下来设置输出格式
9 `% N2 b) g1 l1.添加工程名PWM
# t# W+ m6 M: Y& M) `: O* K2.修改IDE为MDK-ARM V5
2 J; }. O, Y; o. K3.在Code Genetator中设置包含库与工程格式
0 ~* w8 F$ W& ~/ H0 c4 A( A+ a( |+ y5 u7 R
49b330d2d3554e41ae3cb8e37baa5e2a.png 8 f" G4 v5 G" y/ g1 x9 U6 k

  O( d' s3 N3 N* j* p( v+ q9 l8 q d540349764bd4aa8b11270431fd5dcae.png
4 N( A- O/ K5 R: I1 U" {6 |* @, m: x5 `
至此STM32CubeMX已设置完成,接下来GENERATE CODE,并打开文件;& F, }+ I. U) U
在main函数中启动定时器,并输出一定的脉冲的PWM信号即可驱动舵机;
+ H2 E2 F( |, P9 E! M" s
# K- o" O% a2 B! _! o- Q( s: k% |五、修改代码

, y/ Z- J+ j( A" h4 i& G
7 B4 @5 b1 l' u$ ~在main.c文件相应位置处添加如下代码
3 q# @# P. x1 ^! v  a" R" B: X4 Q! y1.启动PWM输出
( I( }  ]9 o2 |7 U( p4 x9 J2.输出PWM信号; \2 Y1 {' h, B! x6 n+ n5 `# z" r' F
, E9 z& ^" K  |$ u' ~/ Z
  1. /* USER CODE BEGIN Includes */
    2 @% m5 E! h' y8 H! s% i8 A
  2. #include "stdio.h"
    - l" J. C: p9 g( [" N* s: W2 ]% H
  3. /* USER CODE END Includes */
    9 D3 Z; a& y1 M& W* [! D3 y! O
  4. * D* `0 @  ?$ ]7 Q: E
  5.   /* USER CODE BEGIN 2 */* S, [. z- k- ]
  6.   HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); //启动定时器
    $ H* J6 p1 V$ m+ C# [
  7.   int compareValue = 150; //将compareValue设置为50、150、250分别对应0°、90°、180°# a& t* t" f* n$ `) v4 D& x
  8.   /* USER CODE END 2 */
    . U  [  V2 @' \

  9. % S" _. m3 r/ X! U; |2 D
  10.   /* Infinite loop */
    5 w8 t( v' g  J4 @) _
  11.   /* USER CODE BEGIN WHILE */
    2 p2 E* f) g. v
  12.   while (1)7 J3 |$ e* a5 H, @% R
  13.   {6 ?6 L( N7 g# x" a
  14.     /* USER CODE END WHILE */( f( Y, l/ E3 [
  15. 5 P+ A( _4 y0 f, _$ w: y/ }7 ?" F
  16.     /* USER CODE BEGIN 3 *// Y4 u) o4 E5 b, {: D3 U
  17.             __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, compareValue); //输出PWM信号
    3 R9 i0 m, {  n! S
  18.                 HAL_Delay(10);) c$ k1 c' W- k6 b+ F
  19.   }7 x/ f0 x- M3 _
  20.   /* USER CODE END 3 */3 J9 c  \) C4 \( L# q: Q! r" i0 G( Y
  21. }
复制代码

6 F, n. K3 h. C+ {添加完以上代码之后,编译,然后通过JLink将程序LOAD到STM32F103C8T6,将舵机信号线连接PB11(TIM2_CHANNEL4)口,并接上电源,舵机即可转动到指定角度;由以上定时器设定可知,compareValue值50、150、250 对应 0.5ms、1.5ms、2.5ms 对应 0°、90°、180°;若想让舵机连续转动,在50~250内循环改变compareValue值即可;' `0 `$ ~+ D9 o3 j- g* W1 \" a

8 p( Y5 g8 I" Y; E7 `' ?六、接线! I: G, F! \/ C# R7 G- d
开始时用单片机的5V输出给舵机供电,舵机哒哒哒响,但是不转,怀疑是供电不给力,单独供电后驱动成功;0 F0 _2 _/ v5 ~  {/ N* F
1.JIink连接电脑和单片机,下载程序到单片机并给单片机供电+ c8 H- X* k4 P& _5 s- R
2.舵机黄色信号线接STM32F103C8T6引脚PB11,接收PWM信号
8 L- P) J9 Y2 C" S3.舵机红色电源线接稳压板5V输出正极,舵机黑色地线需与单片机地相连6 z& U* q+ i# }$ p; f

  U) R# `9 R, p% r5 \2 S; s: I% v a92ea509c14347ac9134c4ab7338fdce.png
. D+ L% n# A: d& E9 D4 p: N8 L( r2 f" v; x6 q9 F
调试0 }, t; X8 U$ d0 V$ Y- T: N/ n3 F
实操中可能会出现各种各样的问题,以下有几种调试方法% I3 }  v+ I+ M) V7 G2 P0 S

$ U' N* N  d5 `5 K! \9 Q一、舵机测试$ a8 j: C8 c( k- c/ [5 [0 R
. L, W) K( E  ^2 g9 W
调试模块一端接电,一段接舵机,手动模式下,舵机会跟着旋钮同步旋转,可以用来测试舵机是否健康;. K5 a  M& F6 M. [

/ t% ?0 \$ q$ Q/ f' K6 O2 [ 79cc39aeab6141a7a39e150c8b2d409f.png
- F) l. O- i/ C4 e7 T. ]
& l9 q8 |/ v2 L6 ~二、串口调试助手
! K" {/ c% B5 j: ]
: r; w: R1 v. F4 r$ s 8662dba698744fe88a00b99b0e14a289.png / b5 l( _" t5 L7 A* v1 q' p
% R$ \2 c0 q3 ?+ X8 v) u4 B# D
可下载串口调试助手,用ttl转USB模块连接电脑,在特定位置进行打印输出,检查程序是否按预设运行! c5 T/ Y; m8 s

: ]$ a1 K" `1 l- D————————————————
6 D- M6 u! i8 t版权声明:DDHEJKS
2 {6 t5 Z' m# g) e. l3 p0 }. g' p7 D, {* M/ w/ A

) p: h& a* E% I7 u! }5 a! q+ C4 V
赞 收藏 评论0 发布时间:2022-11-25 14:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

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