设置参数说明 位置梯形轨迹:“梯形轨迹速度限制”限制了电机的最大速度,“梯形轨迹加速斜率”控制电机速度上升斜率,参数越大上升曲线越陡峭,“梯形轨迹减速斜率”控制电机速度下降斜率,参数越小下降曲线越平缓。驱动板接入电脑后会虚拟为串口,点击“刷新”,选择对应的com,点击“连接设备”,软件左下角会提示“连接成功”。根据需要设置对应的保护,使能可以选择“可恢复”和“不可恢复”,“可恢复”的保护,恢复后电机失能,需要重新发送指令进入闭环状态。注意,重启后,USB通信需先点击“断开连接“再”连接设备“,才能与驱动器再次通信。
ODrive移植keil(九)—— 抗齿槽效应算法 在永磁电机中,即使定子中没有电流通过,也会存在一个电磁转矩,这个转矩叫齿槽力矩(Cogging Torque)。用手转动电机,会感觉到它从当前点“跳跃”并“稳定”在另一个点,电机有“一格一格”的顿挫感(俗称颗粒感)。当电机低速转动时,表现为“一顿一顿”,当电机高速转动时,电机的振动和噪声会更大。某疆早期的2312电机齿槽效应非常大,后来的电机齿槽效应明显变小了。5008电机的齿槽效应小,改善效果不明显,用齿槽效应大的电机测试,改善效果还是很明显的。
ODrive移植keil(八)—— 闭环控制 定点运算早就存在,但是ST采用定点运算配合它的电机库,极大的推广了这一技术,我觉得目前市面上只要是定点运算的电机驱动器,应该都会受到ST的影响,或者直接就师承ST。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。如果限速,电机只能达到限制转速。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。
ODrive移植keil(七)—— 插值算法和偏置校准 ENCODER_cpr 为接口对应的cpr,比如AS5047P的ABZ接口cpr=4000,SPI接口的cpr=16384,注意区分。读取后的角度为原始数据,再在encoder_update() 中处理,数据处理包含了两部分:锁相环和插值,目前支持四种编码器:ABZ、AS5047P、MT6701、MA730,本例以ABZ信号为例,发送指令“P”(不需要回车换行),同时用手转动电机,查看角度打印,使用SPI接口,SPI读出角度为绝对值,更容易找到规律,
ODrive移植keil(六)—— 测量电阻电感和电流环PI参数整定 最初移植的时候,我也用函数指针实现中断中的函数运行,但是发现函数指针太不直观了,非常容易被忽视和忘记更改指针,所以用了标志位的方法,不高级但却实用。发送指令“C”(不需要回车换行),3秒钟后电机“嘀”一声,校准完毕,打印测量结果,同时打印整定后的电流环PI参数。在ODrive代码中,设定了测量电流 I,根据检测到的电流不断调整 U,大概3秒钟,最终稳定电流到设定值,电阻电感测量的相关代码在motor.c文件中,可自行查看,上面也讲过了原理,所以就不再细说,
ODrive移植keil(五)—— 开环控制和电流变换 如果转速设置太大,电机会振动,可以调高 target_voltage_ 以达到更大的转速,但是注意电机电流,注意发热。ODrive的程序架构,也是我在基本移植完代码后才焕然大悟的,如果事先有架构意识,不至于看代码的时候那么痛苦。Park变换的θ是当前读出的角度,而Park逆变换是下次FOC计算时的角度(当前角度+估算的下次转过的角度),3、Uq设置太大,电机发热严重,Uq设置太小,电机没劲转不动或者转不快,所以一定要根据电机相电阻设置大小,4、θ不是当前的角度,是目标角度,就是下次计算时的角度。
ODrive移植keil(四)—— PWM触发ADC采样 ADC以DMA的方式转换,代码单独执行这个操作是没问题,但在初始化阶段随着片内外设配置的增加,或者代码执行顺序的变换,就会发生错位。网上找到过很多解释错位原因以及改正办法,但从来都没有彻底解决过这个问题,此次移植又遇到了这个问题,曾经的解决办法测试一遍后都失效了,最后发现用TIM2更新触发的方式不再错位。ADC1多通道规则转换时,如果使用DMA方式,经常会发生AD值错位的现象,比如第一个AD值的高字节放入的是低字节的数据,而低字节是第二个AD值的高字节数据,以此类推,转换值全部失效。
ODrive移植keil(三)—— USB虚拟串口和快速正弦余弦运算 但是我实际的测试,从软件中断退出后仍然会执行第二个更新中断,并且我觉得在软件中断中等待第二次更新中断,很浪费时间,所以就没有使用这个方案。以上测试证明了USB虚拟串口移植成功,但在实际应用中,只需要USB收发数据,不需要USART2,所以屏蔽掉相关配置。单片机的USB通信,一般都是以虚拟串口的方式实现,ODrive使用自定义的接口,所以才需要用zadig驱动。DSP库优化后的运算,运算时间大约261520 us,精度在0.000001f,我本来是打算描述下移植的细节的,但是隔的时间太久了,已经记不清细节,
ODrive移植keil(二)—— ODrive的程序架构 本节及之后的教程将把odrive移植到keil环境下,为了降低移植难度,同时也为了让大家更容易学习掌握移植后的代码,本次移植,只移植电机的核心控制功能,实现常用的一些功能。这部分代码会让人看得很无助,因为所有的代码都在此时执行,比如最下面的开环控制,都已经闭环了难道它还在运行,它运行的意义是什么?ADC1的规则通道转换所有闲杂的ADC,比如温度检测,不需要时效,软件触发后将一直在后台转换;国外的电机驱动技术领先国内这是不争的事实,“洋务运动”一直都在,只是在不同的领域不同的范围,
ODrive移植(一)—— 国产替代方案(VScode版移植) 官方网站:https://odriverobotics.com/github网站:https://github.com/odriverobotics/ODrive官方使用说明:https://docs.odriverobotics.com/v/latest/guides/getting-started.html,在左下角选择对应的版本,比如ODrive-V3.6的当前最新版本是0.5.6,
VESC操作入门(三)——PPM输入控制和ADC输入控制 注意操作时动作要慢,不要快速的上下划动摇杆,电机转速突变容易产生高压反电动势,本人的12V小功率开关电源就这样被击穿了。因为上面测试PPM时使用了带AS5047P编码器的电机,固件中默认使能了SPI接口,所以需要重新烧写不支持SPI接口的固件,本人测试用的10K和20K电位器接入ADC引脚后都不起作用,直到使用4.7K电位器,引脚电压才可以被改变,vesc可用于电动滑板车,所以AD引脚应该接的是一个转把,本人查找资料,发现电动车转把不是电位器,此时操作摇杆就可以控制电机转动,向上电机正转,向下电机反转。
SmartKnob移植ESP32和STM32——棘轮手感 SmartKnob 利用电机模拟机械旋钮的效果,且模式灵活多变,自带高级感,据说宝马的车内旋钮就是这样的。github网址:https://github.com/scottbez1/smartknob。
VESC操作入门(二)——双轮毂电机控制和CAN通信 要想让两个电机同时转动,需要在1000ms内连续发送两个指令,手工操作CAN盒的方式肯定达不到。只能通过代码的方式,而能够在最短的时间内实现这个功能的代码,非arduino莫属。VESC中会限制电机的最小速度,修改了限制后,虽然可以设置更小的速度,但是电机有抖动,尝试修改了PID,作用不大,电机齿槽效应导致的抖动,PID无能为力。VESC和ODrive的CAN通信类似,都只有简单的指令,大部分操作都需要通过USB事先配置好。VESC的CAN波特率默认500K,默认使能,接线既可使用,不需要任何配置。
ODrive的梯形轨迹 实际应用中,需要电机又快又稳的转到指定位置,梯形轨迹(INPUT_MODE_TRAP_TRAJ)本质上是一个分段函数的轨迹规划,是一个先加速,再匀速,再减速的三段函数的过程。2804电机100kv,12V电源,最高速度为1200RPM = 20 转/秒。AS5047P_SPI接口,电源电压12V,24V都可以。1.1.2、位置模式,梯形轨迹。1.1.1、速度模式。
ODrive的CAN通信 读取当前电压值(MSG_GET_VBUS_VOLTAGE)cmd_ID=0x17,msgID = node_ID | cmd_ID = 0x057,发送后没有反应,看代码需要rtr为1,打勾。设置Axis请求状态(MSG_SET_AXIS_REQUESTED_STATE)cmd_ID = 0x07,Adress=(node_ID
ODrive运放电路的分析和替代方案 下图第80行,max_unity_gain_current = 边缘 x 波动 x 采样电阻导数 = 0.9 x 1.35 x 2000 = 2430,下图第81行,requested_gain = 2430 / 电流采样范围,代码通过设置的电流采样范围,计算出需要的放大倍数。如果电流采样范围设置120A,放大倍数为20倍,如果电流采样范围设置240A,放大倍数为10倍,如果电流采样范围设置30A,放大倍数为80倍,如果电流采样范围设置60A,放大倍数为40倍,ODrive的采样电阻为0.5mΩ,