资讯详情

学习笔记12-SG90舵机

目录

  • 一、简介
    • 接线
  • 二、原理
  • 3、代码段
    • 3.1、sg90.c
    • 3.2、main.c

一、简介

舵机是一种位置(角度)伺服驱动器,适用于控制系统,可根据控制信号输出指定角度(常见0-90°、0-180°、0-360°)。 本质上是伺服电机。分为模拟舵机和数字舵机。

  • 模拟舵机:需要发送目的地PWM只有信号才能旋转到指定位置。(想转10°,要不断发送10°PWM信号只能在指定位置停止)
  • 数字舵机:只需给目的地PWM信号可以旋转到指定位置。(想转10°,发送一次10°PWM信号可以转到10°) 在这里插入图片描述

接线

红色----VCC 棕色----GND 橙色-信号线(连接到单片机输出PWM的引脚)

二、原理

舵机的控制一般需要20ms时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms脉冲部分的角度控制范围,180°舵机的0-180°,呈线性变化。

为其提供一定的脉冲宽度,其输出轴将保持在相应的角度,无论外部扭矩如何改变,直到它提供另一个宽度的脉冲信号,它将将输出角度改变到新的相应位置。舵机内部有一个基准电路,产生周期为20ms,宽度1.5ms对于基准信号,有一个比较器,将外加信号与基准信号进行比较,判断方向和大小,从而产生电机的旋转信号。

控制电路板从信号线接收相应的控制电路板PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。

以180度伺服为例,相应的控制关系是这样的(t高电平时间): t=0.5ms(占空比2.5%)---------0°; t=1.0ms(占5%的空间)-45°; t=1.5ms(占空比7.5%)---------90°; t=2.0ms(占空间的10%)-135°; t=2.5ms(占空比12.5%)-------180°;

即:

3、代码段

根据PWM周期为20ms = (7200*200)/72000000=0.02。故TIM_Period=199TIM_Prescaler=7199

以转动45°例如,占空比为5%,因此TIM_SetCompare1的 TIMx 捕获比较 1 寄存器值为200-200*5% = 190。

以下是代码显示,仅供参考:

3.1、sg90.c

void TIM1_PWM_Init(void)///自动重装载值 预分频系数 { 
            GPIO_InitTypeDef GPIO_InitStructure;  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  TIM_OCInitTypeDef  TIM_OCInitStructure;   RCC_APB2PeriphClockCmd(SG90_TIM_CLK, ENABLE);// ///使定时器1的时钟   RCC_APB2PeriphClockCmd(SG90_GPIO_CLK , ENABLE);  //使能GPIO外设时钟使能                                                                             ///将引脚设置为复用输出功能TIM1 CH1的PWM脉冲波形  GPIO_InitStructure.GPIO_Pin = SG90_Pin; //TIM_CH1   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz  GPIO_Init(SG90_Port, &GPIO_InitStructure);     TIM_TimeBaseStructure.TIM_Period = 199; ///自动重装载寄存器周期的值设置在下一个更新活动中 80K  TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(SG90_TIMx, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(SG90_TIMx, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  	TIM_CtrlPWMOutputs(SG90_TIMx,ENABLE);	//MOE 主输出使能 

	TIM_OC1PreloadConfig(SG90_TIMx, TIM_OCPreload_Enable);  //CH1预装载使能 //使能输出比较预装载
	
	TIM_ARRPreloadConfig(SG90_TIMx, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(SG90_TIMx, ENABLE);  //使能TIM1
 
}

3.2、main.c

int main(void)
{ 
        		  
	u16 pwmval;	 
	DelayInit();
	TIM1_PWM_Init();  
	while(1)
	{ 
        	
		DelayMs(500);	
		pwmval=195;  //0° 
		TIM_SetCompare1(TIM8,pwmval);	
		DelayMs(500);	
		pwmval=190;  //45° 
		TIM_SetCompare1(TIM8,pwmval);	
		DelayMs(500);	
		pwmval=185;  //90° 
		TIM_SetCompare1(TIM8,pwmval);
		DelayMs(500);	
		pwmval=180;  //135° 
		TIM_SetCompare1(TIM8,pwmval);		
		DelayMs(500);	 
		pwmval=175;  //180° 
		TIM_SetCompare1(TIM8,pwmval);	   
	}		
}

关于选择TIM_OCMode_PWM2等的原因,详见:TIM_OCMode_PWM2;TIM_OCMode_PWM1

参考自: 1、单片机——SG90舵机工作原理 2、STM32控制SG90舵机 3、SG90舵机


标签: 度180度连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台