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

news2024/11/15 9:05:07

一、问题背景

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);
 
//  PA4
    OutIniture.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);
 
 
// PA5
    OutIniture.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);
 
 
// PA6
    OutIniture.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);
 
//  PA7
    OutIniture.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);
 
//  PA4
    OutIniture.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);
 
 
// PA5
    OutIniture.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);
 
 
// PA6
    OutIniture.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);
 
//  PA7
    OutIniture.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.coloradmin.cn/o/1643733.html

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

相关文章

MAT内存分析软件安装

一、简介 MAT(Memory Analyzer Tool)工具是java堆内存分析器。可以用于查找内存泄漏以及查看内存消耗情况。MAT是Eclipse开发的免费的性能分析工具。 下载链接https://www.eclipse.org/mat/downloads.php 二、安装常见问题 1. 仅支持JDK17及以上版本 …

在GPU上加速RWKV6模型的Linear Attention计算

精简版:经过一些profile发现flash-linear-attention中的rwkv6 linear attention算子的表现比RWKV-CUDA中的实现性能还要更好,然后也看到了继续优化triton版本kernel的线索。接着还分析了一下rwkv6 cuda kernel的几次开发迭代以此说明对于不懂cuda以及平时…

如何使用Go语言的标准库和第三方库?

文章目录 一、如何使用Go语言的标准库示例:使用标准库中的fmt包打印输出 二、如何使用Go语言的第三方库示例:使用第三方库github.com/gin-gonic/gin创建Web服务器 总结 在Go语言中,标准库和第三方库的使用是日常编程中不可或缺的一部分。标准…

Java基于Spring Boot框架的课程管理系统(附源码,说明文档)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Spring IoCDI (1)

目录 一、IoC & DI入门 1、Spring是什么 (1)什么是容器? (2)什么是IoC? 二、IoC介绍 1、传统程序开发 2、解决方案 3、IoC程序开发 4、IoC优势 三、DI介绍 通过前面的学习,我们知…

5月4(信息差)

🎄 HDMI ARC国产双精度浮点dsp杜比数码7.1声道解码AC3/dts/AAC环绕声光纤、同轴、USB输入解码板KC33C 🌍 国铁集团回应高铁票价将上涨 https://finance.eastmoney.com/a/202405043066422773.html ✨ 源代码管理平台GitLab发布人工智能编程助手DuoCha…

mysql设置允许其他IP访问

文章目录 更改mysql配置文件登录mysql 更改mysql配置文件 查找.ini或者.cnf文件 更改bind-address为0.0.0.0 [mysqld] character-set-serverutf8mb4 bind-address0.0.0.0 default-storage-engineINNODB [mysql] default-character-setutf8mb4 [client] default-character-s…

探索设计模式的魅力:分布式模式让业务更高效、更安全、更稳定

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索分布式模式之旅✨ 在数字化时代,企业面临着前所未有的挑战和机遇。…

企业计算机服务器中了halo勒索病毒怎么处理,halo勒索病毒解密流程

随着网络技术的不断发展,网络在企业生产运营过程中发挥着重大作用,很多企业利用网络开展各项工作业务,网络也大大提高了企业的生产效率,但随之而来的网络数据安全问题成为众多企业关心的主要话题。近日,云天数据恢复中…

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中,异常是程序执行时发生的错误。当Python检测到一个错误时,它会引发一个异常,这可能是由于多种原因,如尝试除以零、访问不存在的文件,或者尝试从列表中获取不存在的索引等。异常处…

程序语言基础

程序语言基础 导航 文章目录 程序语言基础导航一、程序设计语言二、各种程序语言特点三、高级程序设计语言四、编译器的工作阶段五、程序语言的数据成分六、程序控制结构七、表达式的例题八、传值、传址 一、程序设计语言 程序设计语言 高级语言低级语言 机器语言汇编语言 指…

关于YOLO8学习(四)模型转换为ncnn

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 简介 本文将会讲解: (1)如何通过PyCharm,进行pt模型的转换,最后输出一个适合手机端使用的模型 开发环境 win10、python 3.11…

农作物害虫检测数据集VOC+YOLO格式18975张97类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):18975 标注数量(xml文件个数):18975 标注数量(txt文件个数):18975 标…

C++进阶----多态

1.多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同类型的对象去完成时会 产生出不同的状态。 举个例子:比如有一个基类Animal,它有两个子类Dog和Cat。每个…

三个关于文件操作的实例

内容是:通过文件操作,完成一些小的需求。用来查询某文件或者某个文件里面的关键字 1.例子一 (1)需求:在一个指定的目录下,找到包含该关键字的所有文件 (2)要求输入:一个…

C语言中的goto语句

goto label; C 语言中的 goto 语句允许把控制无条件转移到同一函数内的被标记的语句。 #include <stdio.h> int main(){goto first;printf("我是你好\n");first:printf("nihao\n");second:printf("This is 2\n");return 0; } 使用goto会…

mysql其它补充

exist和in的区别 exists 用于对外表记录做筛选。 exists 会遍历外表&#xff0c;将外查询表的每一行&#xff0c;代入内查询进行判断。 当 exists 里的条件语句能够返回记录行时&#xff0c;条件就为真&#xff0c;返回外表当前记录。反之如果 exists 里的条件语句不能返回记…

Day31:单元测试、项目监控、项目部署、项目总结、常见面试题

单元测试 保证独立性。 Assert&#xff1a;断言&#xff0c;一般用来比较是否相等&#xff0c;比如 Assert.assertEquals 在JUnit测试框架中&#xff0c;BeforeClass&#xff0c;Before&#xff0c;After和AfterClass是四个常用的注解&#xff0c;它们的作用如下&#xff1a; …

Python爬虫:XPath解析爬取豆瓣电影Top250示例

一、示例的函数说明&#xff1a; 函数processing()&#xff1a;用于处理字符串中的空白字符&#xff0c;并拼接字符串。 主函数程序入口&#xff1a;每页显示25部影片&#xff0c;实现循环&#xff0c;共10页。通过format方法替换切换的页码的url地址。然后调用实现爬虫程序的…

Golang日志管理:使用log/slog实现高级功能和性能优化

Golang日志管理&#xff1a;使用log/slog实现高级功能和性能优化 简介基础使用初始化和配置日志级别 高级技巧自定义日志格式器条件日志处理 实战案例场景一&#xff1a;API请求日志记录场景二&#xff1a;错误跟踪和用户通知 性能优化优化日志记录的性能异步日志处理选择合适的…