本文介绍制作过程中用到的 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外设
}