STM32F407学习笔记——MG90S舵机模块(基本控制)
一、基本原理:
通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms)。
旋转角度 | 脉冲时间 | 比较寄存器 | 占空比 |
---|---|---|---|
0° | 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 <stm32f4xx.h>
#include <delay.h>
#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控制舵机的原理及代码
仅供初学者学习使用