【STC32G12K128开发板】第3-10讲:SG90舵机驱动

news2024/9/24 9:23:32

第3-10讲:SG90舵机驱动

    1. 学习目的
  1. 了解SG90舵机的相关参数、控制方式。
  2. 编程用PWM驱动SG90舵机,通过按键改变舵机旋转角度。
    1. 舵机简介
      1. 规格参数

“舵机”这个名号其实是一个俗称,是那些玩航模、船模的人起的名字,因为这种电机常被用于舵面控制。舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的闭环控制执行模块。

舵机是一个闭环控制系统。控制电路板接收来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴与位置反馈电位计相连,舵盘转动的同时带动位置反馈电位计,电位计将输出一个电压信号到控制电路板进行反馈,然后控制电路板根据所在位置决定电机转动的方向和速度,从而达到目标停止。

我们学习舵机时,通常以经典款模拟舵机SG90入门,SG90是一种微型舵机,具有便宜、小巧的特点,常用于小型模型、玩具或智能小车等。

SG90舵机规格参数如下图所示。

图1:SG90规格参数

      1. 接口信号

图2:SG90舵机接口信号

      1. 驱动方式

SG90舵机通常使用PWM驱动:用单片机的定时器或者PWM外设生成一个周期为20ms的PWM波,按照下图的占空比即可驱动舵机旋转到相应的角度。

图3:SG90舵机旋转角度和脉冲宽度关系

  • 注意事项:驱动舵机时,不同的占空比(高电平持续时间)是驱动舵机旋转到对应的角度,而不是旋转对应的角度。如2.5%的占空比(高电平持续时间0.5ms),舵机会旋转到0度,之后,一直保持该占空比输出,舵机是不会继续旋转的。
    1. 软件设计
      1. SG90舵机驱动实验
  • 注:本节的实验是在“实验2-15-1:PWM输出波形”的基础上修改,本节对应的实验源码是:“实验3-10-1:SG90舵机驱动(按键改变旋转角度)”。
        1. 实验内容

使用STC8A8K64D4单片机的PWM通道6的P1.6引脚输出频率为50Hz(周期20ms)的波形,通过开发板上的按键修改PWM输出波形的占空比,实现控制SG90旋转。

  •  按键KEY1:舵机旋转到45度。
  • 按键KEY2:舵机旋转到90度。
  • 按键KEY3:舵机旋转到135度。
  • 按键KEY4:舵机旋转到180度。
        1. 代码编写
  1. 配置PWM

本例中,通道6,选择P1.6为通道6的输出引脚,频率:50Hz,占空比2.5%(让舵机初始化旋转到0度),代码清单如下。

