STM32驱动SG90舵机完成控制

news2024/9/21 15:26:00

一、前言

SG90舵机的工作原理主要是基于PWM(脉冲宽度调制)信号来控制。 SG90舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机,产生直流偏置电压,与舵机内部的基准电压做比较获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定电机的正反转。当舵机开始旋转的时候,舵机内部通过急联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。

SG90舵机还分为180度和360度的类型,以及模拟舵机和数字舵机。模拟舵机需要不断的发送PWM信号才能旋转到指定的位置,而数字舵机只需要给一个目的地的PWM信号,就可以转动到指定的位置。

在控制SG90舵机时,PWM波形的频率是50HZ,即周期为20毫秒。在这个周期内,通过控制高电平的时长,就能够控制舵机旋转的角度。例如,高电平为0.5毫秒时,舵机旋转到0度;高电平为2毫秒时,旋转到135度;高电平为1.5毫秒时,旋转到90度。

视频讲解:

STM32驱动SG90舵机实操(写代码实测)

SG90舵机的工作原理是通过接收PWM信号,控制电机的转动,从而带动舵机的旋转,实现精确的角度控制。

image-20240715151053366

下面是180°的SG90舵机商家给出的说明:写了高电平时间与转动的角度对应关系。

image-20240715150016656

什么样的波形是PWM波形? 下面的图片就是一个解释。

image-20240715150153403

对于舵机的驱动原理: 只需要产生一个周期为20ms,高电平宽度为0.5ms-2.5ms的PWM方波就能驱动舵机。

180°舵机 是一次PWM波形就可以转到指定的角度。

360°舵机需要持续发送PWM波形才可以转动。

一个完整的PWM是由高电平和低电平组成的。 也就是一个周期内,也就是这个20ms内。 可以自由分配 高低电平的占用时间。

这个分配 高低电平的占用时间的过程就叫:调整占空比。

只需要控制这个20ms的周期内。高电平的时间在 0.5ms-2.5ms 范围的内的PWM波形。 就可以任意控制舵机转动。 那么 0.5ms-2.5ms 之间不同的值是有什么不同的效果? 对于: 90°舵机、180°的舵机 是不一样的。

我当前是采用STM32F103单片机驱动的SG90舵机,采用的定时器1的通道1和通道4产生PWM波形,控制2个SG90转动。

定时器1的CCR1寄存器就是比较寄存器,定时器1的CNT寄存器在定时器启动之后就会不断的自增或自减(具体看配置),简单的说就是,CNT寄存器是一个时间基准;而输出的PWM占空比就是依靠CNT寄存器的值与CCR1寄存器的值进行相互比较。 比谁大谁小,从而控制当前的电平是低电平还是高电平,这个过程就是控制占空比的过程。 具体的代码表现形式就是: TIM1->CCR1=xxx

STM32F103RCT6单片机定时器的运行频率是72MHZ; 如果我的定时器分频为720,重装载值填2000,这样的配置,输出的一个PWM周期就是50HZ,也就一个周期的总时间是20ms。

那么如何在代码里,如何实现控制 0.5ms-2.5ms 这个范围的高电平?

如果设置为: TIM1->CCR1=1860; 就表示 2000 -1860 = 140 = 1.4ms高电平。
如果设置为: TIM1->CCR1=1880; 就表示 2000 -1880= 120 = 1.2ms高电平。


二、程序开发

2.1 逻辑分析仪测试

写好代码之后,可以先用逻辑分析仪检测一下单片机IO口输出的PWM情况。

image-20240715151236141

如果设置为: TIM1->CCR1=1860; 就表示 2000 -1860 = 140 = 1.4ms高电平。

看下面的逻辑分析仪测量的结果:

image-20240712204524403

image-20240712204335131

2.2 舵机的驱动问题

SG90舵机驱动的时候,要给外部电源。 如果采用开发板USB供电,是带不动2个以及2个以上的SG90舵机,需要外接稳压电源提供足够的电流才可以正常驱动舵机转动。 这个一定要注意。

2.3 完整代码

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include <string.h>
#include <stdlib.h>


/*


STM32F103C8T6可以用的IO口:PA0-PA15, PB0-PB15, PC13-PC15



STM32F103C8T6最小系统板的IO口。
PB11 PB10 PB1 PB0 PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 PC15 PC14 PC13 
PB12 PB13 PB14 PB15 PA8 PA9 PA10 PA11 PA12 PA15 PB3 PB4 PB5 PB6 PB7 PB8 PB9



PA13(SWDIO)和PA14(SWCLK): 用作STLNK-V2下载器的-SW模式的下载口。


【】摄像头云台舵机
GND----------->GND
VC------------->5V
PA8------------>IO(上下控制舵机)-定时器1的PWM-CH1
PA11---------->IO (左右控制舵机)-定时器1的PWM-CH4


*/



//舵机停止
void motor_Ctrl_Up_Down_stop(void)
{
    TIM1->CCR1=1850;	      //改变占空比
}

