舵机使用总结

文章目录

  • 1 舵机简介
  • 2 注意事项
  • 3 编写驱动程序
    • 3.1 使用STM32作为控制器
      • 3.1.1 计算高电平对应程序中的取值范围
      • 3.1.2 编写控制程序

1 舵机简介

在这里插入图片描述
舵机使用PWM控制,周期为20ms,通过改变高电平占空比来驱动,高电平通常为1~2ms( 或 0.5 ~2.5ms)
在这里插入图片描述

2 注意事项

  1. 给舵机供电时,注意电流要足够,像使用电脑USB供电有可能带不动舵机
  2. 程序中高电平取值范围可以缩小一点,如最大值是200,最小值是40,程序中可以定义 #define DUTY_CYCLE_MIN 38 ;#define DUTY_CYCLE_MAX 198 ,这样操作,舵机转到最大最小限位处,就不会响了。

3 编写驱动程序

3.1 使用STM32作为控制器

STM32单片机产生PWM,参考 《STM32CubeMX之定时器TIM,PWM》

3.1.1 计算高电平对应程序中的取值范围

舵机控制周期是20ms,高电平范围为 0.5~2.5ms
低位占空比:0.5 / 20 = 0.025;
高位占空比:2.5 / 20 = 0.125;

快速计算prescaler值,舵机周期是20ms固定值,即50Hz,Counter Period = 200,MCU时钟为72MHz
所以 72000000/50/200 = 7200

  1. 定时器初始化参数Counter Period = 200;
    在这里插入图片描述
    在程序中
    低位占空比取值:200x0.025 = 5
    高位占空比取值:200x0.125 = 25

  2. 定时器初始化参数Counter Period = 400;
    在这里插入图片描述
    在程序中
    低位占空比取值:400x0.025 = 10
    高位占空比取值:400x0.125 = 50

  3. ……
    按照规律可以细分更多

3.1.2 编写控制程序

  1. 该程序逻辑实现,两个按键分别控制舵机顺时针和逆时针旋转,每按一下舵机旋转一个刻度(该刻度的精细可由定时器初始化参数Counter Period改变)

    // 舵机的高电平范围为0.5ms ~ 2.5ms
    #define DUTY_CYCLE_MIN 5  // 注意该值范围跟定时器初始化参数Counter Period 有关系
    #define DUTY_CYCLE_MAX 25
    
    
    static uint8_t key1_flag = FALSE;
    static uint8_t key2_flag = FALSE;
    static uint8_t duty_cycle = DUTY_CYCLE_MAX;
    
    void servo_dispose(void)
    {
        if(0 == key1_get_status()) // 获取按键值
        {
            HAL_Delay(10);
            if(0 == key1_get_status())
            {
                if(key1_flag == FALSE)
                {
                    key1_flag = TRUE;
                    if((++duty_cycle) > DUTY_CYCLE_MAX)
                    {
                       duty_cycle  = DUTY_CYCLE_MAX;
                    }
                    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_cycle);
                }
            }
        }
        else
        {
            key1_flag = FALSE;
        }
    
        if(0 == key2_get_status())
        {
            HAL_Delay(10);
            if(0 == key2_get_status())
            {
                if(key2_flag == FALSE)
                {
                    key2_flag = TRUE;
                    if((--duty_cycle) < DUTY_CYCLE_MIN)
                    {
                       duty_cycle  = DUTY_CYCLE_MIN;
                    }
                    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_cycle);
                }
            }
        }
        else
        {
            key2_flag = FALSE;
        }
    }
    
    int main(void)
    {
    	……
    	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);  // 开启PWM
    	__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,25); // 定义舵机有效的高电平占空比,这里配置最大值
    	while (1)
    	 {
    		servo_dispose();
    	 }
    }
    
  2. 该程序逻辑实现,两个按键分别控制舵机顺时针和逆时针旋转,按住按键舵机持续转动直到停止

    // 舵机的高电平范围为0.5ms ~ 2.5ms
    // 1. 定时器初始化参数Counter Period 为200时,对应高电平取值范围如下
    // #define DUTY_CYCLE_MIN 10
    // #define DUTY_CYCLE_MAX 50
    
    // 2. 定时器初始化参数Counter Period 为1600时,对应高电平取值范围如下
    #define DUTY_CYCLE_MIN 38 // 最小值为40 ,可以稍微取值小一点,这样舵机到达最小限位处不会响
    #define DUTY_CYCLE_MAX 198  // 最大值为200 ,可以稍微取值小一点,这样舵机到达最大限位处不会响
    
    static uint8_t duty_cycle = DUTY_CYCLE_MAX;
    
    void servo_dispose(void)
    {
        if(0 == key1_get_status())
        {
            HAL_Delay(10);
            if(0 == key1_get_status())
            {
                // HAL_Delay(10); // 控制速度,速度太慢会出现一顿一顿的
                if((++duty_cycle) > DUTY_CYCLE_MAX)
                {
                    duty_cycle  = DUTY_CYCLE_MAX;
                }
                __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_cycle);
            }
        }
    
        if(0 == key2_get_status())
        {
            HAL_Delay(10);
            if(0 == key2_get_status())
            {
                // HAL_Delay(30); // 控制速度,速度太慢会出现一顿一顿的
                if((--duty_cycle) < DUTY_CYCLE_MIN)
                {
                    duty_cycle  = DUTY_CYCLE_MIN;
                }
                __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,duty_cycle);
            }
        }
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ系列之入门级

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之入门级》。&#x1f3af;&#x…

