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

【经验分享】stm32Cubemx实用篇(一):PWM控制SG90舵机

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:28
一、SG90角度与PWM转换关系8 V0 x1 O2 g8 y: q+ |. _' D
舵机参数:f=50hz,t=20ms 根据选用的SG90参数,我们需要给出周期为20ms,其中高电平时间为 0.5ms-2.5ms的信号8 H. o. `, F* |: a- ~, z
0.5ms-------------0度; 2.5%0 |" ]/ E7 m+ V# c% [0 a
1.0ms------------45度; 5.0%
  c1 l4 ]6 E" h2 f8 a6 P- A1.5ms------------90度; 7.5%: e( h" M; f$ \  s; ?
2.0ms-----------135度; 10.0%
& E$ K: {9 K0 f+ Q9 T2.5ms-----------180度; 12.5%
6 W- x1 w- G! v. F5 P/ \: ?! j7 C/ `; R& Z. B8 A' B6 }
二、Cubemx参数配置$ b( m4 S8 p: p
1、时钟配置
. K) n6 T& O9 q  B: c* H) J4 b! m. q
WWB4FO4}2AAAF[VL8Q[K12H.png
* j' H5 v! g7 P0 A0 y7 L& {/ G' F, J& [: m& y9 r) r
2、定时器配置PWM输出设置
9 w0 D; H+ s* Y1 [7 x9 R; S8 s
( a/ f1 ^7 w' A( i% R% S根据SG90的参数,我们需要设置PWM输出一个周期时间为20ms,初始值为0.5ms高电平的信号。, a0 n% p- {  _7 c& d( b

1 X% c8 k: ^# h- {  `) [6 H- [% L计算方法:Timer定时器时钟我们设置为240Mhz,这里我们将预分频设置为239,则一个周期为240Mhz/(239+1)=1Mhz(即1us),所以20ms的周期我们需要计数20000-1=19999个填入Counter Period参数中。' g$ f! `+ q! x: X) F; ?
另外,我们还需要一个默认脉冲宽度为0.5ms的,0.5/20*20000=500
2 {8 Y2 f. a; W7 R( y2 b/ L: k' ~& C$ ?$ V0 y2 C7 A  q
其他设置如下图所示:: W3 ~, N$ E0 s) a, ^

  q0 u4 ~9 i# N: T! V) v: p0 b' ` I1]{OF37[}{NHU]LNCB8SB5.png
6 N7 d( f& M5 \% Q. @' Y# \/ W9 C; k. J9 ^$ |/ t
三、MDK代码修改与运行
# g$ u1 W' P( r1.PWM与SG90转换角度转换函数
2 A6 B+ C, c: z0 O! t$ {6 a
方便实验我们将所需要的角度与PWM计数值对应关系封装成一个函数。只需要输入我们所需要的角度和相关定时器参数即可。
4 M" d8 S2 w" l$ p2 ]代码如下(示例):
  1. //设置SG90为参数范围内(0~180°)任意度数$ Y! G8 g) Q4 {+ o# N
  2. /*
    ; m  u' v3 E- D& f
  3. * htim:要设置的定时器句柄8 L2 @; K5 d; a3 O
  4. * Channel:PWM输出通道3 L0 z5 A( h8 c2 a
  5. * countPeriod:pWM一个周期计数值,这里为200009 @! `+ q* O1 @* C5 {9 v/ }& a
  6. * CycleTime:一个周期多少ms,这里为20+ z  Y( t: L$ e5 D7 f
  7. *  O2 l% S5 E7 T5 d& L
  8. */
    , v; n8 S1 q3 E/ v9 Z0 P9 t
  9. void Set_SG90_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle,uint32_t countPeriod,uint32_t CycleTime)% f% Y: ~: w: H
  10. {
    ! M8 _4 A# w* ?% M# `& p  \1 X
  11.         uint16_t compare_value=0;
    & Z7 z% B$ i( b  C, l' k4 l6 ~
  12.         if(angle<=180)% A% v! B6 M% I5 u3 r! x
  13.         {
    4 i) X& p2 Q# ~. e7 R: m
  14.                 //角度转化为数值  ^# Z* ?+ z* d& Z
  15.                 compare_value=0.5*countPeriod/CycleTime+angle*countPeriod/CycleTime/90;: v7 q  f  B- O; O
  16.                 __HAL_TIM_SET_COMPARE(htim, Channel, compare_value);/ \( W0 y- S) C% T
  17.         }
    . u" w5 C  A$ X
  18. 0 w7 Y$ R$ L$ _4 {& P' C
  19. }
复制代码
) |. \+ n( @. n- k+ Z4 i
2.实验现象3 P$ \+ i$ [% |. V  g+ [/ Z: O
这里在主函数增加了按键扫描通过按键控制SG90正反转180°。
# X6 X% M9 C* R2 j" B9 n0 ^; |9 Z另外还增加了串口printf函数,打印SG90旋转时的角度变化。5 d* V1 j4 j9 d0 U
- {: Y2 x1 D% N( l- a
代码如下(示例):  a3 M6 `3 e& U3 b! m2 `9 J7 Q3 K
6 s' K$ v7 X8 ^: J' Q7 a. `5 W2 ^
  1.         key=KEYPRESS();    //按键
    3 v) H$ O' D. s5 Y! e' Z
  2.         if(key==1)//按键1按下SG90从0°旋转到180°1 B! g& J" \7 p
  3.         {5 @7 p! f) k# |$ n. q
  4.                         for(u8 i=0;i<180;i++)//从0到180°递增" X# ]4 i( o; N# ~+ ^( Q2 F9 X
  5.                         {7 K" }5 @$ h; z) G) l: D# H
  6.                                 Set_SG90_angle(&htim5,TIM_CHANNEL_1,i,20000,20);
    ; S$ F) U' O2 G
  7.                                 printf("SG90角度:%d°",i);
    " B3 @7 t1 F; a5 W( u
  8.                                 HAL_Delay(5);5 s# h+ c9 v7 i) s- e! g
  9.                         }        
    + ?8 F; r2 S5 D. D
  10.         }
    6 b! z4 A) p3 }5 W- G: o9 ?$ u
  11.         if(key==2)//按键2按下SG90从180°旋转到0°
    " k0 ^, H0 r+ D3 O
  12.         {
    - W; a7 b! w7 c. R( E8 s
  13.                         for(u8 j=180;j>0;j--)//从180°到0°递减
    ! }0 y9 j. Z% N: A* r" Z* G3 K. R
  14.                         {! f+ _9 d% b; C" y
  15.                                 Set_SG90_angle(&htim5,TIM_CHANNEL_1,j,20000,20);4 i8 s' a& A7 g8 u
  16.                                 printf("SG90角度:%d°",j);
    . w' D. U3 x# S$ H
  17.                                 HAL_Delay(5);' [7 o( _- t6 \; u
  18.                         }
    $ E; ^2 d7 i0 R5 b+ e9 `5 ?! @
  19.         }     
复制代码
5 z' M  z) f0 I9 ]" d7 s

+ w1 a, {2 v5 F5 P; M! O可以看到按键按下SG90按照我们预期的动作变化。实验成功。
( r/ D* p! }7 H- H0 x
# w3 u0 p2 h+ n M1G6TQ3@8{[@Q64aW22]0.png
+ R6 {! G- @6 k- |
- O5 _  D: Z; M' O/ Z  L" C) O1 t" K" @
赞 收藏 评论0 发布时间:2022-3-8 22:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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