SimpleFOC之ESP32(七)—— 霍尔电机



SimpleFOC教程目录:请点击

一、霍尔电机介绍

  • 霍尔电机就是带霍尔传感器的直流无刷电机,下图
    在这里插入图片描述
  • 霍尔有两种安装方式,120度和60度,120度安装方式的稍微常见一些,下图
    在这里插入图片描述
  • 主要应用于车轮,特别是电动自行车,几乎都是霍尔电机,下图
    在这里插入图片描述
  • 如果是做机器人底盘,霍尔电机是个很好的选择;
  • 如果是做机械臂或者高精度应用的,霍尔电机精度低不适合此类场景。

二、ESP32drive控制霍尔电机

2.1、原理图

在这里插入图片描述

2.2、读霍尔角度

2.2.1、硬件准备

序号名称数量
1USB转串口1
2ESP32drive1
3霍尔电机1
412V电源1
5杜邦线若干

在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技

2.2.2、硬件连接

在这里插入图片描述

2.2.3、代码演示

  • 打开示例
    在这里插入图片描述
  • 修改代码
    在这里插入图片描述
  • 用手转动电机轴,观察角度输出。如果极对数设置正确,刚好转一圈角度为6.28,
    在这里插入图片描述

2.3、控制霍尔电机

2.3.1、硬件准备

与上面2.2.1 的准备相同。

2.3.2、硬件连接

在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技

2.3.3、代码演示

  • 打开示例
    在这里插入图片描述

  • 修改代码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 发送指令,控制电机转动
    在这里插入图片描述

2.3.4、与simpleFOCStudio的互动

  • 如果对simpleFOCStudio不熟悉,可以先阅读此文:SimpleFOCStudio安装使用说明及PID调试
  • 上面修改代码已经给出了与simpleFOCStudio通信需要添加的代码,
  • 下面的演示采用24V电压,增大电压可以达到更高的转速,
    在这里插入图片描述

三、ESP32drive-D控制霍尔电机

3.1、原理图

在这里插入图片描述

  • ESP32drive-D采用非对称电路设计,M1三个使能引脚,M2一个使能引脚,
    在这里插入图片描述
  • 霍尔信号设计的有上拉电阻,可以短路跳线(背面),

3.2、读霍尔角度

3.2.1、硬件准备

序号名称数量
1USB转串口1
2ESP32drive-D1
3霍尔电机1
412V电源1
5杜邦线若干

在这里插入图片描述

ESP32drive 购买链接:https://item.taobao.com/item.htm?ft=t&id=662591519566,图锐科技

3.2.2、代码演示

在这里插入图片描述
在这里插入图片描述

3.3、控制霍尔电机

在这里插入图片描述

在这里插入图片描述

3.3.1、打开示例

在这里插入图片描述

3.3.2、修改代码

在这里插入图片描述
在这里插入图片描述

3.3.3、问题说明

  • ESP32drive-D的M1采用了三个使能引脚控制,就是为了实现方波控制,但是实际测试发现,Trapezoid_120和Trapezoid_150两种调制模式,检测的极对数总是不对。强行发送指令电机也可以转动,最高转速与SinePWM和SpaceVectorPWM调制模式差不多。
  • 比如测试用的霍尔电机为2对极,如果用SinePWM和SpaceVectorPWM调制模式,检测是正常的,控制也是正常的;如果用Trapezoid_120和Trapezoid_150检测到的极对数是2.4。本人已经反复测试对比,更换了STM32F103C8T6和PowerShieldV0.2,检测到的极对数都是2.4,也可能是我用的不对,或者这部分代码有问题。

3.4、控制双霍尔电机

  • 控制双霍尔电机在《SimpleFOC之ESP32(六)—— 双电机控制》的基础上修改,
  • 控制效果不太好,双电机检测都正常,但是转动时有时会突然停止,或者两个电机都正常转动的时候,操作一个电机反转,另一个电机会停止。估计跟霍尔检测的中断配置有关,代码中霍尔信号全部是中断模式,这个问题暂时不深入研究,请大家避坑!
    在这里插入图片描述

问题总结分析

  • 问题:
    • 1、Trapezoid_120和Trapezoid_150两种调制模式检测极对数不准确,不好用。暂时没有分析出原因。
    • 2、单个霍尔电机控制,12V时偶尔会出现突然不转的现象,用示波器查看三相PWM波形已经变为全部是高电平;24V时出现突然不转的频率明显高于12V。
    • 3、双霍尔电机控制非常不稳定。(双霍尔电机使用6个中断)
  • 原因分析:
    • 1、霍尔信号直接进入单片机,中间没有加滤波电路,工业用驱动器的霍尔信号都有阻容滤波设计。
    • 2、霍尔信号使用中断模式,软件上也没有滤波处理。
    • 3、查看SimpleFOC的底层代码,霍尔电机的处理方式是这样的:霍尔信号中断时更新一次角度,Trapezoid_120和Trapezoid_150根据角度产生方波;SPWM或者SVPWM根据角度产生矢量,如果电机是2对极,一圈12个霍尔信号,也就只有12个矢量。所以无论是方波控制,还是弦波控制,电角度每次都是跨60度,表现为电机振动大噪音大,也因此更容易产品干扰,所以同样是中断模式的ABZ编码器电机程序出问题的概率要小很多。
    • 第3个问题与常见的FOC控制霍尔电机处理方式不一样,后续应该会升级。

