
基于CH32V203(RISC-V)和AM32无刷电调(ESC)
简介
基于AM32固件并移植到RISC-V平台的无刷电机电调,主控选择自带内部比较器的极具性价比的RISC-V芯片CH32V203,保姆级教程。
简介:基于AM32固件并移植到RISC-V平台的无刷电机电调,主控选择自带内部比较器的极具性价比的RISC-V芯片CH32V203,保姆级教程。开源协议
:CC BY-SA 3.0
描述
更新:
官方已经合并,F8U6的最新版本BOOTLOADER可以使用仓库 https://github.com/am32-firmware/AM32-bootloader下的:
AM32_V203_BOOTLOADER_PA0_V13.hex
最新版本代码可以使用仓库 https://github.com/am32-firmware/AM32 下的:
一、缘起
兴趣使然,为了学习下开源电调,花了点时间看了下BLHeli_S的代码和一些优秀的开源硬件,但是奈何其32位版本不再开源,然后又去看了AM32固件。其代码链接如下:https://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware,该项目目前一直在更新,我下载的版本是1.95版本。为了测试验证,本想直接打板验证一下,但是发现其使用的主控芯片不是缺货就是大几块甚至十几块钱。刚好最近同时在学习RISC-V,于是萌生了直接换个平台的想法,最终性能和性价比均不错。
二、详述
主控芯片选择的WCH的CH32V203F8U6,最高144MHz主频,64KB FLASH 20KB SRAM,1个高级定时器、3个通用定时器,内核自带一个SysTick(这里强调定时器,主要AM32固件内部需要用到6个定时器,后面详述),同时还有OPA,可以直接用来做比较器进行过零检测。整体来看,对于电调应用,还是能够轻松驾驭,主要价格也不高,虽然我手里是样片,但是即使大封装的样品也才三块多。
为了更好的测试,板上用LDO做了个5V/1A的BEC输出,如果觉得功率不够,可以改成合适的DCDC。MOS的预驱,使用的是常用的FD6288Q,商城常见的两个厂家的芯片的供电电压范围不同,低压保护的阈值也不同,原理图中直接用电池电压供电,对于常见的2-4S的电池来说,问题应该不大。
程序移植到了MRS中,可以使用WCH-LINKE直接调试,同时也移植了BootLoader,首次烧录时需要用link烧录BootLoader,然后就可以使用AM32的配置工具对电调进行配置和升级烧录代码了。AM32的固件中,使用了6个定时器,一个驱动PWM的高级定时器,可以输出互补的三相PWM;一个换向时间计数;一个提前换向的计数、一个10KHz的定时中断,用于PID和一些周期性的任务;一个工作于输入捕捉和输出比较,用于油门信号检测和通信;还有个用于延时。V203中前面提到一共5个定时器,所以程序中将延时用NOP指令代替,TIM1用作PWM输出、TIM2用作油门信号检测、TIM3用于提前换向计数、TIM4用作换向时间计数,SysTick用作10KHz的定时中断。
同时使用内部OPA做过零比较,将两个OPA的输出端连接在一起(不连接在一起也可以,可以直接使用各自IO的中断),同时连接到PA2,使用PA2作为过零比较中断的最终入口。IO口分配如下如所示:
注:实际原理图中,仅做了电压检测和温度检测。PA6并未做电流检测,而是接了个LED,有需求的可以直接修改连接采样电阻和电流放大后连接到PA6,直接修改ADC部分相关程序即可。
三、使用步骤
1.裸板通过WCH-LINKE给其烧录BootLoader,如果不敢保证焊接的情况下,可以从先从BEC的5V输出位置先供电5V,然后用LINK连接板上的DIO和CLK(记得共地),烧录BootLoader。
2.烧录后,就可以使用AM32的上位机软件了,我这里使用的是1.82版本(Esc_Config_Tool_1_82_WIN)。但是这里需要注意的是上位机和电调直接使用的是单线串口,如果手头有Arduino Nano板子可以直接通过BLHeliSuite给它刷单线串口的程序即可。我直接移植了其程序至CH32V003上(为啥是它,主要手头有这个板子和芯片,且价格便宜!)。直接使用link的串口连接至PD5和PD6,然后将PC1和电调的输入接口相连,给电调上电,打开上位机,按顺序点击:
首次连接,会显示“No EEprom”,这是因为此刻还是空片,没有任何配置值,我们直接点击下面的“Send Default Settings”,烧录默认值即可。烧录成功后,重新上电。再次连接,点击"M1",此时会显示我们刚刚烧录的默认参数:
此时就证明我们已经成功刷入了BootLoader,并可以通过上位机配置和升级电调程序。
3.回到工具的FLASH界面,我们点击“Load Firmware”,选择我们的编译好的固件,然后会弹出”FLash Firmware“按钮,点击即开始更新程序。等待程序更新完成:
此时我们再次重新上电,连接电调,就会发现,固件已经更新成功,下面就可以对他进行测试了。
关于这些配置值的具体含义,可以参考仓库下的wiki说明,很详细:
https://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware/wiki/ESC-Settings-Explained
4.下面就是具体的测试了,移植的当前版本AM32支持PWM输入,Dshot300, Dshot600。那么如何产生这些信号呢,某宝上有一些舵机测试仪,但是无法输出Dshot信号,于是又回到了CH32V003上,我用它又做了个测试仪,上电默认在PWM输出模式,旋转电位器即可调节占空比。PWM模式下,短按按键可以切换PWM输出是手动、中间值、还是自动扫描。长按按键,MODE/MAN灯慢闪烁,为Dshot300模式,再次长按按键,MODE/MAN灯快闪,为Dshot600模式。即长按切换模式,短按切换PWM输出。
至此,所有的准备工作完成,可以接电机测试了。
四、附件说明
1.V003_OneWire.zip 双线转单线串口程序;
2.自制舵机测试仪资料;
3.上位机工具;
4.BootLoader程序;
5.电调PWM、Dshot300、Dshot600输入空载测试;
6.测试工具三种信号波形;
7.电调主程序参考:https://github.com/TianpeiLee/CH32V203_ESC。
设计图

BOM


评论