YOLOv8全网首发:新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,与YOLOv8 SPPF高效结合 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡…

AOI与AVI:在视觉检测中的不同点和相似点

AOI&#xff08;关注区域&#xff09;和AVI&#xff08;视觉感兴趣区域&#xff09;是视觉检测中常用的两个概念&#xff0c;主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配&#xff0c;但它们在定义和实际应用等方面有一些差异。 AOI…

x86-x64汇编语言、反汇编知识和IDA

x86-x64汇编语言 基础知识 x86寄存器&#xff1a; 通用寄存器&#xff1a;EAX, EBX, ECX, EDX, ESI, EDI 栈顶指针寄存器&#xff1a;ESP 栈底指针寄存器&#xff1a;EBP 指令计数器&#xff1a;EIP 段寄存器&#xff1a;CS, DS, ES, FS, GS, SS x86-64寄存器&#xff1a;&a…

2.【C语言】(函数指针||sizeof||笔试题)

0x01.函数指针 void test(const char* str) {printf("%s\n", str); }int main() {void (*pf)(const char*) test;//pf是函数指针变量void (*pfarr[10])(const char*);//pfarr是存放函数指针的数组void (*(*p)[10])(const char*) &pfarr;//p是指向函数指针数组…

Leetcoder Day10|栈与队列part02(栈的应用)

语言&#xff1a;Java/C 目录 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 今日总结 20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字…

WEB接口测试之Jmeter接口测试自动化 (三)(数据驱动测试)

接口测试与数据驱动 1简介 数据驱动测试&#xff0c;即是分离测试逻辑与测试数据&#xff0c;通过如excel表格的形式来保存测试数据&#xff0c;用测试脚本读取并执行测试的过程。 2 数据驱动与jmeter接口测试 我们已经简单介绍了接口测试参数录入及测试执行的过程&#xff0…

Unity3D Pico VR 手势识别物体交互 适配 MRTK3

当前Pico已经支持手势识别了&#xff0c;但是提供的PICO Unity Integration SDK 中是没有手势和物体交互的功能&#xff0c;Unity XR Interaction Toolkit提供的手势识别物体交互对 Quest适配的挺好的&#xff0c;Pico 当前只能用指尖点触还不能对物体进行抓握以及手势控制射线…

数据结构一:算法效率分析(时间复杂度和空间复杂度)-重点

在学习具体的数据结构和算法之前&#xff0c;每一位初学者都要掌握一个技能&#xff0c;即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率。所谓算法&#xff0c;即解决问题的方法。同一个问题&#xff0c;使用不同的算法&#xff0c;虽然得到的结果相同&#xff0c;…

开发实践8_project

要求&#xff1a; 使用Restful对Chaos模型作基本操作。 结果&#xff1a; post 3 组数据后&#xff0c;get 查询如下&#xff1a; put修改后get&#xff1a; delete pk3之后get&#xff1a; 代码&#xff1a; python manage.py startapp pro8_app 注册 总路由 // path(pr…

免费200万Tokens 用科大讯飞API调用星火大模型服务

简介 自ChatGPT火了之后&#xff0c;国内的大模型发展如雨后春笋。其中的佼佼者之一就是科大讯飞研发的星火大模型,现在大模型已经更新到V3 版本&#xff0c;而且对开发者也是相当友好&#xff0c;注册就送200万tokens,讯飞1tokens 约等于 1.5 个中文汉字 或者 0.8 个英文单词…

JVM 如何判断一个对象可以被回收

Hi&#xff0c; 我是 浮生。 今天分享一道一线互联网公司必问的面试题。 ”JVM 如何判断一个对象可以被回收“ 关于这个问题&#xff0c;来看看高手的回答。 一、问题解析 在 JVM 里面&#xff0c;要判断一个对象是否可以被回收&#xff0c;最重要的是判断这个对象是否还在被…

中仕教育:省考怎么查每个岗位报考人数?一篇文章带你搞定!

参加省考避开热门岗位能够一定程度上提高上岸几率&#xff0c;怎么看岗位报考人数? 1. 官方公告&#xff1a;每年省考发布招录公告时&#xff0c;会公布各个岗位的招录人数&#xff0c;可以关注招录信息。 2. 查询报名数据&#xff1a;在报名结束后&#xff0c;省考招录机关…

debian12.4配置

文章目录 debian12.4配置概述笔记将非root用户添加到sudo组更换国内源配置ssh的客户端访问END debian12.4配置 概述 在虚拟机中装了一个debian12.4, 想配置ssh客户端连接, 出了问题. 配置乱了, 还好长了个心眼, 做了快照. 发现2个问题: debian12.4默认安装完, 有ssh, 先检查…

Python自动化测试【selenium面试题】

一、selenium中如何判断元素是否存在&#xff1f; expected_conditions模块提供了16种判断方法&#xff0c;以下方法是判断元素存在DOM中&#xff1a; presence_of_element_located """ An expectation for checking that an element is present on the DOM of…

【Linux】第三十一站:管道的一些应用

文章目录 一、我们之前的|(竖划线)管道二、自定义shell三、使用管道实现一个简易的进程池1.详解2.代码3.一个小bug4.最终代码 一、我们之前的|(竖划线)管道 cat test.txt | head -10 | tail -5如上代码所示&#xff0c;是我们之前所用的管道 我们拿下面这个举个例子 当我们用…

【SpringBoot】—— 如何创建SpringBoot工程

SpringBoot简化了Spring应用的初始搭建和开发过程。 工程创建 新建模块 出现java: 错误: 无效的源发行版&#xff1a;18这样的错误&#xff0c; 修改pom.xml文件 出现以下信息&#xff0c;即运行成功 修改默认端口 创建application.yml文件 内容&#xff1a; server:port:…

【没学过编程语言,想要做一款游戏应该怎么做?】

*** 【没学过编程语言&#xff0c;想要做一款游戏应该怎么做&#xff1f;】 想让你的创意成为像《堡垒之夜》《原神》这样引爆式的热门游戏吗&#xff1f; 想制作一个能与《我的世界》《模拟城市》一决高下的畅销游戏吗&#xff1f; 即使你手头并没有复杂的代码能力&#xf…

知识图谱KG+大模型LLM

LLM-based KG KnowLM OpenSPGKG-based RAG 基本原理 从query出发的语义解析 pre-LLM方法 思想&#xff1a;直接将问题解析为对应的逻辑表达式&#xff0c;然后到知识图谱中查询。 方法&#xff1a;通常包含逻辑表达式、语义解析算法、语义解析模型训练三部分。一般步骤是将问句…

【51单片机Keil+Proteus8.9+ADC0804】ADC实验 模拟转数字实验

一、实验名称 ADC实验 模拟转数字实验 二、设计思路 电路设计 1.选用AT89C51单片机作为电路核心单元&#xff0c;外接8位单通道AD转换器ADC0804芯片和LM016L显示器以及滑动变阻器等其它常用元器件构成电路。 2.将ADC0804芯片的控制引脚RD,WR,INTR接到AT89C51芯片对应引脚&…