HT32F52352 -- 解锁电调、电机速度控制

一、问题背景

1.1 硬件:

            电池组,电子调速器(好盈电调 /ESC),接收机(HT32F52352),风扇。

        

1.2 软件 keil5

二、问题分析

        通过1.1图中可知,我们只需要使用 HT32F52352 模拟 接收机 发送信号,就可以控制最后的风扇了。那么现在就只需要了解到接收机信号是什么就可以了。

2.1 接收机信号是什么?

        我这里使用的是 R9DS接收机 。通过途中可知,我们使用的3通道是一个pwm信号。

2.2 电路图

        画了一个简易的原理图,其实和1.1的图并没有区别,只是需要注意PA4。

2.3 电调解锁

        如果直接输入PWM风扇并不会有反应,我们还需要解锁电调。

        如图可知,我们尝试用 HT32F52352 模拟遥控器给一个油门最高点,再在反应后(哔-哔-)给一个油门最低点。

        

三、程序编写

        我这里根据之前的 HT32F52352 PWM控制舵机 的基础进行的更改。

3.1 PWM配置

        这里将 PA4 PA5 PA6 PA7 都配置上,可以随时更改


//PWM
//arr: 200-1
//psc: 4800-1
//GPIO PA4 PA5 PA6 PA7
//PA4  
void time_init()
{TM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体TM_OutputInitTypeDef   OutIniture;CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开CKCUClock.Bit.AFIO       = 1;       //复用时钟CKCUClock.Bit.GPTM0      = 1;CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能AFIO_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);              //开启复用功能GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);  TM_OutputStructInit(&OutIniture);    //定时器初始化TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器TimeBaseIniture.Prescaler = 4800-1;                           //预分屏系数TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);//  PA4OutIniture.Channel= TM_CH_0;OutIniture.Control= TM_CHCTL_ENABLE;         //GPIO使能通道OutIniture.OutputMode=TM_OM_PWM1 ;          //GPIO 通道 PWM1 输出模式 PWM2 翻转模式OutIniture.Polarity= TM_CHP_INVERTED;    //GPTO 通道极性是低电平或者下降沿   // OutIniture.Compare=200;                      // 配置占空比TM_OutputModeConfig(HT_GPTM0,TM_CH_0,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);// PA5OutIniture.Channel=TM_CH_1;OutIniture.Control=TM_CHCTL_ENABLE;        OutIniture.OutputMode=TM_OM_PWM1;          OutIniture.Polarity=TM_CHP_INVERTED;         //OutIniture.Compare=200;                     TM_OutputModeConfig(HT_GPTM0,TM_CH_1,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);// PA6OutIniture.Channel=TM_CH_2;OutIniture.Control=TM_CHCTL_ENABLE;         OutIniture.OutputMode=TM_OM_PWM1;          OutIniture.Polarity=TM_CHP_INVERTED;             //OutIniture.Compare=200;                     TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//  PA7OutIniture.Channel=TM_CH_3;OutIniture.Control=TM_CHCTL_ENABLE;         OutIniture.OutputMode=TM_OM_PWM1;         OutIniture.Polarity=TM_CHP_INVERTED;       // OutIniture.Compare=200;                      TM_OutputModeConfig(HT_GPTM0,TM_CH_3,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);          //中断	TM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}

3.2 模拟遥控器(电调解锁)

        这里按照电调要求,我们先配置出PWM信号,然后给一个PWM高点,等待一段时间后给一个PWM最低点,那么我们可控制的范围就是这个 最低点 到 最高点 之间的数。

void PWM_R9DS_init(void){time_init();//TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,180);TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,90);delay_ms(3500);//TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190);TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190);delay_ms(3500);}

3.3 油门模拟函数

        结合3.2 ,我们在90-190间,但190是最低点,所以我们将其整理成我们熟悉的样子

        i 取 0~100        越高风扇转速越快


void Fan_drive(int i){TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190-i);
}

3.4 主函数

int main(void)
{PWM_R9DS_init();//delay_ms(2000);while (1){//油门注意不要给大了,无刷电机威力还是挺大的Fan_drive(1);}
}

四、PWM_R9DS

4.1 PWM_R9DS.h

#ifndef __PWMR9DS_H_
#define __PWMR9DS_H_
#include "ht32f5xxxx_bftm.h"#define HTGPIO_PIN (GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)void PWM_R9DS_init(void);void time_init(void);void Fan_drive(int i);
#endif

4.2 PWM_R9DS.c

#include "PWM_R9DS.h"
#include "delay.h" //此处的延时函数 在文章尾部相关资料中有//PWM
//arr: 200-1
//psc: 4800-1
//GPIO PA4 PA5 PA6 PA7
//PA4  
void time_init()
{TM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体TM_OutputInitTypeDef   OutIniture;CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开CKCUClock.Bit.AFIO       = 1;       //复用时钟CKCUClock.Bit.GPTM0      = 1;CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能AFIO_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);              //开启复用功能GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV);  TM_OutputStructInit(&OutIniture);    //定时器初始化TimeBaseIniture.CounterMode = TM_CNT_MODE_UP;            //边沿对齐向上模式TimeBaseIniture.CounterReload = 200-1;                       //计数重装载计数器TimeBaseIniture.Prescaler = 4800-1;                           //预分屏系数TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE;    //立即重装载TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);//  PA4OutIniture.Channel= TM_CH_0;OutIniture.Control= TM_CHCTL_ENABLE;         //GPIO使能通道OutIniture.OutputMode=TM_OM_PWM1 ;          //GPIO 通道 PWM1 输出模式 PWM2 翻转模式OutIniture.Polarity= TM_CHP_INVERTED;    //GPTO 通道极性是低电平或者下降沿   // OutIniture.Compare=200;                      // 配置占空比TM_OutputModeConfig(HT_GPTM0,TM_CH_0,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);// PA5OutIniture.Channel=TM_CH_1;OutIniture.Control=TM_CHCTL_ENABLE;        OutIniture.OutputMode=TM_OM_PWM1;          OutIniture.Polarity=TM_CHP_INVERTED;         //OutIniture.Compare=200;                     TM_OutputModeConfig(HT_GPTM0,TM_CH_1,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);// PA6OutIniture.Channel=TM_CH_2;OutIniture.Control=TM_CHCTL_ENABLE;         OutIniture.OutputMode=TM_OM_PWM1;          OutIniture.Polarity=TM_CHP_INVERTED;             //OutIniture.Compare=200;                     TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);//  PA7OutIniture.Channel=TM_CH_3;OutIniture.Control=TM_CHCTL_ENABLE;         OutIniture.OutputMode=TM_OM_PWM1;         OutIniture.Polarity=TM_CHP_INVERTED;       // OutIniture.Compare=200;                      TM_OutputModeConfig(HT_GPTM0,TM_CH_3,TM_OM_PWM1);TM_OutputInit(HT_GPTM0,&OutIniture);TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);          //中断	TM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}void PWM_R9DS_init(void){time_init();//TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,180);TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,90);delay_ms(3500);//TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190);TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190);delay_ms(3500);}void Fan_drive(int i){TM_SetCaptureCompare(HT_GPTM0,TM_CH_0,190-i);
}

五、相关资料

1. R9DS接收机+AT9S Pro --SBUS解析(STM32F103C8T6)

2. HT32F52352 PWM控制舵机

3. HT32F52352 点灯+HT32延时函数

4. stm32解锁电调、电机速度控制

5. R9DS接收机说明书

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea,默认的英文文本可见,输入中文字体后就看不见了,是因为这个默认的字体不支持中文,改一下字体就可以了&#xff1…

【介绍下有那些常见的ssh功能】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

使用mapinfo软件的在线地图插件运行错误解决

使用mapinfo软件的在线地图插件运行错误解决 一、如何解决win10/win11家庭版运行MapInfo中的在线地图插件报错【unexpected error;quitting】问题?二、如何解决在线地图切换地图源时的报错问题? 一、如何解决win10/win11家庭版运行MapInfo中的…

java下乡扶贫志愿者招募管理系统springboot-vue

计算机技术在现代管理中的应用,使计算机成为人们应用现代技术的重要工具。能够有效的解决获取信息便捷化、全面化的问题,提高效率。 技术栈 前端:vue.jsElementUI 开发工具:IDEA 或者eclipse都支持 编程语言: java 框架&#xff1…

vue+element-ui实现横向长箭头,横向线上下可自定义文字(使用after伪元素实现箭头)

项目场景&#xff1a; 需要实现一个长箭头&#xff0c;横向线上下可自定义文字 代码描述 <div><span class"data-model">{{ //上方文字}}</span><el-divider class"q"> </el-divider>//分隔线<span class"data-mod…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

Vitis HLS 学习笔记--Schedule Viewer 调度查看器

目录 1. 简介 2. Schedule Viewer详解 2.1 视图说明 2.1.1 Operation\Control Step 2.1.2 周期关系图 2.1.3 Schedule Viewer 菜单栏 2.1.4 属性视图 2.2 内容说明 2.2.1 实参&#xff08;b&#xff09;解释 2.2.2 实参&#xff08;a&#xff09;解释 2.2.3 变量&am…

【C++】详解STL的容器之一:list

目录 简介 初识list 模型 list容器的优缺点 list的迭代器 常用接口介绍 获取迭代器 begin end empty size front back insert push_front pop_front push_back pop_back clear 源代码思路 节点设计 迭代器的设计 list的设计 begin() end() 空构造 ins…

C# Web控件与数据感应之 TreeView 类

目录 关于 TreeView 一些区别 准备数据源 范例运行环境 一些实用方法 获取数据进行呈现 ​根据ID设置节点 获取所有结点的索引 小结 关于 TreeView 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&#xff0c;本文将继续介绍与…

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…

Mybatis进阶2

Mybatis进阶1-CSDN博客 Mybatis入门-CSDN博客 Mybatis入门2-CSDN博客 我们接下来要学习Mybatis的高级查询 我们先在数据库中准备我们需要的数据表 teacher表 课程表&#xff1a;与教师表是一对多的关系&#xff0c;所以有一个外键字段 学生表 由于学生表和课程表是多对多的…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习四

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

支付宝支付流程

第一步前端&#xff1a;点击去结算&#xff0c;前端将商品的信息传递给后端&#xff0c;后端返回一个商品的订单号给到前端&#xff0c;前端将商品的订单号进行存储。 对应的前端代码&#xff1a;然后再跳转到支付页面 // 第一步 点击去结算 然后生成一个订单号 // 将选中的商…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

【JavaEE 初阶(一)】初识线程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.进程3.线程4.线程和进程的区别5.Thread创建线程5.1继承Thread创建线程5.2实现R…

从零开始:Django项目的创建与配置指南

title: 从零开始&#xff1a;Django项目的创建与配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 后端开发 tags: DjangoWebDevPythonORMSecurityDeploymentOptimization Django简介&#xff1a; Django是一个开源的高级Python Web框架&#xff…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 &#x1f4d1;前言一、常用AI工具&#xff1a;便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用&#xff1a;不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

Delta lake with Java--使用stream同步数据

今天继续学习Delta lake Up and Running 的第8章&#xff0c;处理流数据&#xff0c;要实现的效果就是在一个delta表&#xff08;名为&#xff1a;YellowTaxiStreamSource&#xff09;插入一条数据&#xff0c;然后通过流的方式能同步到另外一个delta表 &#xff08;名为&#…

LeetCode题练习与总结:分隔链表--86

一、题目描述 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2]…

神经网络的优化器

神经网络的优化器是用于训练神经网络的一类算法&#xff0c;它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用&#xff1a; 参数更新&#xff1a;优化器通过计算损失函数相对于权重参数的…