前言

本文章仅作为我学习的一次记录,本人的技术还不够成熟,可能无法对工程技术上做太多指导。
    工程为基于HT32F52352的智能物联网宠物喂食机系统,通过HT32控制舵机工作,完成饲料的投喂。


一、舵机介绍

1、舵机的分类

    按照舵机内部的控制电路不同,可以分为模拟舵机和数字舵机。
    模拟舵机:模拟舵机内部为纯模拟电路,需要通过一直发送一定频率和占空比的PWM信号才能转动至规定的角度;
    数字舵机:数字舵机内部集成有微控制器模块,在接收了一次PWM信号后即可转动至规定角度。

    按照舵机内部的机械材质,可以分为塑料齿舵机和金属齿舵机。
    塑料齿舵机:内部齿轮结构为塑料制成,重量轻,价格低,但舵机扭矩一般较小,例如SG90; 
    金属舵机:内部齿轮为金属制成,重量大,扭矩大,但价格也相对更高;

按照舵机的旋转角度范围,可以分为180°舵机和360°舵机。
    180°舵机:可以控制旋转角度、有角度定位;上电后舵机自动复位到0°,通过一定参数的脉冲信号控制它的角度。
    360°舵机:不可控制角度,只能顺/逆时针旋转、停止、调节转速。无角度定位,因为这是为360°任意旋转的,所以无0°,上电不会复位到0°;通过一定参数的脉冲信号控制它的旋转。

此外,舵机在不同的应用场景和使用途径上还有很多种分类,目前我还没有更多的使用需求,因此了解不多,感兴趣的朋友可以自行查阅。

2、舵机的工作原理

在很多教程中都讲过,想要控制舵机转动,就需要发送一定周期 (频率) 和脉冲宽度 (占空比) 的PWM波,周期一般为20ms(即频率为50Hz)脉冲宽度为0.5ms~2.5ms(即占空比为2.5%~12.5%),但我对为什么需要这两个参数的PWM波产生了疑问;

舵机内部存在一个基准电路,能够产生一个周期为20ms,脉冲宽度为1.5ms的基准信号;舵机内部还有一个比较器,能够将我们的输入信号和基准信号做对比,对比产生了信号差,信号差的正负决定了舵机的转动方向,信号差的大小决定了转动的角度大小;                                                      这是我在别的博主的文章中找到的答案(34条消息) 单片机——SG90舵机工作原理_掏一淘哆啦A梦的奇妙口袋的博客-CSDN博客https://blog.csdn.net/qq_41873236/article/details/116353829?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167858272216800226577641%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167858272216800226577641&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-1-116353829-null-null.142%5Ev73%5Epc_search_v2,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=%E8%88%B5%E6%9C%BA%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187

对于通过输出多少占空比的PWM脉冲信号,用下面这张图就能够很明了的解释了;0.5ms~2.5ms之间对应的都是连续的角度值,此处只是表现了特定角度的典型值。


二、代码编写

了解完舵机的工作原理之后,就可以选择好需要的舵机,进行代码的编写了。

1、舵机选择

本项目中,我对舵机的需求是重量轻,体积小,力矩不需要太大,因此我使用的是常用的Sg90。

2、硬件连接

舵机连接

红线---------VCC
    棕线---------GND
    橙线---------信号线
    在本程序中,我使用的是通用定时器GPTM1,通道CH0,对应复用引脚为PC10,因此信号线与PC10相连。

3、代码编写

HT32与STM32的程序思路相类似,可以在一定程度上参考STM32的程序。

1、定时器初始化

pwm.h

#ifndef _STEERING_H
#define _STEERING_H#include "ht32f5xxxx_usart.h"
#include "ht32_board_config.h"
#include "delay.h"void PWM_Init(void);#endif

pwm.c

