STM32+SG90舵机详解(详细)

上一次使用舵机只是草草了解,只大概知道是pwm控制的,这次又使用到了舵机,本以为复制上次代码就可以调试成功,没想到却弄了很久。

我使用的是STM32f103c8t6,用的是定时器4。这个f1板子的定时器各个通道io口如下图所示:

在开始之前我们要了解控制舵机需要的一个周期是多少秒,规格书上写了是20ms(毫秒),这就意味着,我们配置输出的一个周期必须是20ms,这就需要我们经过分频重装载值来决定。

当初我在这里卡了很久,因为不会计算这个,上网看了很多文章,大家讲的不是很明白,所以我今天详细和大家说说如何分频和写重装载值

首先,我的板子主频是72Mhz,这就意味这一秒种可以计72Mhz的数,我们需要计算20ms能计多少个数,再把这个数给到定时器,定时器就能帮我们分好20ms为一个周期了。如果不分频的话,就用72M的时钟源,需要计72个数才1us,20ms的周期要计1,440,000个数,而定时器只有16位,他的最大值是65535,哪放的下这么多数啊。所以不分频的话,我们永远都得不到20ms的周期。

那该分多少呢,你想分多少分多少,只要你最后重装载值能圆回来就好。

重装载值的意思是,比如我分频得到计算1个数的时间就有1ms了,那重装载值就填20就可以了,定时器(如果从0开始计数的话)就会计到20的时候帮我们分为一个周期。

如果我分频得到计算2个数的时间才有1ms了,那重装载值就要填40个数才能满足我们的需求

为了好计算这里我分72,就相当于72M主频除72

72M/72=1M /s                                         //经过72分频后就是1秒计1M个数

1M=1 000k=1000 000/s                         //而1M又等于1 000 000个数,所以1s能计1000 000个数

1s=1 000ms=1000 000us                      //而1s又等于1000 000us

所以1us=1;

所以经过分频以后我们计一个数的时间就是1us,是吧。

那我们既然已经知道计一个数的时间,也知道我们需要20ms,那我们要计多少个数才有20ms呢,而这个数就是我们要填的重装载值。

既然1us=1

所以20ms=20000us=20000

所以我们要计20000个数才正好是20ms,所以经过72分频下的重装载值要填20000;

这时候我们看资料上是这样写的:

t = 0.5ms——————-舵机会转到 0 °

t = 1.0ms——————-舵机会转到 45°

t = 1.5ms——————-舵机会转到 90°

t = 2.0ms——————-舵机会转到 135°

t = 2.5ms——————-舵机会转到 180°

意思就是在这个20ms的一个周期内,如果有0.5ms是高电平其他都是低电平,那舵机就能转到0度,其他的以此类推。

那我们要计多少个数才是0.5ms呢,答案是500个数。

因为1us=1

所以0.5ms=500us=500

我看很多文章他们喜欢分7200频,都可以的的,大家可以计算一下。

接着我们在循环里面调TIM_SetCompareX()这样写就能运转0度到180度,X为定时器通道

但是,有可能这时候你的舵机有反应但是并不是你预期的效果,是因为500可能被你设置为低电平的时间了。

所以还要设置两个参数,就是下图我框起来的两个参数。

首先就是第一条,pwm输出模式是有两个的,一个pwm1,一个pwm2

按我的理解来说,pwm1的意思就是先输出有效电平再输出无效电平。而pwm2就是反过来,先输出无效电平再输出有效电平。

而这个有效电平就是你自己来决定的,也就是第二条来决定的,我写的就是有效电平为高电平,当然也可以写有效电平为低电平。

所以我配置pwm1模式,有效电平又为高电平就意味这,当我使用这个函数

TIM_SetCompare3(TIM4,500); //0度

他的意思是,输出计500个数的时间的有效电平高电平,剩余的为低电平。

如果你写的是pwm2模式,那意思就是,输出计500个数的时间的低电平,剩余的为有效电平高电平。

当初,不明白这两个参数的含义,也是卡了一阵子。所以学会看手册很重要,我也是经过这件事才总结出来的。

第一次写文章,同时也是初学者,如果文章当中有什么措辞不对,或者错误的地方,欢迎在评论区指出。

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
STM32是一款广泛应用于嵌入式系统的微控制器。SG90舵机是一种小型的舵机,在模型制作、机器人控制等领域有着广泛的应用。 要使用STM32控制SG90舵机,首先需要连接它们之间的电路。通常,SG90舵机的控制信号线需要连接到STM32微控制器的一个GPIO引脚上。此外,舵机还需要供电,因此还需要为舵机连接一个适配器,并将其电源线连接到电源。 在STM32上编写程序时,可以使用STM32的开发环境,例如Keil或CubeMX等工具。在编写程序之前,首先需要导入相关的库文件,例如HAL库,以便能够使用库中提供的函数来控制GPIO引脚。 接下来,需要定义一个GPIO引脚来作为舵机的控制信号引脚。可以使用HAL库提供的函数,如GPIO_Init(),来初始化该引脚。然后,可以使用HAL库提供的函数,如HAL_GPIO_WritePin(),来控制该引脚的输出电平,从而控制舵机的转动角度。 通常,SG90舵机的转动角度是通过控制信号引脚的PWM(脉冲宽度调制)来实现的。在STM32上,可以使用定时器模块和相应的PWM输出通道来生成PWM信号。通过调整PWM信号的占空比,可以控制舵机的转动角度。 最后,需要在主循环中控制舵机的转动。可以使用循环来改变舵机的转动角度,可以根据需要添加延时以控制舵机的转动速度和稳定性。 总结起来,要使用STM32控制SG90舵机,需要连接电路,导入相应的库文件,在程序中初始化GPIO引脚和定时器模块,使用PWM信号来控制舵机的转动角度,并在主循环中控制舵机的转动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值