![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ODrive
文章平均质量分 92
loop222
单片机,硬件设计
展开
-
ODrive移植keil(九)—— 抗齿槽效应算法
在永磁电机中,即使定子中没有电流通过,也会存在一个电磁转矩,这个转矩叫齿槽力矩(Cogging Torque)。用手转动电机,会感觉到它从当前点“跳跃”并“稳定”在另一个点,电机有“一格一格”的顿挫感(俗称颗粒感)。当电机低速转动时,表现为“一顿一顿”,当电机高速转动时,电机的振动和噪声会更大。某疆早期的2312电机齿槽效应非常大,后来的电机齿槽效应明显变小了。5008电机的齿槽效应小,改善效果不明显,用齿槽效应大的电机测试,改善效果还是很明显的。原创 2023-12-08 09:00:23 · 3708 阅读 · 3 评论 -
ODrive移植keil(八)—— 闭环控制
定点运算早就存在,但是ST采用定点运算配合它的电机库,极大的推广了这一技术,我觉得目前市面上只要是定点运算的电机驱动器,应该都会受到ST的影响,或者直接就师承ST。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。如果限速,电机只能达到限制转速。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。发送指令“C”,3秒钟后电机“嘀”一声,然后正转8个电角度,反转8个电角度,同时串口打印校准参数。原创 2023-10-19 17:28:23 · 3478 阅读 · 4 评论 -
ODrive移植keil(七)—— 插值算法和偏置校准
ENCODER_cpr 为接口对应的cpr,比如AS5047P的ABZ接口cpr=4000,SPI接口的cpr=16384,注意区分。读取后的角度为原始数据,再在encoder_update() 中处理,数据处理包含了两部分:锁相环和插值,目前支持四种编码器:ABZ、AS5047P、MT6701、MA730,本例以ABZ信号为例,发送指令“P”(不需要回车换行),同时用手转动电机,查看角度打印,使用SPI接口,SPI读出角度为绝对值,更容易找到规律,原创 2023-10-14 18:10:02 · 2917 阅读 · 5 评论 -
ODrive移植keil(六)—— 测量电阻电感和电流环PI参数整定
最初移植的时候,我也用函数指针实现中断中的函数运行,但是发现函数指针太不直观了,非常容易被忽视和忘记更改指针,所以用了标志位的方法,不高级但却实用。发送指令“C”(不需要回车换行),3秒钟后电机“嘀”一声,校准完毕,打印测量结果,同时打印整定后的电流环PI参数。在ODrive代码中,设定了测量电流 I,根据检测到的电流不断调整 U,大概3秒钟,最终稳定电流到设定值,电阻电感测量的相关代码在motor.c文件中,可自行查看,上面也讲过了原理,所以就不再细说,原创 2023-10-12 10:31:43 · 2142 阅读 · 0 评论 -
ODrive移植keil(五)—— 开环控制和电流变换
如果转速设置太大,电机会振动,可以调高 target_voltage_ 以达到更大的转速,但是注意电机电流,注意发热。ODrive的程序架构,也是我在基本移植完代码后才焕然大悟的,如果事先有架构意识,不至于看代码的时候那么痛苦。Park变换的θ是当前读出的角度,而Park逆变换是下次FOC计算时的角度(当前角度+估算的下次转过的角度),3、Uq设置太大,电机发热严重,Uq设置太小,电机没劲转不动或者转不快,所以一定要根据电机相电阻设置大小,4、θ不是当前的角度,是目标角度,就是下次计算时的角度。原创 2023-10-11 10:57:06 · 2567 阅读 · 1 评论 -
ODrive移植keil(四)—— PWM触发ADC采样
ADC以DMA的方式转换,代码单独执行这个操作是没问题,但在初始化阶段随着片内外设配置的增加,或者代码执行顺序的变换,就会发生错位。网上找到过很多解释错位原因以及改正办法,但从来都没有彻底解决过这个问题,此次移植又遇到了这个问题,曾经的解决办法测试一遍后都失效了,最后发现用TIM2更新触发的方式不再错位。ADC1多通道规则转换时,如果使用DMA方式,经常会发生AD值错位的现象,比如第一个AD值的高字节放入的是低字节的数据,而低字节是第二个AD值的高字节数据,以此类推,转换值全部失效。原创 2023-09-16 18:08:18 · 3689 阅读 · 1 评论 -
ODrive移植keil(三)—— USB虚拟串口和快速正弦余弦运算
但是我实际的测试,从软件中断退出后仍然会执行第二个更新中断,并且我觉得在软件中断中等待第二次更新中断,很浪费时间,所以就没有使用这个方案。以上测试证明了USB虚拟串口移植成功,但在实际应用中,只需要USB收发数据,不需要USART2,所以屏蔽掉相关配置。单片机的USB通信,一般都是以虚拟串口的方式实现,ODrive使用自定义的接口,所以才需要用zadig驱动。DSP库优化后的运算,运算时间大约261520 us,精度在0.000001f,我本来是打算描述下移植的细节的,但是隔的时间太久了,已经记不清细节,原创 2023-09-15 17:07:40 · 1730 阅读 · 0 评论 -
ODrive移植keil(二)—— ODrive的程序架构
本节及之后的教程将把odrive移植到keil环境下,为了降低移植难度,同时也为了让大家更容易学习掌握移植后的代码,本次移植,只移植电机的核心控制功能,实现常用的一些功能。这部分代码会让人看得很无助,因为所有的代码都在此时执行,比如最下面的开环控制,都已经闭环了难道它还在运行,它运行的意义是什么?ADC1的规则通道转换所有闲杂的ADC,比如温度检测,不需要时效,软件触发后将一直在后台转换;国外的电机驱动技术领先国内这是不争的事实,“洋务运动”一直都在,只是在不同的领域不同的范围,原创 2023-09-07 11:16:30 · 4040 阅读 · 4 评论 -
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,原创 2023-09-01 17:51:00 · 8297 阅读 · 5 评论 -
ODrive的梯形轨迹
实际应用中,需要电机又快又稳的转到指定位置,梯形轨迹(INPUT_MODE_TRAP_TRAJ)本质上是一个分段函数的轨迹规划,是一个先加速,再匀速,再减速的三段函数的过程。2804电机100kv,12V电源,最高速度为1200RPM = 20 转/秒。AS5047P_SPI接口,电源电压12V,24V都可以。1.1.2、位置模式,梯形轨迹。1.1.1、速度模式。原创 2023-04-20 16:55:23 · 1510 阅读 · 0 评论 -
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原创 2023-04-20 16:21:45 · 2925 阅读 · 2 评论 -
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Ω,原创 2023-04-18 16:45:55 · 4276 阅读 · 2 评论 -
ODrive入门配置
ODrive入门配置,安装Python和odrivetool原创 2023-03-15 16:42:06 · 5718 阅读 · 0 评论 -
ODrive的操作演示——控制AS5047P、霍尔电机和轮毂电机
应该跟ODrive的电源是通过M0的DRV8301降压有关,或者单片机和两路DRV8301通过SPI通信,导致SPI复用过多。SPI接M0端子,进入闭环后电机稍微动一下就报错,查看错误:ENCODER_ERROR_ABS_SPI_COM_FAIL,本店改版后的ODrive,使用单独的电源芯片,并且SPI接口没有过多复用,不存在这个问题,M0/M1都能很好的转动。本文主要是结合本店的驱动器和电机,通过配置的参数,快速实现对电机的控制。用M1接口控制好点,但是转速不能过高,否则也报错。原创 2022-05-24 11:34:32 · 14738 阅读 · 6 评论