一、舵机的“自白”
我(舵机)是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。
那么问题来了?我们用舵机来干嘛呢,当然是控制方向了,如今,基本上飞机或者智能车又或是机器人等等都会用到舵机这个东西,所以说,认识舵机,并且运用舵机就成为我们必不可少的知识学习了,下面附图:
这里我用的是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可以自己设置,再计算出相应角度的占空比值即可。大家可以自己调试一番,定会有所收获。
|