/**************************************************************************
* @brief 定时器初始化函数
* @param void
* @retval None
*************************************************************************/
void PWM_Init(void)
{{ /* Enable peripheral clock                                                                        */CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};CKCUClock.Bit.PC               = 1;    //PC端口时钟开启CKCUClock.Bit.GPTM1            = 1;    //通用定时器GPTM1时钟开启CKCUClock.Bit.AFIO             = 1;    //复用功能时钟开启CKCU_PeripClockConfig(CKCUClock, ENABLE);}{ /* Configure AFIO mode as TM function                                                            */AFIO_GPxConfig(GPIO_PC, AFIO_PIN_10, AFIO_MODE_4);    //将GPTM1_CH0映射到PC10}{ /* Time base configuration                                                                            */TM_TimeBaseInitTypeDef TimeBaseInit;TimeBaseInit.Prescaler = 4800 - 1;    //Timer Clock = CK_AHB/HTCFG_PWM_TM_PRESCALERTimeBaseInit.CounterReload = 200 - 1;TimeBaseInit.RepetitionCounter = 0;TimeBaseInit.CounterMode = TM_CNT_MODE_UP;    //设置为向上计数TimeBaseInit.PSCReloadTime = TM_PSC_RLD_IMMEDIATE;    //立即重装载TM_TimeBaseInit(HT_GPTM1, &TimeBaseInit);TM_CRRPreloadCmd(HT_GPTM1, ENABLE);    //使能CRR寄存器预装载值/* Clear Update Event Interrupt flag since the "TM_TimeBaseInit()" writes the UEV1G bit */TM_ClearFlag(HT_GPTM1, TM_FLAG_UEV);}{ /* Channel n output configuration                                                        */TM_OutputInitTypeDef OutInit;OutInit.Channel = TM_CH_0;OutInit.OutputMode = TM_OM_PWM1;        //模式设置为PWM1,不同的模式可以查看数据手册OutInit.Control = TM_CHCTL_ENABLE;      //GPTM通道使能OutInit.ControlN = TM_CHCTL_DISABLE;                  //与上一行功能相同,可以不写OutInit.Polarity = TM_CHP_INVERTED;     //GPTM通道极性为高电平有效OutInit.PolarityN = TM_CHP_NONINVERTED;               //与上一行功能相同,可以不写       OutInit.Compare = 195;                  //初始角度为0°/* Compare值的设置PWM基本原理可以简单理解为,计数器CNT的值与重装载CRR的值相比较,在向上计数模式下,CNT的值=CRR的值时,通道电平为有效电平,即为高电平,其余时间为低电平;若想要舵机转动,就要控制占空比,此处我的CRR值为200,0°对应占空比为2.5%,故compare的值为200-200*2.5% = 195;若想转动90°,则compare的值为200-200*7.5% = 185 */TM_OutputModeConfig(HT_GPTM1, TM_CH_0, TM_OM_PWM1);TM_OutputInit(HT_GPTM1,&OutInit);}//PWM ENABLETM_Cmd(HT_GPTM1, ENABLE);    //最后一定要记得使能GPTM
}

2、主函数调用

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "delay.h"
#include "time.h"
#include "steering.h"int main()
{
//  MY_USART_Init();             //USART1 Initial
//  USART0_Init();               //USART0 Initial
//  ESP8266_Start_Trans();       //ESP8266 InitialPWM_Init();              //PWM Initial    while(1){TM_SetCaptureCompare(HT_GPTM1,TM_CH_0,195);//对应0度delay_ms(1000);TM_SetCaptureCompare(HT_GPTM1,TM_CH_0,185); //对应90度delay_ms(1000);}
}

在主函数中通过函数不断改变PWM的占空比即可实现舵机的转动。

效果演示

