FOC电机驱动-Odrive核心代码讲解
文章平均质量分 73
FOC电机驱动-Odrive核心代码逐行讲解,细致到函数功能。
嵌入式crafter
提供发布项目的指导,提供实现思路和答疑服务。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Odrive NameError: name ‘odrv0‘ is not defined
利用Zadig烧录USB驱动后,发现还是报错了NameError: name 'odrv0' is not defined。错误方式:烧录成了CDC Interface。原创 2025-04-12 10:34:29 · 326 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制核心代码 Odrive motor.cpp(.hpp)代码实现(一)
它基于电机的 相电阻(phase resistance) 和 相电感(phase inductance) 动态计算电流环的 比例增益(P gain) 和 积分增益(I gain)。根据电机参数(phase_inductance 和 phase_resistance)和控制带宽(current_control_bandwidth),自动计算电流环的 P 增益 和 I 增益。这是一种基于模型的控制器调参(Model-Based Tuning),确保电流环的动态响应最优。电流环比例增益(Kp)原创 2025-04-08 15:48:08 · 1307 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制核心代码 Odrive motor.cpp(.hpp)代码实现(二)
这段代码是 ODrive 中计算电机实际电流限制(effective current limit)的函数,它综合了多个限制因素(配置值、硬件能力、电压限制等),确保电流控制既满足用户需求,又不会超出系统安全范围。计算电机运行时允许的 实时最大电流值(单位:A)。这段代码是 ODrive 中将 ADC 原始值转换为电机相电流(单位:安培)的核心函数,主要用于电流采样信号的处理。它会根据电机类型(普通电机或异步感应电机ACIM)和系统限制,动态计算实时可用的扭矩上限。普通电机(电流控制模式)原创 2025-04-08 15:52:24 · 331 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制核心代码 Odrive motor.cpp(.hpp)代码实现(三)
这段代码是 ODrive 中用于测量电机相电阻(phase resistance)的函数,通过注入测试电流并测量电压降来计算电阻值。作用:动态测量电机相电阻(单位:Ω),用于自动校准或故障检测。输入参数:test_current:测试电流幅值(如5A)。max_voltage:允许的最大测试电压(防止过压损坏)。输出:true:测量成功,结果存入 config_.phase_resistance。false:测量失败(错误码记录在 axis_->error_)。12 bool Motor::measu原创 2025-04-09 11:06:19 · 1655 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制核心代码 Odrive motor.cpp(.hpp)代码实现(四)
这段代码是 FOC(Field-Oriented Control)电压控制 的一部分,目的是根据电机当前电角度 pwm_phase,将 d/q 电压向量通过 逆 Park 变换(inverse Park transform) 转换为 αβ 坐标系下的电压向量,然后交给 SVM 做三相 PWM 输出。这是一个电流控制器,在 FOC 控制中它属于内环控制,作用是:将期望的 d/q 电流(电机磁通和转矩)转换为 α/β 坐标的调制波形,驱动三相电机输出 PWM。总结一张图(简略流程)原创 2025-04-09 11:07:42 · 695 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(一)
在 our_arm_cos_f32 函数中,查表(Look-Up Table, LUT) 的核心是 预计算的正弦值表 sinTable_f32,通过巧妙利用余弦与正弦的相位关系实现快速余弦计算。这段代码实现了一个优化的浮点余弦函数 (our_arm_cos_f32) ,主要用于实时嵌入式系统中的快速三角函数计算。长度:FAST_MATH_TABLE_SIZE(例如256点,即每 2π/256 ≈ 0.0245 弧度一个采样点)。:速度更快,但误差增大(电机控制中典型用256点,误差±0.1%)。原创 2025-04-09 11:10:40 · 1571 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 arm_cos_f32.cpp arm_sin_f32.cpp代码实现(二)
见arm_cos_f32.c 代码分析文章。原创 2025-04-09 11:11:59 · 621 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 axis.cpp代码实现(一)
/ 校准电流 // ...其他参数 } config_;// 1. 主控制循环(实时中断调用) bool Axis::run_control_loop() { // FOC算法执行 motor_.update(current_meas_);} } // 2. 校准例程 bool Axis::start_calibration() { // 检查电机是否就绪 // 执行编码器、电阻、电感校准 motor_.measure_phase_resistance();:定义“轴”的蓝图(包含哪些部件、如何配置)。原创 2025-04-11 10:45:16 · 949 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 axis.cpp代码实现(二)
这是一个中断回调适配器函数,用于将普通的 C 回调(如在 HAL 或中断中注册的函数)转发到 Axis 类的成员函数 step_cb()。这段代码定义了 ODrive 在无传感器模式(Sensorless Mode)下使用的默认锁定(Lock-in)参数配置,主要用于电机启动时的转子位置辨识和速度拉入同步。这段代码定义了 ODrive 电机轴(Axis)在校准(Calibration)过程中使用的默认锁定(Lock-in)参数配置,主要用于电机初始位置检测或编码器校准。板载MOSFET温度监控。原创 2025-04-11 10:47:48 · 994 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 axis.cpp代码实现(三)
这段代码 Axis::do_checks() 是 ODrive 项目中用来进行轴状态自检的函数,确保系统各部分处于正常工作状态,否则就设置相应的 error_ 错误位。start_thread():在 FreeRTOS 中新建一个线程,运行 run_state_machine_loop()(状态机控制主循环)。从配置中的 GPIO 引脚号获取实际的 GPIO_TypeDef* 和 pin mask,便于后续快速访问 GPIO 的电平状态或设置输出。封装默认配置设置,用于初始化或从某些模板中加载配置项。原创 2025-04-11 10:50:08 · 602 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 axis.cpp代码实现(四)
这段代码实现了ODrive电机控制中的"锁定旋转"(Lock-in Spin)功能,主要用于电机启动时的转子位置识别和速度同步。这段代码实现了ODrive在无传感器模式(Sensorless Mode)下的主控制循环,是电机在没有位置传感器(如编码器)时实现闭环控制的核心逻辑。这段代码实现了ODrive的空闲状态控制循环,是电机轴在不执行具体任务时的基础运行模式。这段代码实现了ODrive的闭环控制主循环,是带编码器反馈的精确位置/速度控制的核心。这个函数必须定期调用,否则系统会认为“挂掉”了。原创 2025-04-11 14:39:11 · 611 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 controller.cpp代码实现
这段代码是 ODrive 固件中的一个关键函数,用于抗齿槽效应(Anti-Cogging)校准,是高级电机控制中常用的补偿机制之一。这是 ODrive 0.5.1 中 Controller::update() 的完整实现,是控制核心逻辑的心脏部分,主要完成从输入指令 → 内部处理 → 生成最终力矩指令(torque setpoint)的全过程。这是控制器类(Controller)的函数,用于选择一个编码器作为该控制器的控制目标(如位置闭环控制时的位置反馈来源)。原创 2025-04-11 15:36:10 · 636 阅读 · 0 评论 -
Odrive0.5.1-FOC电机控制 encoder.cpp代码实现
这段 Encoder::enc_index_cb() 是 编码器 Index 中断回调 的核心,它的主要任务是响应 Index 脉冲,并完成 位置归零、状态标记 和 抗齿槽力补偿使能。ODrive 中使用的是一个 简化的一阶数字 PLL(锁相环)结构,核心任务是:利用 编码器读数(离散跳变)估算 连续相位;它把 3 个霍尔传感器的数字信号(hall_state)解码成一个标准的位置序号(0~5),用于跟踪电机的当前电角度位置。这个函数 decode_hall 是一个用于霍尔编码器(三相)解码的小工具函数。原创 2025-04-11 20:00:15 · 1050 阅读 · 0 评论
分享