代码清单:初始化PWM

  1. /********************************************************************************** 
  2. 功能描述:初始化PWM模块。 
  3.         :使用通道6,选择P1.6为通道6的输出引脚,频率:50Hz,占空比2.5% 
  4. 参    数:无 
  5. 返 回 值:无 
  6. ***********************************************************************************/  
  7. void pwm_config(void)  
  8. {  
  9.     PWMSET |= 0x01;              //使能PWM模块,必须先使能后面的配置才能生效  
  10.       
  11.     /*---------------------PWMCFG----------------------------------- 
  12.     位7  位6  位5  位4    位3      位2      位1     位0    
  13.     --   --   --   --   PWMCBIF  EPWMCBI  EPWMTA  PWMCEN 
  14.     x    x    x     x      0        0        0       0 
  15.     PWMCBIF:PWM计数器归零中断标志位,需软件清零 
  16.     PEPWMCBI=0:使能PWM计数器归零中断 
  17.     EPWMTA = 0:PWM与ADC不关联 
  18.     PWMCEN = 0:PWM停止计数 
  19.     ---------------------------------------------------------------*/  
  20.     PWMCFG = 0x00;                 
  21.   
  22.     P_SW2 |= 0x80;               //将EAXFR位置1,允许访问扩展RAM区特殊功能寄存器(XFR)  
  23.     /*---------------------PWMCKS----------------------------------- 
  24.     位7  位6  位5   位4     位3~0    
  25.     --   --   --   SELT2  PWM_PS[3:0] 
  26.     1    0    x     0        1011 
  27.  
  28.     SELT2=0:PWM 时钟源为系统时钟经分频器分频之后的时钟  
  29.     PWM_PS[3:0]=1111:系统时钟的1/16,(24/16)MHz = 1.5MHz 
  30.     ---------------------------------------------------------------*/  
  31.     PWMCKS = 0x0F;        
  32.       
  33.     /*---------------------PWM6CR----------------------------------- 
  34.     位7  位6  位5  位4~3     位2   位1    位0 
  35.     ENO  INI  --  C0_S[1:0]  ENI  ENT2I  ENT1I 
  36.      1    1    x     00       0     0      0 
  37.      
  38.     ENO = 1:PWM的通道6相应PWM端口为 PWM 输出口 
  39.     INI = 0:PWM的通道6初始电平为低电平 
  40.     C0_S[1:0] =01:选择P1.6为PWM通道6输出脚 
  41.     ENI = 0:使能PWM通道6的PWM中断 
  42.     ENT2I = 0:关闭PWM的通道6在第2个触发点中断 
  43.     ENT1I = 0:关闭PWM的通道6在第1个触发点中断 
  44.     ---------------------------------------------------------------*/  
  45.     PWM6CR = 0x88;    
  46.     PWMC   = 29999;            //设置 PWM 周期为 20ms  
  47.     PWM6T1 = 0;                //第1触发点设置为0  
  48.     PWM6T2 = SG90_90D_PWM_VAL; //设置第2触发点,让舵机旋转到0度
  49.     P_SW2 &= 0x7F;             //将EAXFR位置0,禁止访问XFR  
  50.     PWMCFG |= 0x01;            //将PWMCEN位置1,使能PWM波形发生器,PWM计数器开始计数  
  1. 修改PWM占空比

为了方便控制舵机旋转角度,我们编写一个根据角度修改PWM占空比的函数以便于应用程序调用。首先,定义出舵机旋转角度对应的PWM第2触发点的值,如下所示。

代码清单:定义舵机旋转角度对应的PWM第2触发点的值

  1. #define  SG90_0D_PWM_VAL      29250  //旋转到0度时PWM第2触发点的值  
  2. #define  SG90_45D_PWM_VAL     28500  //旋转到45度时PWM第2触发点的值  
  3. #define  SG90_90D_PWM_VAL     27750  //旋转到90度时PWM第2触发点的值  
  4. #define  SG90_135D_PWM_VAL    27000  //旋转到135度时PWM第2触发点的值  
  5. #define  SG90_180D_PWM_VAL    26250  //旋转到180度时PWM第2触发点的值  

驱动舵机旋转到某个角度,也就是将PWM占空比修改为角度对应的值,即修改PWM第2触发点的值,代码清单如下。

代码清单:驱动舵机旋转到指定的角度

  1. /********************************************************************************** 
  2. 功能描述:驱动舵机旋转到指定的角度。 
  3. 参    数:angle[in]:角度的编号 
  4. 返 回 值:无 
  5. ***********************************************************************************/  
  6. void set_angle(u8 angle)  
  7. {  
  8.     P_SW2 |= 0x80;               //将EAXFR位置1,允许访问扩展RAM区特殊功能寄存器(XFR)  
  9.     switch (angle)  
  10.     {  
  11.        case SG90_0_DEGREE:  
  12.           PWM6T2=SG90_0D_PWM_VAL;  //第2触发点设置为29250,对应占空比为2.5%,即高电平持续时间0.5ms
  13.           break;  
  14.           
  15.        case SG90_45_DEGREE:  
  16.           PWM6T2=SG90_45D_PWM_VAL; //第2触发点设置为28500,对应占空比为2.5%,即高电平持续时间0.5ms
  17.           break;  
  18.           
  19.        case SG90_90_DEGREE:  
  20.           PWM6T2=SG90_90D_PWM_VAL; //第2触发点设置为27750,对应占空比为2.5%,即高电平持续时间0.5ms
  21.           break;  
  22.           
  23.        case SG90_135_DEGREE:  
  24.           PWM6T2=SG90_135D_PWM_VAL;//第2触发点设置为27000,对应占空比为2.5%,即高电平持续时间0.5ms
  25.           break;  
  26.           
  27.        case SG90_180_DEGREE:  
  28.           PWM6T2=SG90_180D_PWM_VAL;//第2触发点设置为26250,对应占空比为2.5%,即高电平持续时间0.5ms
  29.           break;  
  30.     }  
  31.     P_SW2 &= 0x7F;           //将EAXFR位置0,禁止访问XFR  
  32. }  
  1. 主函数

主函数中完成相关的初始化,之后,在主循环中扫描按键状态,根据扫描到的键值驱动舵机旋转到对应的角度,代码清单如下。

代码清单:主函数

  1. /********************************************************************************** 
  2. 功能描述:主函数 
  3. 参    数:无 
  4. 返 回 值:int类型 
  5. ***********************************************************************************/  
  6. int main(void)  
  7. {  
  8.     u8  button_num;  
  9.       
  10.     P2M1 &= 0xBF;   P2M0 &= 0xBF;     //设置P2.6为准双向口(指示灯D1)  
  11.     P1M1 &= 0xBF;   P1M0 |= 0x40;     //设置P1.6为推挽  
  12.     P3M1 &= 0x3F;   P3M0 &= 0x3F;     //设置P3.6~P3.7为准双向口(按键KEY2和KEY1)  
  13.     P0M1 &= 0x5F;   P0M0 &= 0x5F;     //设置P0.5,P0.7为准双向口(按键KEY4和KEY3)  
  14.   
  15.     pwm_config();                     //初始化PWM  
  16.     while(1)  
  17.     {  
  18.         button_num = buttons_scan(0);          //获取开发板用户按键检测值,不支持连按  
  19.         if(button_num == BUTTON1_PRESSED)      //按键KEY1按下  
  20.         {   
  21.             set_angle(SG90_45_DEGREE);         //舵机旋转到45度  
  22.         }  
  23.         else if(button_num == BUTTON2_PRESSED) //按键KEY2按下  
  24.         {  
  25.             set_angle(SG90_90_DEGREE);         //舵机旋转到90度  
  26.         }  
  27.         else if(button_num == BUTTON3_PRESSED) //按键KEY3按下  
  28.         {  
  29.             set_angle(SG90_135_DEGREE);        //舵机旋转到135度  
  30.         }  
  31.         else if(button_num == BUTTON4_PRESSED) //按键KEY4按下  
  32.         {  
  33.             set_angle(SG90_180_DEGREE);        //舵机旋转到180度  
  34.         }  
  35.         delay_ms(100);             
  36.     }  
  37. }  
        1. 硬件连接

如下图所示,将SG90舵机安装到开发板上。

图4:硬件连接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验3-10-1:SG90舵机驱动(按键改变旋转角度)”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\sg90_pwm\project”目录下的工程文件“sg90_pwm.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“sg90_pwm.hex”位于工程的“…\sg90_pwm\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 程序运行后,分别按下KEY1~ KEY4,可以观察到:
  • 按下按键KEY1:舵机旋转到45度。
  • 按下按键KEY2:舵机旋转到90度。
  • 按下按键KEY3:舵机旋转到135度。
  • 按下按键KEY4:舵机旋转到180度。

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

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

相关文章

yolov8pose 部署rknn(rk3588)、部署地平线Horizon、部署TensorRT,部署工程难度小、模型推理速度快,DFL放后处理中

特别说明:参考官方开源的yolov8代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 之前写了yolov8、yolov8seg、yolov8obb 的 DFL 放在模型中和放在后处理…

界面控件DevExpress WinForms,支持HTML CSS提升用户体验(一)

DevExpress WinForms现在可以利用HTML/CSS强大的功能,帮助受DevExpress驱动的WinForms应用程序引入现代的UI元素和用户体验! P.S:DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。Dev…

E25.【C语言】练习:修改二进制序列的指定位

十进制13-->二进制01101 现要求二进制序列的第5位修改为1,再改成0 复习:逻辑运算 非(NOT)(C语言:~) x0,NOT x-->1;x1,NOT x-->0 与(…

Animate软件基础:将对象分层以应用补间动画

在Animate进行内容制作时,有时会需要把元件或对象分散到多个图层中,可以使用软件的分散图层功能。 将补间动画应用于对象时,Animate 会自动将该对象移动到其补间图层。 但是,也可以自己将对象分散到其各自的图层。例如&#xff0c…

【最长重复子数组】python刷题记录

R3-滑动窗口专题 . - 力扣(LeetCode)

拉盖尔高斯光束表达式及Python代码

1. 拉盖尔-高斯光束的电场分布通常可以用以下表达式来表示: 2. Python代码表示 import numpy as np import matplotlib.pyplot as plt from scipy.special import genlaguerre import mathdef laguerre_gaussian_beam(r, phi, z, l, p, w0, wavelength):k 2 * np.…

Centos linux服务器解决EMQX界面显示不全问题

最近要在centos服务器配置EMQX。 而centos自带的火狐浏览器不兼容EMQX的界面显示,F12看浏览器后台,出现了一些JavaScript代码语法错误。 SyntaxError: invalid identity escape in regular expression 但是Microsoft edge浏览器不支持linux系统&#x…

使用 1panel面板 部署 php网站

代码仓库:https://github.com/talmudmaster/RedCorpus 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名(可跳过)3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件(服务器和面板开放端口)7. 创…

Python设计模式 - 抽象工厂模式

定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 产品等级结构与产品族 为了更好地理解抽象工厂模式,先引入两个概念: 产品等级结构:就是产品的…

u盘数据丢失怎么办?以下这四招教你轻松找回!

重要的文件资料要是不小心手滑删除了,轻则遭受领导的责骂,重则就是直接受到老板的警告了,所以打工人应该要人手必备数据找回的技巧,尤其是在针对已经拷贝好了数据在u盘当中时,更是需要快速去找到数据恢复的技巧&#x…

S02. 内核的实现(未完)

一、虚拟内存管理 1、内存分页 二级页表线性地址转换物理地址过程如下: 用虚拟地址的高10位乘以4,作为页目录表内的偏移地址,加上页目录表的物理地址,所得的和便是页目录项的物理地址。读取该页目录项,从中获取到页…

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…

CTFSHOW 萌新 web10 解题思路和方法(passthru执行命令)

点击题目链接,分析页面代码。发现代码中过滤了system、exec 函数,这意味着我们不能通过system(cmd命令)、exec(cmd命令)的方式运行命令。 在命令执行中,常用的命令执行函数有: system(cmd_code);exec(cmd_…

Xilinx管脚验证流程及常见问题

1 流程 1.1 新建I/O Planning Project I/O Planning Project中可以不需要RTL的top层.v代码,仅图形化界面即可配置管脚约束XDC文件的生成: Create I/O Ports: 导出XDC文件和自动生成的top_interface.v文件: 1.2 新建test Project …

HarmonyOS开发:生命周期详解

目录 前言 生命周期的概念HarmonyOS生命周期最后 前言 随着移动端操作系统的多样化发展,HarmonyOS作为华为推出的一款面向全场景的分布式操作系统,受到了业内外的广泛关注。其实HarmonyOS的设计和开发模式,与传统的移动端操作系统有着显著…

【TwinCAT3教程】IEC61131-3编程基础

在开发可编程序控制器(PLC)的早期阶段没有统一的标准,这种编程语言不统一的情况,给用户带来极大的不方便,近几年由于自动化系统的发展,IEC的第七个工作组制定了IEC(International Electro techn…

三十七、MyBatis-Plus(3)

🌻🌻 目录 一、CRUD 扩展 (2)1.1 Select1.2 分页查询1.3 Delete1.3.1 物理删除1.3.2 逻辑删除 二、性能分析插件三、条件构造器四、代码自动生成器 一、CRUD 扩展 (2) 1.1 Select 查询所有: /* * 查询 * */Test //查询全部 public void sele…

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件,有自己的电阻,电感,电容 PCB走线在直角转弯的地方,信号前后部分相互影响,导致分布电容增加,对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…

鸿蒙媒体开发【相机数据采集保存】拍照和图片

相机数据采集保存 介绍 本示例主要展示了相机的相关功能 接口实现相机的预览拍照功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机?点击“允许”弹出是否允许“CameraSample”使用麦克风?点击“允许”进入预览界面,预览正…

快递点“内鬼”才是倒卖我们个人信息的源头

下面是一个真实的案例来分析一下我们的信息是怎么被倒卖出去的。以次来给大家敲响警钟,不要相信所谓的退货退款类的诈骗。【所有涉及到金钱的都是诈骗,获取你信息也很容易,所以不要轻信诈骗谎言】 01-盗取快递信息过程 内鬼与骗子勾结&…