WebStorm 微信公众号开发 Jmeter 私有变量 劝酒文化 javascript animation boost Keys.js angularjs版本 vue添加class 河南网络推广 electron教程 jquery延时 css获取最后一个元素 鼠标失去焦点事件 webform开发教程 linux管道符 oracle重命名表名 车载u盘 python迭代 安装python教程 java判断是否为空 linux用户 linux安装系统 幽城幻剑录五内 kafka权威指南 jq改变css样式 movavi js取余数 ftp客户端软件 dll文件 抖音APP下载 视频旋转软件 ps怎么羽化图片边缘 点状字体 网页播放器代码 英雄塔 dnf驭剑士刷图加点 h264是什么格式
当前位置: 首页 > 学习教程  > 编程语言

STM32 避障小车 —— SG90

2020/7/24 10:22:30 文章标签:

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

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

实物图片

file

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% = 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外设
}

本文链接: http://www.dtmao.cc/news_show_50260.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?