【学习记录】HT32F52352舵机控制相关推荐

  1. Arduino学习之二——舵机控制

    舵机是一种电机,它使用一个反馈系统来控制电机的位置.大多数舵机是可以最大旋转180°的.也有一些能转更大角度,甚至360°.舵机比较多的用于对角度有要求的场合,比如摄像头,智能小车前置探测器,需要在某 ...

  2. 学习记录-用Excel控制SIMPACK操作

    今天翻SIMPACK帮助文档的时候发现SIMOACK的一个好强的功能,记录一下-- 我SIMPACK版本是2021版的,大概在帮助文档的这个位置,帮助文档在这提供了一个完整的示例 简单机翻下: 此示例 ...

  3. Arduino学习记录——蓝牙控制舵机(含LED指示灯)

     文章目录 前言 一.学习目的 二.模块介绍 三.代码记录 前言   今天记录一下有关舵机的学习,由于我的舵机在51和STM32系列单片机上都好像有供电不足的情况,然后我的电源模块也没到,所以就用Ar ...

  4. STM32F407学习笔记——MG90S舵机模块(基本控制)

    STM32F407学习笔记--MG90S舵机模块(基本控制) 一.基本原理: 通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms). 旋转 ...

  5. Arduino小白学习记录:用电位器控制LED灯的亮度

    Arduino小白的学习记录:用电位器控制LED灯的亮度 一.介绍 二.材料准备 三.实验原理 四.实验步骤 五.代码 六.效果展示 七.总结分析 我是一个纯Arduino小白,为了完成老师安排的一个 ...

  6. HT32F52352 PWM控制舵机

    下面使用到的舵机控制针脚为 PA4 PA5 PA6 PA7 time.h #ifndef _TIME_H_ #define _TIME_H_ #include "ht32f5xxxx_bft ...

  7. STM32学习5——舵机控制

    一.认识舵机 舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统.目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型:遥控机器人中已经使用得比较普遍.舵机是一种俗称,其 ...

  8. 树莓派输出pwm波c语言,树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

    树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制 一:pigpio库简介 pigpio是一个用于树莓派的库 ...

  9. 仿生蛇形机器人01、Dynamixel MX-64AR舵机控制例程的使用【Python 1.0协议】

    目录 前言 一.资料获取 二.下载Atom.DYNAMIXEL Wizard 2.0 2.1.Atom的安装 2.2.DYNAMIXEL Wizard 2.0的安装 三.实操过程 3.1.电路连接 3 ...

最新文章

  1. 双一流高校通知「19级硕士秋季学期不开学!」决定引热议,你怎么看?
  2. 高手整理培训笔记(服务篇)
  3. 遍历处理path及其子目录所有文件
  4. java中有序数组比无序数值好_java面向对象的有序数组和无序数组的比较
  5. 【oracle】手动安装EM
  6. SpringBoot 多环境配置
  7. juniper CLI 基本操作
  8. 服务器网卡的Teaming技术
  9. csv反序列化_Py't'hon之csv,ini序列化,反序列化
  10. 计算机信息安全技术课后习题答案
  11. 计算机图学图形裁剪,计算机图形学——裁剪
  12. 如何判断对方列表里是不是好友_如何识别QQ已被对方好友删除?
  13. gtx1050ti最稳定的驱动_GTX1050ti显卡驱动
  14. AltiumDesigner多通道复用设计教程(亲测可行版本)
  15. uni-app以h5网页的方式发布企业微信应用
  16. 国家及地区MySQL数据
  17. 专注中小企业 ERP 系统解决方案(源码JavaVue)
  18. 我的世界服务器物品栏太小咋办,《我的世界》MC背包容量太小?这四个装东西的道具了解一下!...
  19. 第二章:低功耗器件选型:负载开关 loadswitch
  20. 【目标规划】暑假计划

热门文章

  1. 计算机网络知识全面讲解:Internet中常见的应用协议
  2. Could not extract response: no suitable HttpMessageConverter found for response type [class java.lan
  3. 征服嵌入式linux,成功征服英语的三十个好习惯
  4. 【微服务】SpringAMQP
  5. Web前端之jQuery库
  6. 又找了几篇pix的 相关配置,看看吧
  7. 应用 Rational 工具简化基于 J2EE 的项目第 8 部分 :测试软件
  8. Ubuntu16.04+1080ti显卡驱动安装流程+循环登录问题【集锦】
  9. android概述和环境搭建
  10. 高数笔记(十六):无条件极值,条件极值(拉格朗日乘数法),最值求法,二元函数的泰勒公式