在这里插入图片描述
在这里插入图片描述


(完)



请继续阅读相关文章:
SimpleFOC之ESP32(一)—— 搭建开发环境
SimpleFOC之ESP32(二)—— 开环控制
SimpleFOC之ESP32(三)—— 闭环控制
SimpleFOC之ESP32(四)—— 电流闭环控制Inline
SimpleFOC之ESP32(五)—— 电流闭环控制Lowside
SimpleFOC之ESP32(六)—— 双电机控制
SimpleFOC之ESP32(七)—— 霍尔电机
SimpleFOC之ESP32(八)—— ABZ编码器电机
SimpleFOC之ESP32(九)—— WIFI、UDP和TCP
SimpleFOC之ESP32(十)—— ESP-NOW和力矩反馈

### 使用 STM32F4 微控制器控制 BLDC 无刷直流电机 #### 控制框架概述 为了实现对BLDC电机的有效控制,STM32F4微控制器可以作为核心处理单元,负责接收传感器数据、执行算法计算并发送指令给功率级电路以调整电机的速度和位置。具体来说,该过程涉及到了解电机的工作原理及其所需的信号波形,合理配置定时器资源生成PWM输出,以及设置ADC模块采集反馈信息。 #### 定时器与 PWM 输出 STM32F4系列内置高级定时器(TIM1,TIM8),这些定时器支持多种模式下的脉宽调制(PWM)功能。对于三相逆变器而言,通常会采用互补型PWM输出方式来驱动上下桥臂开关管动作。这可以通过设定相应通道为互斥工作状态,并指定死区时间防止直通现象发生[^1]。 #### ADC 反馈机制 在闭环控制系统里,获取实际运行状况至关重要。因此,除了产生合适的激励外还需要不断监测负载变化情况以便及时作出响应。这里就涉及到模数转换器(Analog-to-Digital Converter, ADC),它能够周期性地读取来自霍尔效应传感器或者其他形式的位置编码器所提供的电压水平,进而估算当前转子所处的角度位置[^2]。 #### L6234 半桥驱动集成芯片的应用 考虑到功率放大需求,往往会在MCU之后加入专门设计用来承受较大电流冲击的外部器件——比如L6234这样的专用集成电路(Integrated Circuit, IC)。这类产品内部集成了六个N沟道MOSFET构成三个独立可编程逻辑门控全桥结构,非常适合于小型化家电设备内的风扇马达或是电动工具里的高速运转部件等场合下使用。 #### 实现 FOC (Field-Oriented Control) 算法 场定向控制(Field Oriented Control, FOC) 是一种先进的矢量变换技术,它可以将交流感应机理映射到同步坐标系上简化分析难度的同时提高动态性能指标。下面给出了一段基于 SimpleFOC 库开发环境编写而成适用于ESP32平台但同样适用其他ARM Cortex-M内核单片机如STM32F4xx家族成员上的参考源码片段: ```cpp #include <Arduino.h> #include <SimpleFOC.h> // 创建电机对象实例并与指定引脚关联起来 BLDCMotor motor = BLDCMotor(25, 26, 27); BLDCDriver3PWM driver = BLDCDriver3PWM(14, 12, 13, 15); void setup() { // 配置电机属性并将其实例绑定至选定驱动程序之上 motor.linkDriver(&driver); // 设定控制器类型为正弦空心(Sine Hollow Waveform) motor.controller = FOCController::SineHollow; // 启动无感测监控方案 motor.monitor = Monitor::SensorlessMonitor; // 执行初始化操作序列 motor.init(); motor.initFOC(); // 初始目标扭矩/速度设定值 motor.target = 2.0; } void loop() { // 更新一次完整的FOC迭代流程 motor.loopFOC(); // 移动电机达到预期效果 motor.move(); } ``` 上述代码展示了如何创建一个 `BLDCMotor` 对象并通过链接对应的 `BLDCDriver3PWM` 来完成基本的功能定义;接着设置了具体的控制策略即所谓的“正弦空心”,这是一种较为理想的电磁兼容特性良好的励磁方法;最后通过循环调用 `loopFOC()` 方法实现了持续性的实时调节目的[^3]。 #### HAL库函数辅助开发 当涉及到更底层的操作时,则可能需要用到意法半导体官方提供的硬件抽象层(Hardware Abstraction Layer, HAL) API接口来进行更加精细度高的定制化服务。例如说要人为制造某个计数值溢出事件的话就可以借助 `HAL_TIM_GenerateEvent()` 函数轻松搞定,其作用在于允许开发者灵活操控各类中断源而无需关心背后复杂的寄存器位域含义[^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值