赞
踩
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
接线:舵机有三根线,信号线(橙色)->PC6,红线->VCC,棕线->GND。
为什么要选择PC6,因为舵机使用PWM来驱动的。我们要用定时器来产生PWM,进而驱动电机。
PC6的第二功能是TIM3-CH1
PWM输出
#include "sg90.h" /******************************************************************************* * 函 数 名 : pwm_init * 函数功能 : IO端口及TIM3初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void pwm_init(void) { GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器 TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx /* 开启时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出 GPIO_Init(GPIOC,&GPIO_InitStructure); //TIM3定时器初始化 TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值 TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值 TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 //pC6 //PWM初始化 //根据TIM_OCInitStruct中指定的参数初始化外设TIMx TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OC1Init(TIM3,&TIM_OCInitStructure); //注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器 TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设 }
主函数
#include "stm32f10x.h" #include "sg90.h" void Delay(uint32_t nCount) //简单的延时函数 { for(; nCount != 0; nCount--); } int main(void) { pwm_init(); while(1) { Delay(0xfffff); TIM_SetCompare1(TIM3, 195);//0度,0.5ms Delay(0xfffff5); TIM_SetCompare1(TIM3, 190);//45度,1.0ms Delay(0xfffff5); TIM_SetCompare1(TIM3, 185);//90度,1.5ms Delay(0xfffff5); TIM_SetCompare1(TIM3, 180);//135度, 2.0ms Delay(0xfffff5); TIM_SetCompare1(TIM3, 175);//180度,2.5ms Delay(0xfffff5); } }
舵机可以转动了。
舵机控制其实不难,理解原理,用定时器产生PWM波来控制就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。