STM32舵机驱动教程及示例代码

目录

舵机接线:

数字舵机与模拟舵机的区别:

舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

180度舵机驱动:

270度舵机驱动:

360度舵机驱动:

STM32定时器配置:

stm32f4为例(时钟频率为84Mhz):

stm32f1为例(时钟频率为72Mhz):

STM32定时器PWM输出配置要点:

STM32定时器配置:


舵机接线:

红色线 电源线(VCC)
黑色  /  棕色 地线(GND)
白色  /  黄色 信号线(pwm输出)

注意:如果外接电源,那么舵机和开发板、电源之间需要共GND,即开发板上的GND与电源的GND和舵机的GND三者相连接。

如果三者没有共GND,这时舵机无法接收到正常的pwm驱动信号,如图所示,开发板输出周期为20ms,脉冲宽度(高电平宽度)为1.5ms的pwm完全变形,无法正常驱动舵机。


数字舵机与模拟舵机的区别:

数字舵机只需发送1次PWM信号就能运动到预定的角度,模拟舵机需要给它不停的发送PWM信号,才能让它保持在预定的角度。

数字舵机与模拟舵机的驱动控制方法是一样的。


舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

转动角度 脉冲周期 脉冲宽度(高电平宽度)
-45度 20ms 0.5ms
0度 20ms 1.5ms
45度 20ms 2.5ms

180度舵机驱动:

转动角度 脉冲周期 脉冲宽度(高电平宽度)
-90度 20ms 0.5ms
-45度 20ms 1ms
0度 20ms 1.5ms
45度 20ms 2ms
90度 20ms 2.5ms


270度舵机驱动:

转动角度 脉冲周期 脉冲宽度(高电平宽度)
-135度 20ms 0.5ms
0度 20ms 1.5ms
135度 20ms 2.5ms

360度舵机驱动:

转动角度 脉冲周期 脉冲宽度(高电平宽度)
-180度 20ms 0.5ms
-90度 20ms 1ms
0度 20ms 1.5ms
90度 20ms 2ms
180度 20ms 2.5ms

所以90度、180度、270度、360度的舵机驱动方法是一样的。

1.驱动脉冲周期都是20ms

2.所有舵机在脉冲宽度为1.5ms驱动下,都位于0度。


STM32定时器配置:

stm32f4为例(时钟频率为84Mhz):

设置arr(自动重装载值)为10000-1=9999,psc(定时器分频系数)为168-1=167

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(167+1)/  84Mhz                

                                   =  20  ms


stm32f1为例(时钟频率为72Mhz):

设置arr(自动重装载值为10000-1=9999),psc(定时器分频系数144-1=143)

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(143+1)/  84Mhz                

                                   =  20  ms

*(stmf4的时钟频率为84Mhz,stm32f1时钟频率为72Mhz,Tck为时钟频率)*


STM32定时器PWM输出配置要点:

***  注意定时器通道的输出极性  ***

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低。

1. TIM_OCPolarity_High:当定时器计数小于比较数值是输出高电平,大于比较数值是输出低电平。

  输出极性:TIM_OCPolarity_High  比较极性高     

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 1ms

2.TIM_OCPolarity_Low:当定时器计数小于比较数值是输出低电平,大于比较数值是输出高电平。

 输出极性:TIM_OCPolarity_Low比较极性低      

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 19 ms

输出极性:TIM_OCPolarity_High  比较极性高      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度) 比较数值,
0.5ms number  =  250
1ms number  =  500
1.5ms number  =  750
2ms number  =  1000
2.5ms number  =  1250

 输出极性:TIM_OCPolarity_Low比较极性低      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度) 比较数值,TIM_SetCompare1(TIM14,number);
0.5ms number  =  9750
1ms number  =  9500
1.5ms number  =  9250
2ms number  =  9000
2.5ms number  =  8750

STM32定时器配置:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "pwm.h"


int main(void)
{    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  
 	TIM14_PWM_Init(10000-1,168-1);	
   while(1) 
	{

 		TIM_SetCompare1(TIM14,500);

	}
}






void TIM14_PWM_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);  	//TIM14时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 	//使能PORTF时钟	
	
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOF,&GPIO_InitStructure);              //初始化PF9
	  
	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(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
	
	//初始化TIM14 Channel1 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1

	TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
 
  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 
	
	TIM_Cmd(TIM14, ENABLE);  //使能TIM14
 
										  
} 

作者:peinCK

物联沃分享整理
物联沃-IOTWORD物联网 » STM32舵机驱动教程及示例代码

发表评论