舵机控制原理:
舵机的控制信号为周期是 20ms 的脉宽调制(PWM)信号,其中脉冲宽度从 0.5ms-2.5ms,相对应舵盘的位置为 0-180 度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。
一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。
其中间位置的脉冲宽度是一定的,那就是1.5ms。
角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。
当舵机接收到一个小于1.5ms的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。
可以通过调节PWM的占空比控制舵机的转向角度。
文章转载来源:https://blog.csdn.net/avrmcu1/article/details/24384745
#ifndef __STEERING_H
#define __STEERING_H
#include "sys.h"
void TIM4_PWM_Init(u16 arr,u16 psc);//TIM4_CH1
#endif
#include "steering.h"
void TIM4_PWM_Init(u16 arr,u16 psc)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_TimeBaseStructure.TIM_Period = arr;TIM_TimeBaseStructure.TIM_Prescaler =psc;TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM4,&TIM_OCInitStructure); TIM_Cmd(TIM4,ENABLE); }
TIM4_PWM_Init(199,7199);while(1){delay_ms(10);TIM_SetCompare1(TIM4,5); delay_ms(300);TIM_SetCompare1(TIM4,10);delay_ms(300);TIM_SetCompare1(TIM4,15);delay_ms(300);}
应为T=20ms,所以对应的f=1/T=50HZ
频率:pwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
占空比:TIM3->CCR1 / arr(单位:%)
注意:如果定时器模式选择为:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
那么对应的输出比较极性为:
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
相反:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;