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

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:温度计算

相关文章:

  • 001 嵌入式软件开发工程师实习篇面试——首战总结
  • ‘https://start.aliyun.com/‘ 的初始化失败 请检查 URL、网络和代理设置。
  • NHANES指标推荐:UHR
  • Vue.js教学第五章:计算属性与侦听器详解
  • Google Gen AI Python SDK 开发教程
  • 代码案例分析
  • 内容中台智能推荐系统构建与演进
  • 大学之大:墨西哥国立自治大学2025.5.18
  • 串口通讯协议学习
  • 通过觅思文档项目实现Obsidian文章浏览器在线访问
  • 代码随想录-数组
  • Qt 信号和槽-核心知识点小结(11)
  • 创业分析平台Web端-三大前端核心语言详解-首页index
  • 71. 简化路径
  • 低功耗模式介绍
  • Kotlin协程异常处理全解析
  • 渗透测试核心技术:信息收集与扫描
  • 计算机系统的工作原理
  • 学习wps的书写格式(题目黑体,加粗,三号)
  • Python列表全面解析:从入门到精通
  • 全总联合六部门印发工作指引,共保劳动者合法权益
  • 上海百年龙华码头开启新航线,弥补浦江游览南段空缺
  • 视觉周刊|走进变革中的博物馆
  • 2人恶意传播刘国梁谣言被处罚,媒体:以法律利剑劈谣斩邪,加快推进依法治体
  • 陈刚:推动良好政治生态和美好自然生态共生共优相得益彰
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动