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