//舵机停止
void motor_Ctrl_Left_Right_stop(void)
{
    TIM1->CCR4=1850;	      //改变占空比
}


//舵机开始转动: 正向
void motor_Ctrl_Up_Down_1(void)
{
    TIM1->CCR1=1860;	      //改变占空比
}


//舵机开始转动: 反向
void motor_Ctrl_Up_Down_2(void)
{
    TIM1->CCR1=1840;	      //改变占空比
}


//舵机开始转动: 正向
void motor_Left_Right_Down_1(void)
{
    TIM1->CCR4=1860;	      //改变占空比
}


//舵机开始转动: 反向
void motor_Left_Right_Down_2(void)
{
    TIM1->CCR4=1840;	      //改变占空比
}



//JTAG模式设置,用于设置JTAG的模式
//mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭;	   
#define JTAG_SWD_DISABLE   0X02
#define SWD_ENABLE         0X01
#define JTAG_SWD_ENABLE    0X00		  
void JTAG_Set(u8 mode)
{
	u32 temp;
	temp=mode;
	temp<<=25;
	RCC->APB2ENR|=1<<0;     //开启辅助时钟	   
	AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
	AFIO->MAPR|=temp;       //设置jtag模式
}

void set_pwm_1(float ms)
{
    if(ms >20)
    {
        ms=20;
    }
    TIM1->CCR1=2000-(ms*100);
}


void set_pwm_4(float ms)
{
    if(ms >20)
    {
        ms=20;
    }
    TIM1->CCR4=2000-(ms*100);
}


