目录
前言
哈哈趁热打铁,上讲介绍到L298N电机驱动还有PWM调速,这里我就趁这个点再介绍一下舵机驱动以及它转向的角度控制,如何计算得到,这里将一一讲解,希望能帮到你,同时希望与大家一起交流探讨,求点赞哈哈!!!这里我还是用STM32f1控制,好了,直奔主题。
这里主讲180°舵机控制角度,360°舵机只能控制速度,这里不细讲!
一、舵机的“自白”
我(舵机)是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
那么问题来了?我们用舵机来干嘛呢,当然是控制方向了,如今,基本上飞机或者智能车又或是机器人等等都会用到舵机这个东西,所以说,认识舵机,并且运用舵机就成为我们必不可少的知识学习了,下面附图:
这里我用的是S3003舵机,其他类型的舵机应该也是大同小异。
其中,有三条线,一条接电源(5V即可),一条接地,最后一条接控制(即单片机输出的PWM控制),下面会给上具体实现代码,总的来说跟上一讲区别不大,主要就是PWM周期输出控制,利用 TIM_SetComparex() 函数来设置占空比实现,但是多出的是计算问题,因为舵机有对应角度的时间计算,下面具体讲解:
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度为例,的其控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
基本上,我们学生党所需要的舵机的控制角度对应就是上述关系了,至于360度舵机这里简单提一下,主要是我这个舵机做不到(哈哈哈,这舵机180°的)
这里讲一下360°舵机的
0.5ms--------------0度;正向持续转(最大速度)
1.5ms------------90度;停止转动,速度无
2.5ms-----------180度;逆向持续转(最大速度)
调整PWM周期即可改变转动速度和方向。
言归正传,到了这里基本上对控制舵机角度其实有了一定概念了,下面就直接附上代码部分了
二、代码部分
#include "sys.h"
#include "duoji.h"
void duoji_Pwm_Init()
{
GPIO_InitTypeDef GPIO_InitTypeStruce;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruce;
TIM_OCInitTypeDef TIM_OCInitTypeStruce;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
GPIO_InitTypeStruce.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitTypeStruce.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//这里是我之前的代码,主要是控制到4个舵机,这里大家只用一个输出口即可
GPIO_InitTypeStruce.GPIO_Speed=GPIO_Speed_50MHz;
TIM_TimeBaseInitTypeStruce.TIM_Period=1999;//这里是自动重装值设置
TIM_TimeBaseInitTypeStruce.TIM_Prescaler=719;//这里是预分频系数
TIM_TimeBaseInitTypeStruce.TIM_ClockDivision=0;
TIM_TimeBaseInitTypeStruce.TIM_CounterMode=TIM_CounterMode_Up;
TIM_OCInitTypeStruce.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitTypeStruce.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitTypeStruce.TIM_OCPolarity=TIM_OCPolarity_High;
GPIO_Init(GPIOB,&GPIO_InitTypeStruce);
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitTypeStruce);
TIM_OC1Init(TIM4,&TIM_OCInitTypeStruce);
//TIM_OC2Init(TIM4,&TIM_OCInitTypeStruce);//这些是TIM4其他通道初始化
//TIM_OC3Init(TIM4,&TIM_OCInitTypeStruce);
//TIM_OC4Init(TIM4,&TIM_OCInitTypeStruce);
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
//TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
//TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
//TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE);
}
主函数部分
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "duoji.h"
int main()
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200); //
LED_Init(); //
KEY_Init(); //
duoji_Pwm_Init();
while(1)
{
LED0 = !LED0;
TIM_SetCompare1(TIM4,50);//这里设置占空比改变角度,用TIM4定时器,可以自己更换
TIM_SetCompare2(TIM4,50);
delay_ms(5000);
delay_ms(5000);
TIM_SetCompare1(TIM4,250);
TIM_SetCompare2(TIM4,250);
delay_ms(5000);
delay_ms(5000);
}
}
这里的代码是其他地方用的,拿来简单修改一下而已,基本上就是这样了。
三、如何计算得到该要控制的角度
这里直接上纸描述,字丑谅解哈哈哈
其中的arr和psc可以自己设置,再计算出相应角度的占空比值即可。大家可以自己调试一番,定会有所收获。
有什么问题欢迎随时评论指正,有其他问题也欢迎一起探讨交流!哈哈哈。
如果觉得写得还入眼,给个赞可还行,感谢感谢!
赠人点赞,手有余香哈哈哈
题外话:
挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”
学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