【OneNET麒麟座开发板试用体验】PWM驱动SG90舵机

  • _落雪千寒灬
  • LV3工程师
  • |      2017-08-26 14:27:48
  • 浏览量 730
  • 回复:0
对模拟舵机的驱动很感兴趣,于是想用迷你麒麟座学习控制,并和大家分享一下,用的舵机是SG90 想要驱动这款舵机就要先了解它的相关参数和控制方式 首先看看这款舵机的相关参数 1.重量:9g 2.尺寸:23x12.2x29mm 3.无负载操作速度:0.12秒/60度(4.8V);0.10秒/60度(6.0V) 4.扭矩:1.6kg·cm(4.8V) 5.使用温度:-30~+60摄氏度 6.死区设定:5微秒 7.工作电压:3.5V~6V 8.附件:三种功能舵角、固定螺钉,线长 25CM 橙色信号线 红色正极 棕色负极 (技术参数参考链接https://wenku.baidu.com/view/b746f2d59ec3d5bbfd0a7453.html) 从参数我们可以知道这款舵机可以用5V电源供电,但这里要注意两个接线原则 1.舵机要单独供电 2.舵机的电源和控制信号要共地 第一点是从电流大小考虑的,第二点则是数字电路的基础,这两个原则对于初学者来说很容易被忽略,从而导致舵机控制不成功 然后看看舵机的控制,sg90需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。 信号脉冲与角度的对应关系: 0.5ms-------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 引用一张比较形象的图 知道信号脉冲与角度的对应关系后就可以开始编程了 SG90是一款模拟舵机 要不断地给它输入信号才能稳定运转 所以要到PWM void SG90_Init(void) //PWM初始化 使用TIM2定时器通道1 对应IO口为PA0 { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PWM信号电平跳变值 */ /*PCLK1经过2倍频后作为TIM2的时钟源等于72MHz*/ // /72mhz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 20000-1; TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //设置预分频:72/72=1MHz TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数溢出模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置为PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1500; //设置跳变值,当计数器计数到这个值时,电平发生跳变 TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low; //当定时器计数值小于CCR1时为高电平 TIM_OC1Init(TIM2, &TIM_OCInitStructure); //使能通道1 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); /* TIM3 enable counter */ TIM_Cmd(TIM2, ENABLE); //使能TIM2 } void SG90Run(u8 angle) //输入角度控制舵机 舵机将运转到指定角度 角度输入范围0-180 { TIM_SetCompare1(TIM2,11.111111*angle+500); } 最后说说舵机和伺服电机的关系 伺服电机有个很重要的特点 就是闭环控制 而舵机其实也就是伺服电机的一种 简单地说 舵机=伺服电机+变速齿轮
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子