int main()
{
    //开启STLINK_SWD下载模式
    JTAG_Set(SWD_ENABLE);
    
    //串口1初始化,用于打印
    USART1_Init(115200);
    printf("STM32串口1初始化成功.\r\n");
      
    
    //初始化定时器1,输出PWM,通道1、4,控制SG90舵机
    //一个周期20ms 
    TIM1_PWM_Init(2000,720); //计数频率  单脉冲+重复计数模式	
    
    //转动到0°
    set_pwm_1(0.5);
    set_pwm_4(0.5);
    
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
   
   
    while(1)
    {  
        
        //转动到90°
        set_pwm_1(1.5); //第一个先转90
        set_pwm_4(2.5); //第二个再转180

        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);

        set_pwm_1(0.5); //之后第一个再转到0。
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        
        set_pwm_1(1.5); //然后第一个再赚到90。
        
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        
        set_pwm_4(0.5);//然后第二个再占到零。
        
        delay_ms(1000);
        delay_ms(1000);
         delay_ms(1000);
        delay_ms(1000);
        
        set_pwm_1(0.5); //然后第一个在转到零。
        
        delay_ms(1000);
        delay_ms(1000);
         delay_ms(1000);
        delay_ms(1000);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

精品在线试题库系统

TOC springboot108精品在线试题库系统 绪论** 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让时…

Carry你飞驰:VELO Prevail TT坐垫,不是超人,也能飞!

确认过黑丝腿&#xff0c;是很爱骑的人&#xff01;以前脚踩二八大杠&#xff0c;就能赚足出街回头率&#xff0c;现在的打工牛马是坚持早c晚c&#xff0c;晨骑夜骑解压续命。夏日的阳光炙烤着大地&#xff0c;空气中弥漫着滚滚热浪&#xff0c;对于每一位热爱骑行的骑士来说&a…

WindowsAPI 查阅笔记:网络通信

客户端&#xff1a; 记得在编译的时候加上这个 -lwsock32 -lws2_32。 不然会报错 undefined reference to __imp_WSAStartup‘。 注意&#xff1a;如果端口在此之前被占了&#xff0c;则不会发生预期的结果 服务端&#xff0c;得到连接后创建线程&#xff0c;执行处理函数。…

你真的了解电子标签的潜力吗?3秒快刷颠覆你的想象

随着ESL电子标签在零售领域的大范围应用&#xff0c;其方便快捷更改显示内容的功能也逐渐拓展到仓储显示领域。但是仓储作业过程中货品出入库频繁&#xff0c;常规电子标签在实际使用过程中存在刷新速度偏长&#xff0c;无法充分满足仓储出入库数据更新的需求。因此&#xff0c…

阿里云智能大数据演进

本文根据7月24日飞天发布时刻产品发布会、7月5日DataFunCon2024北京站&#xff1a;大数据大模型.双核时代实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a;徐晟 阿里云研究员/计算平台产品负责人 主要内容&#xff1a; Overview - 阿里云大数据 AI 产品…

秋招突击——面经整理——有塔游戏提前批

文章目录 引言正文一面说一下堆排序 二面有了解过游戏后端应该是干什么的吗&#xff1f;博客是从什么时候开始写的&#xff1f;平常在哪里做题&#xff1f;做了多少题&#xff1f;给你二维矩阵&#xff0c;零代表可以走&#xff0c;一代表不可以走&#xff0c;从起点到终点&…

Java:文件IO

JavaEE16 一、文件系统操作 在java标准库中&#xff0c;实现了File类&#xff0c;其中提供了文件操作的方法&#xff01; 1、构造方法&#xff1a; 方法名说明 File(File parent , String child) 根据父目录孩子文件路径&#xff0c;创建一个新的File 实例File( String path…

dockers 阿里云镜像失效后如何配置,可视化操作

Windows 环境 Client:Version: 24.0.6Context: defaultDebug Mode: false方法一 docker-desktop 配置方式 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,…

【echarts】甘特图

const milestones [{ progress: 100, milestoneName: 阶段一, startDate: 2020-12-23, endDate: 2021-01-30 },{ progress: 100, milestoneName: 阶段二, startDate: 2021-01-15, endDate: 2021-03-15 },{ progress: 100, milestoneName: 阶段三, startDate: 2021-03-10, endD…

ubuntu 24.04执行apt-get update报错处理

文章目录 一、apt-get update报错内容二、解决启动失败的服务推荐阅读 今天在做Ubuntu 24.04更新时&#xff0c;突然跳出两个报错&#xff0c;这在之前还从未遇到过&#xff0c;处理过程记录和分享一下&#xff1a; 一、apt-get update报错内容 报错截图参考如下&#xff1a; …

现货黄金美盘开盘时间是什么呢

现货黄金的开盘时间会因为地区和平台而有所差异&#xff0c;一般来说&#xff0c;香港的平台在北京时间周一早间7点左右会开盘&#xff0c;并一直持续周六凌晨才收盘&#xff0c;周六和周日是市场的休市时间&#xff0c;期间交易平台一般会关闭&#xff0c;无法进行交易&#x…

一文读懂什么是进销存!进销存有何价值作用?

企业在运营过程中&#xff0c;常常会遇到诸如库存不准确、采购计划混乱、销售数据跟踪困难等问题&#xff0c;这些问题不仅影响了企业的日常运营&#xff0c;还可能导致客户满意度下降、利润受损。而一个合适的进销存系统&#xff0c;就像是一把钥匙&#xff0c;可以帮助企业打…

MySQL基础练习题34-游戏玩法分析4

目录 题目 准备数据 分析数据 总结 题目 报告在首次登录的第二天再次登录的玩家的 比率&#xff0c;四舍五入到小数点后两位。换句话说&#xff0c;你需要计算从首次登录日期开始至少连续两天登录的玩家的数量&#xff0c;然后除以玩家总数。 准备数据 ## 创建库 create…

为什么要学医疗器械维修?

在当今高速发展的医疗领域&#xff0c;医疗器械维修已成为一个极具吸引力和潜力的职业选择。那么&#xff0c;为什么要学习医疗器械维修呢&#xff1f; 一、稳定且持续增长的需求 随着医疗技术的不断进步&#xff0c;医疗器械的种类和数量日益增多。从常见的 X 光机、CT 扫描仪…

新专利:温室土壤温湿度预测模型构建方法和程序产品

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;在现代设施农业生产中&#xff0c;温室微环境的精准调控是提高作物产量和品质的关键。然而&#xff0c;由于温室内外环境因素的复杂多变&#xff0c;尤其是土壤温湿度的非线性、非平稳特性&#xff0c;传统的预…

【vue3|第23期】Vite + Vue3: 深入理解public和assets文件夹的作用与使用

日期&#xff1a;2024年8月14日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

如果让你消息队列,该如何设计?说一下你的思路

在当今的分布式系统中&#xff0c;消息队列是一个不可或缺的组件&#xff0c;它在系统解耦、流量削峰、异步处理等方面发挥着重要作用。 如果我要设计一个消息队列&#xff0c;我会从以下几个关键点出发呢&#xff1f; 让我们来探讨一下如何设计一个消息队列的架构。 实现内存…

【MySQL】数据库初识

文章目录 前言一、MySQL的基本结构二、MySQL的组成三、数据库的简单使用数据库操作数据类型认知数值类型字符串类型日期类型 数据库表操作 总结 前言 数据库是一类软件&#xff0c;有MySQL、Oracle、SQL Server、Redis等作为代表&#xff0c;通过数据库能够对数据进行管理和组…

六大热门及两个趋冷的网络安全趋势

AI不仅在改变威胁环境,还在改变安全团队保护其组织的方式,然而,AI并不是网络安全专业人士应该关注的唯一趋势。 在网络安全领域,与其他领域一样,AI和GenAI都是人们关注的焦点,恶意行为者正在利用AI和GenAI创造更具隐蔽性的恶意软件、更具说服力的钓鱼邮件以及更逼真的深…

DevExpress开发WPF应用实现对话框总结:编织界面的艺术之旅

在软件开发的浩瀚星空中&#xff0c;WPF&#xff08;Windows Presentation Foundation&#xff09;以其卓越的界面表现力和丰富的控件库&#xff0c;成为了众多开发者心中的璀璨明珠。而DevExpress&#xff0c;作为WPF领域的佼佼者&#xff0c;更是以其强大的组件库和易于集成的…