STM32F407学习笔记——MG90S舵机模块(基本控制)

STM32F407学习笔记——MG90S舵机模块(基本控制)

一、基本原理:
通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms)。

旋转角度 脉冲时间 比较寄存器 占空比
0.5ms 195 2.5%
45° 1ms 190 5%
90° 1.5ms 185 7.5%
135° 2ms 180 10%
180° 2.5ms 175 12.5%

占空比计算公式:脉冲时间/20ms
比较寄存器:200-200*占空比
文章后面给出的代码只需改变比较寄存器即可控制舵机旋转 角度。

二、代码功能:
改变比较寄存器控制舵机旋转角度。

三、接线:
PA0——PWM信号线(黄线)、+5v——+5v(红线)、GND——GND(棕线)

四、代码部分:
SG90.h

#ifndef __SG90_H
#define __SG90_H

#include 
#include 
#include "math.h"
void TIM2_PWM_Init(u32 arr,u32 psc);

#endif   //__SG90_H

SG90.h

#include "sys.h"
#include "SG90.h"




void TIM2_PWM_Init(u32 arr,u32 psc)
{
     
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  	 
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2); 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;          
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        
	GPIO_Init(GPIOA,&GPIO_InitStructure);              
	  
	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(TIM2,&TIM_TimeBaseStructure);
	

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);  

	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  
 
    TIM_ARRPreloadConfig(TIM2,ENABLE);
	
	TIM_Cmd(TIM2, ENABLE);  									  
}  


main.c

#include "sys.h"
#include "HC-SR04.h"
#include "SG90.h"
#include "delay.h"

int main() 
{
     
	delay_init(168);
	TIM2_PWM_Init(200-1,8400-1);
	
	while(1)
	{
     	
 		delay_ms(1000);	 
		TIM_SetCompare1(TIM2,175);	
		
		delay_ms(1000);	 
		TIM_SetCompare1(TIM2,180);	
		
		delay_ms(1000);	 
		TIM_SetCompare1(TIM2,185);	
		
		delay_ms(1000);	 
		TIM_SetCompare1(TIM2,190);	
		delay_ms(1000);	 
		TIM_SetCompare1(TIM2,195);			
	}
}

PS:此模块及代码可与陀螺仪模块、超声波模块配合使用。

该文章参考资料:STM32控制舵机的原理及代码

仅供初学者学习使用

你可能感兴趣的:(单片机,stm32)