今天学习了有关SG90舵机的相关内容,基于STM32F103ZET6芯片写了该舵机的驱动程序。供大家参考。
1. SG90的相关知识:
SG90舵机旋转的角度是180°。 舵机的控制一般需要一个20ms的脉宽调制(PWM)信号,该脉冲的高电平部分一般为0.5ms-2.5ms范围相对应舵盘位置的0-180°
0.5ms--------------0度
1.0ms--------------45度
1.5ms--------------90度
2.0ms--------------135度
2.5ms--------------180度
2. SG90接线
SG90分别有三根线。棕色,红色,橙色
棕色接地(GND)
红色接电源(+5V)。(我试过接3.3v,舵机并没有转动,但是会发生嗡嗡的声响)
橙色接输出PWM信号的引脚
3. GPIO初始代码
我使用的是TIM1的通道1来控制舵机的。TIM1通道1对应的GPIO是PA8
//GPIO初始化
static void advanceTime_GPIO_Config(void)
{
//开启时钟RCC_TIMEGPIO_CMD(RCC_TIMEGPIO,ENABLE);//配置GPIO结构体GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin = TIME1_GPIO_PIN;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(TIME1_GPIO, &GPIO_InitStruct);
}
//GPIO相关宏定义
#define RCC_TIMEGPIO_CMD RCC_APB2PeriphClockCmd
#define RCC_TIMEGPIO RCC_APB2Periph_GPIOA
#define TIME1_GPIO_PIN GPIO_Pin_8
#define TIME1_GPIO GPIOA
4. TIM1相关配置代码
//TIM1初始化函数
static void advanceTime_Config(void)
{
RCC_TIME_CMD(RCC_TIME,ENABLE);/****************** 时基初始化 ***********************/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = TIM1_PERIOD;TIM_TimeBaseInitStruct.TIM_Prescaler = TIM1_PRESCALER;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(USETIME, &TIM_TimeBaseInitStruct);/****************** 输出结构体初始化 ***********************/TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStruct.TIM_OCNPolarity = TIM_OCPolarity_Low;TIM_OCInitStruct.TIM_OutputNState = TIM_OutputNState_Disable;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = TIM1_PULSE;TIM_OC1Init(USETIME, &TIM_OCInitStruct);TIM_OC1PreloadConfig(USETIME, TIM_OCPreload_Enable);TIM_Cmd(USETIME, ENABLE); TIM_CtrlPWMOutputs(USETIME, ENABLE);
}
//相关宏定义
/************** TIME1 配置 ****************/
#define RCC_TIME_CMD RCC_APB2PeriphClockCmd
#define RCC_TIME RCC_APB2Periph_TIM1
#define TIM1_PRESCALER 7199
#define TIM1_PERIOD 200
#define USETIME TIM1
#define TIM1_PULSE 175
5. GPIO+TIM1初始化
//在main函数中直接调用该函数就ok啦
void advanceTime_Init(void)
{
advanceTime_GPIO_Config();advanceTime_Config();
}
//在.h文件中声明该函数
/************** TIME1 函数 ****************/
void advanceTime_Init(void);
6. main函数代码
uint32_t time = 0;
//延时函数宏定义
#define SOFT_DELAY Delay(0x0FFFFF);
void Delay(__IO u32 nCount);
int main(void)
{
advanceTime_Init();while (1){
TIM_SetCompare1(USETIME,175); SOFT_DELAYTIM_SetCompare1(USETIME,180); SOFT_DELAYTIM_SetCompare1(USETIME,185); SOFT_DELAYTIM_SetCompare1(USETIME,190); SOFT_DELAYTIM_SetCompare1(USETIME,195); SOFT_DELAY}
}void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
好啦,一个简单的SG90驱动程序就写好啦。如果有什么错误的地方还请大佬批评指正喔!