一.前提
1舵机的基本概念
首先要明白一点,舵机也分为很多种的,现在用的比较多的是模拟舵机和数字舵机他们的区别如下:
模拟舵机和数字舵机是两种常见的舵机类型,它们在控制方式、精确度和价格等方面存在差异。
模拟舵机(Analog Servo):
- 控制方式:模拟舵机通过脉冲宽度调制(PWM)信号进行控制,其脉冲宽度通常在1到2毫秒之间变化,用来控制舵机的旋转角度。
- 精确度:由于模拟信号容易受到干扰和噪声的影响,模拟舵机的精确度和重复精度相对较低。
- 成本:模拟舵机成本较低,适合对控制精度要求不是特别高的应用。
数字舵机(Digital Servo):
- 控制方式:数字舵机使用数字信号进行控制,可以通过微控制器精确地控制脉冲宽度,从而提高控制的准确性和响应速度。
- 精确度:数字舵机通常具有更好的精确度和重复精度,能够更精确地定位到特定的角度。
- 成本:由于采用数字控制技术,数字舵机的价格相对较高。
在选择舵机时,需要根据应用场景的需求来决定使用模拟舵机还是数字舵机。例如,在需要较高精确度和响应速度的场合,数字舵机会是更好的选择;而在成本敏感或者对精确度要求不高的场合,模拟舵机可能更加适合。
我们平常做项目所用的是模拟舵机,也就是用PWM对其控制的。
然后得清楚控制舵机的一些基本原理:我们常用的一些舵机PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms~2.5ms之间时舵机就可以对应旋转到不同的角度。(以0~180°的舵机为例)1.5ms为90°,2.5ms为180°。
大概的一些常用是知识点就如上了,频率周期这些底层性的 原理东西这里就不在此述说了。
二.具体代码
定时器tim2初始化
//¶æ»úpwm¿ØÖÆ
void TIM2_PWM_Init(u32 arr,u32 psc)
{
//´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM13ʱÖÓʹÄÜ
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //ʹÄÜPORTFʱÖÓ
GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2); //GPIOF8¸´ÓÃΪ¶¨Ê±Æ÷13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOF8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //¸´Óù¦ÄÜ
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //ËÙ¶È100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //ÍÆÍ츴ÓÃÊä³ö
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //ÉÏÀ
GPIO_Init(GPIOA,&GPIO_InitStructure); //³õʼ»¯PF8
TIM_TimeBaseStructure.TIM_Prescaler=psc; //¶¨Ê±Æ÷·ÖƵ
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
TIM_TimeBaseStructure.TIM_Period=arr; //×Ô¶¯ÖØ×°ÔØÖµ
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷13
//³õʼ»¯TIM13 Channel1 PWMģʽ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2 ͨµÀ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯Íâ333333333333333ÉèTIM1 4OC1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //ʹÄÜTIM13ÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷
TIM_ARRPreloadConfig(TIM2,ENABLE);//ARPEʹÄÜ
TIM_Cmd(TIM2, ENABLE); //ʹÄÜTIM13
}
tim2的初值设置:
TIM2_PWM_Init(20000,84);
常规调用:
TIM_SetCompare1(TIM2,1500);