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

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

[复制链接]
STMCU小助手 发布时间:2022-3-8 22:28
一、SG90角度与PWM转换关系! p5 }, s0 T7 s& z$ U2 k8 x1 _
舵机参数:f=50hz,t=20ms 根据选用的SG90参数,我们需要给出周期为20ms,其中高电平时间为 0.5ms-2.5ms的信号2 l% f  e4 s6 u- I$ i" @
0.5ms-------------0度; 2.5%. k, R0 i2 K! k! z
1.0ms------------45度; 5.0%- D! Z. Y) b+ d3 w) i( B
1.5ms------------90度; 7.5%
7 T' ?, V0 Q8 I0 o6 R- Q2.0ms-----------135度; 10.0%
( v/ P# m' n: O+ L% U/ M+ b" V2.5ms-----------180度; 12.5%* O9 d" K* [& s4 o8 y

- F' J! ^" N$ R5 r0 c& Y8 L/ T3 o二、Cubemx参数配置
$ B1 D( V8 Z" N! h2 p8 K1、时钟配置
. U, g' p) g! Q0 j# G7 U3 Y
9 m8 V. q$ Q. F1 J! K6 P- W WWB4FO4}2AAAF[VL8Q[K12H.png
6 y9 M: H1 w4 G! [5 z. h, m4 z4 u) z7 S& j. r1 |+ K) S
2、定时器配置PWM输出设置
1 H4 C) s( ?6 b' i1 W. s7 H7 b4 V
/ V7 p# |/ Q" O1 x根据SG90的参数,我们需要设置PWM输出一个周期时间为20ms,初始值为0.5ms高电平的信号。
+ @3 M6 R0 H( Z% O# \" ~" k# M& p( q# Q7 X
计算方法:Timer定时器时钟我们设置为240Mhz,这里我们将预分频设置为239,则一个周期为240Mhz/(239+1)=1Mhz(即1us),所以20ms的周期我们需要计数20000-1=19999个填入Counter Period参数中。3 ~6 z3 D/ g* `, ]; b
另外,我们还需要一个默认脉冲宽度为0.5ms的,0.5/20*20000=500
$ a) c0 @6 B% `
0 @* S& u! E1 f+ n5 ^1 M* h/ t其他设置如下图所示:+ _5 b5 i% i3 H$ A6 }
% b* `' r/ S; F/ ~( M0 Z( [
I1]{OF37[}{NHU]LNCB8SB5.png
/ U# l: `; e/ J1 m5 H' S; b) B& m/ d7 K3 u6 h1 i
三、MDK代码修改与运行  o2 Z9 a& i9 r2 s& h! N5 s; q/ j8 k4 D
1.PWM与SG90转换角度转换函数
& N  o2 q$ I0 R8 d( a
方便实验我们将所需要的角度与PWM计数值对应关系封装成一个函数。只需要输入我们所需要的角度和相关定时器参数即可。9 r5 _3 J- G2 B
代码如下(示例):
  1. //设置SG90为参数范围内(0~180°)任意度数/ |2 `9 [/ W2 n7 i$ p# G
  2. /*! P0 d: T7 X3 Q/ X! j
  3. * htim:要设置的定时器句柄! x$ E  [9 X1 c1 h
  4. * Channel:PWM输出通道
    7 g( O, z3 c( X4 T
  5. * countPeriod:pWM一个周期计数值,这里为20000
    ' L8 B* M3 Q/ f, F- \, s
  6. * CycleTime:一个周期多少ms,这里为20
    2 \( D/ l6 B2 Y5 V, M' d( m
  7. *, W3 F6 V) h0 Z+ p
  8. */1 K7 ^1 e0 I& T, h
  9. void Set_SG90_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle,uint32_t countPeriod,uint32_t CycleTime)4 m" H0 f+ I1 ?8 ?7 g+ t- E6 n
  10. {
    , h# O( S- q, n- `* E
  11.         uint16_t compare_value=0;8 s7 j+ M8 Z4 \9 G, P
  12.         if(angle<=180)$ Z- |: w. h1 |0 {+ o# Q3 @
  13.         {
    $ n% H  i8 y1 l
  14.                 //角度转化为数值( x* ~) Y  H+ J0 {
  15.                 compare_value=0.5*countPeriod/CycleTime+angle*countPeriod/CycleTime/90;- s- \# e5 l$ K8 H
  16.                 __HAL_TIM_SET_COMPARE(htim, Channel, compare_value);9 H; Q( M4 K; M
  17.         }
    , R7 m; f; R- l8 B) f
  18. + B) v- u" O' f
  19. }
复制代码
# A/ i/ [( ]) X  C
2.实验现象4 l( ?9 z' @4 E2 a! A' o( B* [, i
这里在主函数增加了按键扫描通过按键控制SG90正反转180°。
" N, q1 i3 ]7 ~另外还增加了串口printf函数,打印SG90旋转时的角度变化。
: [4 K. s- Y6 A: o* d
1 |+ t; }5 t! g/ s代码如下(示例):
! S; \( c* d& |0 _, y+ v1 J5 a4 ^6 [% r# p0 g- ~1 ?5 c$ z$ d
  1.         key=KEYPRESS();    //按键( A8 I% L& O8 o+ v- Y+ P
  2.         if(key==1)//按键1按下SG90从0°旋转到180°: T8 Q2 u' m/ v' Z* r1 t- r. f1 c
  3.         {
    # b0 b8 A2 g% C7 r' h8 L
  4.                         for(u8 i=0;i<180;i++)//从0到180°递增2 g% U4 `; Q9 C& O/ r
  5.                         {
    ) o* C5 d. T+ a
  6.                                 Set_SG90_angle(&htim5,TIM_CHANNEL_1,i,20000,20);
    3 w. O2 j# ^7 z+ B2 O
  7.                                 printf("SG90角度:%d°",i);1 k: D# y& w1 ~: h& E
  8.                                 HAL_Delay(5);4 m% r- R; W/ ]
  9.                         }        
    # S0 C! O/ j2 ~& k! C
  10.         }
    5 H7 \7 }) Y! r# I1 @2 l
  11.         if(key==2)//按键2按下SG90从180°旋转到0°$ L1 ~* \! n) o4 N6 U9 l1 F
  12.         {5 ?" i1 c1 Z( C( [6 ^7 c) {
  13.                         for(u8 j=180;j>0;j--)//从180°到0°递减# r1 X4 P) e/ j/ J1 H( f
  14.                         {
    . f7 w% E' F1 p8 S! a7 }" l4 S3 m. H
  15.                                 Set_SG90_angle(&htim5,TIM_CHANNEL_1,j,20000,20);
    4 c" C! l6 L0 ]& O+ u/ o
  16.                                 printf("SG90角度:%d°",j);
    3 w( v, A! `3 E, B
  17.                                 HAL_Delay(5);
    ' D$ J5 k; }' C+ J  D1 {
  18.                         }
    ) [' r; S4 X/ s6 D+ }
  19.         }     
复制代码

* G& B0 {+ `: e8 Z, C/ a3 u/ i6 D" p: g
可以看到按键按下SG90按照我们预期的动作变化。实验成功。2 F! B/ a# |+ X: ^) F& C+ S
' H/ T$ G8 s, R" Q2 }! `
M1G6TQ3@8{[@Q64aW22]0.png 3 i* f0 ^' A- @" t4 S, c4 a
& y3 g  x9 F% [- Z8 q( L1 y/ A" f
收藏 评论0 发布时间:2022-3-8 22:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版