当前位置: 代码迷 >> 综合 >> STM32 避障小车 —— SG90
  详细解决方案

STM32 避障小车 —— SG90

热度:54   发布时间:2024-01-31 14:44:33.0

本文介绍制作过程中用到的 SG90 180° 版本 模块

注意: 360 度版本的舵机只能控制旋转的方向和速度,较难控制。而 180 度版本可以直接控制旋转的角度。

实物图片

SG90 需要连接三条线,其中
棕色 -> GND
红色 -> VCC
橙色 -> 信号线

工作原理

舵机内部有一个基准电压,微处理器产生的 PWM 信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

我们通过调节 PWM 信号的占空比就可以控制舵机旋转相应的角度。PWM 信号周期为 20 ms

高电平时间 旋转角度
0.5 0
1.0 45
1.5 90
2.0 135
2.5 180

与单片机连接

通过 TIM4-CH4 输出的 PWM 控制舵机转动

棕色 -> GND
红色 -> 5V
橙色 -> PB9

程序部分

SG90.h

#ifndef __SG90_H
#define __SG90_H#include <stm32f10x.h>
#include <delay.h>#define SG90_GPIO_PORT    GPIOB
#define SG90_GPIO_PIN     GPIO_Pin_9
#define SG90_GPIO_CLK     RCC_APB2Periph_GPIOB#define   SG90_Right_90   TIM_SetCompare4(TIM4, 195)
#define   SG90_Right_45   TIM_SetCompare4(TIM4, 190)
#define   SG90_Front      TIM_SetCompare4(TIM4, 185)
#define   SG90_Left_45    TIM_SetCompare4(TIM4, 180)
#define   SG90_Left_90    TIM_SetCompare4(TIM4, 175)void SG90_PWM_Init(void);#endif   //__SG90_H

SG90.c

#include <SG90.h>//橙色信号线  
//红色正极 
//棕色负极//具体的周期计算公式为:周期 =(arr+1)*(psc+1)/CLK。其中CLK为计数器的时钟频率,
//我的是 72MHZ,也就是 72000000。最后计算结果单位为秒,结果为 0.02s,也就是 20ms。//PWM周期为20ms = (7200*200)/72000000=0.02
//所以TIM_Period = 199,TIM_Prescaler = 7199
//t = 0.5ms——————-舵机会转动 0 °
//t = 1.0ms——————-舵机会转动 45°
//t = 1.5ms——————-舵机会转动 90°
//t = 2.0ms——————-舵机会转动 135°
//t = 2.5ms——————-舵机会转动 180°
//PWM 占空比是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比
//由于 PWM 周期为20ms,所以(以舵机会转动 45°为例),占空比就应该为 1ms/20ms = 5%,
//所以TIM_SetCompare4 的 TIMx 捕获比较 1 寄存器值就为 200-200*5% = 190void SG90_PWM_Init(void) {GPIO_InitTypeDef GPIO_InitStructer;   //声明一个结构体变量,用来初始化GPIOTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;//声明一个结构体变量,用来初始化定时器TIM_OCInitTypeDef TIM_OCInitStructer;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx/* 开启时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);/*  配置GPIO的模式和IO口 */GPIO_InitStructer.GPIO_Pin = SG90_GPIO_PIN;  // PB9GPIO_InitStructer.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructer.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出GPIO_Init(SG90_GPIO_PORT, &GPIO_InitStructer);//TIM3定时器初始化TIM_TimeBaseInitStructer.TIM_Period = 199;   //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值TIM_TimeBaseInitStructer.TIM_Prescaler = 7199;  //设置用来作为TIMx时钟频率预分频值TIM_TimeBaseInitStructer.TIM_ClockDivision = 0;  //设置时钟分割:TDTS = Tck_timTIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructer);//PWM初始化      //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_OCInitStructer.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructer.TIM_OutputState = TIM_OutputState_Enable;//PWM输出使能TIM_OCInitStructer.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC4Init(TIM4, &TIM_OCInitStructer);//注意此处初始化时TIM_OC1Init而不是TIM_OCInit,否则会出错。因为固件库的版本不一样。TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能或者失能TIMx在CCR1上的预装载寄存器TIM_Cmd(TIM4, ENABLE);  //使能或者失能TIMx外设
}