当前位置: 首页 > ops >正文

AM32电调学习解读七:其他代码文件介绍

最近在学习AM32电调的2.18版本的源码,我用的硬件是AT32F421,整理了部分流程处理,内容的颗粒度是按自己的需要整理的,发出来给有需要的人参考。按自己的理解整理的,技术能力有限,可能理解有误,欢迎纠正。


注:lida2003博主是个大牛。写的无刷电调的理论和AM32相关知识点介绍的比较系统,介绍的很详细,有需要的同学可以去参考。我对电调这块是外行,只是刚入门学习。这里重点是代码理解的整理分析,他哪里写了很多原理性的知识。

https://blog.csdn.net/lida2003/category_12753961.html?spm=1001.2014.3001.5482

        这是第七篇,本篇把剩下的代码做个简单介绍,重点是介绍的电调相关的功能,外设的基础用法就不解读了。本篇也会加一些对当前代码的理解。

        本来不想写这篇的,没啥技术点,为了代码分析的完整性,还是整理出来了,

        DroneCAN这块目前还没学,暂时先空着。

        这篇写完算是代码了一轮了。后面可能还会补一些调试中的波形分析

1、sounds.c

电机发音处理。

六个相位的波形图

发音就是注入一组PWM波形,频率决定音调,高电平时长决定音量,注入时长就是发音时长。

为什么发一个音以后需要换一个相位?

1)如果不换相位,时间长了,电机就转起来了,到达电磁阻力最小点后,电流会变的很大。

2)轮流工作,让电机3个相负担均衡。

解读一个函数playStartupTune

void playStartupTune()//发启动音
{__disable_irq();  //只有在电机不转的时候才能发音,这里屏蔽中断避免发音被打断,或者重入if (eepromBuffer.tune[0] != ERASED_FLASH_BYTE) //如果编辑了启动音,可以让电调播放音乐{playBlueJayTune();}else {SET_AUTO_RELOAD_PWM(TIM1_AUTORELOAD);//设置ARR,波形的周期setCaptureCompare();//设置音量comStep(3); 		//切换到一个相位						// activate a pwm channelSET_PRESCALER_PWM(55);	//设置预分频,也就是频率					// frequency of beepdelayMillis(200);		//发音时长					// duration of beepcomStep(5);			//切换到另一个相位	SET_PRESCALER_PWM(40);						// next beep is higher frequencydelayMillis(200);comStep(6);SET_PRESCALER_PWM(25);						// higher again..delayMillis(200);allOff();		  //发音完,6个相位都关闭							// turn all channels low againSET_PRESCALER_PWM(0);	//恢复预分频					// set prescaler back to 0.signaltimeout		= 0; //置零,防止油门超时}SET_AUTO_RELOAD_PWM(TIMER1_MAX_ARR);	//恢复ARR__enable_irq();				//恢复中断
}

其他发音函数处理和差不多,只是响几下,时长,音调的区别

不足点

发音的时候只占用一个通道,音量比较小。如果音量比较大的还可能造成电机转动起来。BLH的发音不存在这样的不足,可以借鉴。

2、signal.c

这个文件在《AM32电调学习解读四:输入信号处理》都介绍了,不再重复

3、kiss_telemetry.c

makeTelemPackage:串口返回状态信息构建,包括voltage,current,consumption,e_rpm电转速信息

makeInfoPacket:返回配置参数信息

4、functions.c

getAbsDif:绝对值
void delayMicros:等待微秒
void delayMillis:等待毫秒
long map:映射函数
void gpio_mode_QUICK:GPIO快配
void gpio_mode_set:GPIO模式修改

5、firmwareversion.c

只是在这个地址存了个FILE_NAME

6、dshot.c

这个文件在《AM32电调学习解读四:输入信号处理》都介绍了,不再重复

7、WS2812.c

这里的炫彩灯使用的是模拟GPIO方式模拟实现的

定时器方式实现可以参考如下文档

STM32定时器驱动WS2812 - UENG - 博客园

注意点:send_LED_RGB有屏蔽中断的处理,目前值在上电的时候调用和解锁的时候调用。

但是运行时调用需小心,屏蔽中断有风险

8、serial_telemetry.c

send_telem_DMA:串口DMA发送触发

telem_UART_Init:串口初始化

9、phaseouts.c

PWM_ENABLE_BRIDGE:这个宏没理解什么意思,没有这个电调不好验证。从代码上看不定义这个宏,可以使用渐变力刹车

我用的F421使用的高边PWM驱动

proportionalBrake:高边输出模式,底边复用输出模式

相位基本操作单元

allOff:全浮空

comStep:换相操作,包括比较器管脚切换

fullBrake:全刹,底边全高

allpwm:3个高边全PWM,底边看是否开互补

twoChannelForward():有刷模式用的两边PWM驱动

 twoChannelReverse():有刷模式用的两边PWM驱动

10、peripherals.c

外设初始化,参考

AM32电调学习解读一:Main函数初始化流程图-CSDN博客

11、IO.c

油门输入处理的端口模式切换和初始化处理

12、eeprom.c

save_flash_nolib:保存Flash的非库函数实现,效率比较高,而且自带擦除功能

read_flash_bin:读取Flash

13、comparator.c

getCompOutputLevel:获取比较器输出

maskPhaseInterrupts:禁用比较器中断

enableCompInterrupts:使能比较器中断

changeCompInput:修改比较器中断和处理速度,转速越高比较器速度越高

14、ADC.c

ADC_Init:adc初始化

 ADC_DMA_Callback:ADC DMA中断回调函数

getConvertedDegrees:温度计算

http://www.xdnf.cn/news/7091.html

相关文章:

  • 2901. 最长相邻不相等子序列 II
  • Seata源码—6.Seata AT模式的数据源代理一
  • 2025.05.17得物机考笔试真题第二题
  • React 19中useContext不需要Provider了。
  • Java基础知识总结(超详细整理)
  • 32LED心形灯程序源代码
  • 常见的 HTTP 接口(请求方法)
  • PCB设计(十九)PCB设计中NPN/PNP选型策略
  • Window远程连接Linux桌面版
  • 掘金欧洲宠物经济新蓝海:比利时天然宠粮市场爆发与跨境新机遇
  • c++从入门到精通(六)--特殊工具与技术-完结篇
  • Azure 机器学习初学者指南
  • Nacos数据写入流程
  • 深入理解EKS 工作节点的网络架构
  • Cadence学习笔记之---PCB器件放置与布局
  • SSM框架整合:从入门到实战
  • 大模型微调步骤整理
  • Flink CEP是什么?
  • 【数据结构与算法】ArrayList 与顺序表的实现
  • C++23 新特性:使某些视图的多参数构造函数显式化(P2711R1)
  • HBM的“暗战”
  • Spring AOP从0到1
  • STM32CubeMX生成UTF-8编码文件的设置方法
  • 第12章 Java多线程机制
  • 阶段四 项目1-苍穹外卖 第一章 Git
  • 基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
  • FloodFill算法:洪水般的图像处理艺术
  • #Redis黑马点评#(六)Redis当中的消息队列
  • 从0到1吃透卷积神经网络(CNN):原理与实战全解析
  • Java基于数组的阻塞队列实现详解