~恍恍惚惚中,感觉瓦力已经慢慢悠悠的向我走来,看了他的孤独,感觉自己的也就不算什么了~
断断续续搞了差不多两周的时间,总算是把这些底层模块都调通了(虽然还完全看不出任何瓦力的影子):
1.双路foc电机驱动(实现自动校准磁铁偏角,自动识别电机磁极对数);
2.基于u8g2的oled(128x64)交互显示(实时显示电机转速,电池电压、电流);
3.sbus驱动(实现通过rc遥控器来控制两个电机转速,通过特殊按键方式进入rc_ui交互界面实现oled和rc来选择触发电机的自动校准动作);
4.电池电压采集(现在使用一个蓝白可调电阻来做电池分压采样,ACS712的电流模块还没到);
5.基于imu模块的姿态解算(姿态使用PI互补融合方案,并通过udp方式使用mavlink协议传输到qgc上显示);
6.和qgc的mavlink通讯交互(可以通过qgc来查看、修改电机参数,也可以使用qgc的虚拟摇杆来控制电机);
小结:
这次基本把瓦力的各个驱动模块的功能调试完成,其中也遇到了许多坑,第一个是在调试编码器spi驱动的时候,编码器用的是tle5012方案,该芯片使用三线spi的SSC总线方式和主控进行读写交互,在使用esp-idf库的spi驱动来和tle5012进行读写交互的时候,发现需要对原有驱动的底层实现做一些针对性的修改才能实现正常的数据交互,经过修改之后的spi驱动,性能和稳定性都得到很大的提升;所选的oled模块使用的ssd1306驱动方案也支持三线spi的通讯方式,所以最后决定把两路电机的tle5012编码器和oled同时挂载在ESP32的HSPI总线上驱动;后面在调试u8g2的时候还遇到了oled的周期性刷新会一定程度上到影响两路foc 的计算和控制,每到ui刷新的时候,两路电机的foc控制会出现轻微卡顿现象,最后发现u8g2的刷新机制都是以整个frame_buffer的形式进行的,这样会消耗比较多的时间(大概会消耗2~3ms的时间),两路foc的计算和控制是以1khz的频率进行的,后面果断把frame_buffer的刷新方式改为分段刷新的方式,把u8g2的整帧frame_buffer刷新动作分割成30次小范围刷新的方式来实现,经过这样的调整终于实现了1khz的双路foc电机计算和控制+30hz的u8g2丝滑混合驱动,针对于u8g2库和spi驱动的修改,后续会针对性的单独再写博客来分析记录;