STM32 避障小车 —— SG90

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

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

实物图片
file

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

工作原理

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

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

高电平时间旋转角度
0.50
1.045
1.590
2.0135
2.5180
与单片机连接

通过 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% = 190

void SG90_PWM_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructer;   //声明一个结构体变量,用来初始化GPIO

    TIM_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;  // PB9
    GPIO_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_tim
    TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructer);


    //PWM初始化      //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_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外设
}
  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值