STM32外设系列详解:SG90舵机控制原理

文章目录

  • 一、sg90简介
  • 二、引脚连接
  • 三、控制方法
  • 四、程序设计
  • 4.1 配置定时器
  • 4.2 编写控制程序
  • 五、360°舵机
  • 一、sg90简介

    首先介绍说一下什么是舵机。舵机是一种位置(角度)伺服的驱动器。适用于一些需要角度不断变化的,可以保持的控制系统。sg90就是舵机的一种。

    sg90

    舵机的工作原理比较简单。舵机内部有一个基准电压,单片机产生的PWM信号通过信号线进入舵机,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

    二、引脚连接

    sg90有三个引脚,分别是红线(VCC),棕线(GND)和橙线(信号线)。通常使用5V供电,信号线接单片机引脚,用老来接收单片机发送的PWM。

    三、控制方法

    控制sg90舵机旋转也比较简单,只需要给它输出PWM波,修改占空比就可以调整角度。sg90的控制一般需要一个20ms 左右的时基脉冲,脉冲的高电平部分一般在0.5ms~2.5ms。高电平持续时间与旋转角度的对应关系如下

    高电平持续时间/ms 舵机角度/°
    0.5 0
    1.0 45
    1.5 90
    2.0 135
    2.5 180

    四、程序设计

    这里以180°的sg90,来展示一下程序设计

    4.1 配置定时器

    要使用sg90,首先要配置定时器,产生PWM。关于定时器和PWM相关知识,可以看博主STM32速成笔记定时器篇,这里就不再做详细介绍了。上面说,控制sg90需要一个20ms左右的脉冲,也就是说PWM的周期为20ms左右。计算一下可以知道,配置定时器时,预分频系数设置为7199,自动重装载值设置为200。我们初始化TIM3的通道1来控制sg90。PWM引输出脚映射到PC6。初始化程序如下

    /*
     *==============================================================================
     *函数名称:TIM3_CH1_PWM_Init
     *函数功能:初始化定时器3的PWM通道1
     *输入参数:per:自动重装载值;psc:预分频系数
     *返回值:无
     *备  注:无
     *==============================================================================
     */
    void TIM3_CH1_PWM_Init (u16 per,u16 psc)
    {
    	// 结构体定义
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    	TIM_OCInitTypeDef TIM_OCInitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	// 开启时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    	
    	// 初始化GPIO
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
    	GPIO_Init(GPIOC,&GPIO_InitStructure);
    	
    	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);   // 改变指定管脚的映射	
    	
    	// 初始化定时器参数
    	TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值
    	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数
    	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	
    	
    	// 初始化PWM参数
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   // 输出极性
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能
    	TIM_OC1Init(TIM3,&TIM_OCInitStructure);   // 输出比较通道1初始化
    	
    	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器
    	TIM_ARRPreloadConfig(TIM3,ENABLE);   // 使能预装载寄存器
    	
    	TIM_Cmd(TIM3,ENABLE);   // 使能定时器
    }
    

    初始化时,程序如下

    TIM3_CH1_PWM_Init(200,7199);   // 初始化TIM3 PWM1
    

    4.2 编写控制程序

    根据高电平持续时间与角度关系对应表格来编写sg90的控制程序

      while(1)
      {
    		TIM_SetCompare1(TIM3,195);   // 旋转到0°
    		delay_ms(500);
    		TIM_SetCompare1(TIM3,190);   // 旋转到45°
    		delay_ms(500);
    		TIM_SetCompare1(TIM3,185);   // 旋转到90°
    		delay_ms(500);
    		TIM_SetCompare1(TIM3,180);   // 旋转到135°
    		delay_ms(500);
    		TIM_SetCompare1(TIM3,175);   // 旋转到180°
    		delay_ms(500);
    	}
    

    五、360°舵机

    除了上面介绍的180°舵机之外,还有一种360°舵机。与180°舵机不同的是,360°舵机是无法控制角度的,它只能控制旋转方向和旋转速度。360°的舵机也是由脉冲宽度为20ms的PWM控制。高电平持续时间与舵机转向和转速的对应关系如下

    高电平持续时间/ms 舵机转向和转速
    0.5~1.5 正转,速度越来越慢
    1.5 停止
    1.5~2.5 反转,速度越来越快
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32外设系列详解:SG90舵机控制原理

    发表评论