SimpleFOC-多路PWM驱动,相电流监测

原创 云深之无迹 2023-03-24 21:15

三天助力一个不知死活的本科生毕业论文,开搞!

3PWM

6PWM

在BLDC电机控制上,6路PWM 控制模式比3路PWM更自由,因为6个半桥式晶体管的每一个都可以单独控制。

死区时间

开关元器件的和严格意义并不是相同的。IGBT,MOS并不是理想开关器件,其开通时间和关断时间不是严格一致的,如果两端有电压,将导致直流电源短路,损坏桥臂功率器件,称之为“桥臂直通”。所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,通常存在两种情况;
上半桥关断后,延迟一段时间再打开下半桥;
下半桥关断后,延迟一段时间再打开上半桥;
这样就不会同时导通,从而避免功率元件烧毁。
相对于PWM来说,死区时间是在PWM输出的这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是当PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。
另外如果死区设置过小,但是仍然出现上下管同时导通,因为导通时间非常非常短,电流没有变得很大,不足以烧毁系统,那此时会导致开关元器件发热严重,所以选择合适的死区时间尤为重要,过大过小都不行。
因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足;
:最大的关断延迟时间;
:最小的开通延迟时间;
:最大的驱动信号传递延迟时间;
:最小的驱动信号传递延迟时间;

上面就是三种基本的转子获得的方式,第一个是正交的光栅,第二个是电磁,最后一个是霍尔原件。

采样电阻是电流采样和对电压采样。对电流采样则串联一个阻值较小的电阻,对电压采样则并联一个阻值较大的电阻。

采样电阻的工作原理是欧姆定律,即I=U/R,通过IC检测电阻两端的电压,用电压除以电阻标称值即得到通过电阻的电流值。因此采样电阻的精度直接影响到电流采样的准确性。

老传统的采样电路了

采样电阻的采样原理:采样电阻将一个阻值较小的电阻,串联在电路中用于把电流转换为电压信号进行测量。采样电阻是一种限流元件,导体对电流的阻碍作用大,我们便说其采样电阻大,反之,称其采样电阻小。但是采样电阻并不会因为导体上没有电流通过而消失,采样电阻是一个导体的固有属性,即便导体上没有电流流过,其采样电阻也是存在的。采样电阻只是一个统称,对其深入了解之后会知道采样电阻多种多样,采样电阻连接采样电阻的阻值会选在1欧姆以下,属于毫欧级电阻,但是部分电阻,有个采样电压等要求,必须选择大阻值电阻,但是这样电阻基数大,产生的误差大。


电流检测结构要求高精度双向放大器具有比常规低侧或高侧放大器更好的PWM抑制。

这个是在线测量相电流的方式

我认为的PWM抑制是,这个地方测量到的相电流的大小,其实是在一个PWM的信号源里面知道电流的大小,所以就是要压制PWM。这就像是在飓风期间测量海上漂浮的杯子中的液体一样。

在这样的情况下测量电流的大小

SimpleFOC直接使用的是在线测量,而且还是双向测量

原理图

INA240的原理框图

大多数低端无刷电机驱动器没有电流测量功能,SimpleFOC提供了一种通过设置电机电压而不是电流来控制电机扭矩的方法。这使无刷直流电机有效地成为直流电机。

也叫直列式测量

电机的驱动电路可生成脉宽调制 (PWM) 信号来控制电机的运行。这些调制信号使得位置与各电机相位一致的测量电路进行共模电压 (VCM) 转换,在转换过程中,电压将在极短时间内在不同高电压电平之间进行切换。

完美的放大器产品能够完全抑制测量的 VCM 分量,仅放大与流经分流电阻器 的电流相对应的差分电压。不幸的是,实际的放大器产品并不理想,会受到大 PWM 驱动输入电压阶跃的影响。由于实际的放大器产品无法进行无限的抑制共模,因此放大器输出端可能会出现与每个输入电压阶跃相对应的大幅度意外干扰。

此类测量的常用方法是选择带宽较高的电流检测放大器。为了保持在可听频率范围之上,典型的调制频率 范围为 20kHz 至 30kHz。用于在这些 PWM 驱动应用 中进行直列式电流测量的放大器选择以信号带宽在 200kHz 至 500kHz 范围内的放大器为目标。以往选择放大器时并不基于显著低于 PWM 信号带宽的实际信号带宽。选择更高的放大器带宽可以使输出干扰在输入电压转换后快速稳定下来。

抑制过后得到的样子

消除噪声后表示的每个相位的输出电压信号。红色波形表示信号,表明经过电子换向的功率晶体管将正弦波形尽可能准确地复制到电机。电流感应放大器将经受从电源轨(例如 V BATT = 48V)到接地端的输入共模电压信号。

低侧相位检测可以更轻松地确定电动机的相电流,但这不是一种精确的方法。它可能会引入与相电流有关的误差。
主要挑战在于,共模电压是PWM信号,除非启用了适当的PWM抑制电路,否则会导致输出信号中断。这导致对电流感测放大器的要求更加严格,该电流感测放大器必须具有出色的DC和AC共模抑制比(CMRR)以及高DC精度(低输入失调电压)。一些设备测量在一个方向上流动的电流。
下面给出一个Arduino控制的FOC电流在线测量实例

对于放大器给出的电流就是直接使用ADC采集就行

让我们来过滤一下这个电流,因为频率的原因,就低通滤波就好

使用操作符重载一下

我们直接使用这个函数就行

相电流的变化,代码在文后

低侧电流测试

低侧电流检测可能是最常见的电流检测技术。主要原因是它既不需要高性能PWM抑制电流检测放大器(如在线检测放大器),也不需要支持高压的放大器(如高侧放大器)。

采样电阻始终置于低侧MOSFET和地之间,确保放大器的端子上始终具有非常低的电压。这种方法的主要缺点是,由于只有相应的低侧mosfet开启时,通过采样电阻的电流才是相电流,而我们只能在这些时刻测量到相电流。PWM频率通常为20至50 kHz,这意味着低侧MOSFET每秒开关20000至50000次,因此PWM设置和ADC采集之间的同步非常重要。

目前这个在开发中。

这个是高测测量一般也不用




https://www.ti.com.cn/product/cn/INA240
https://www.elecfans.com/analog/202007151246626.html
https://zhuanlan.zhihu.com/p/401573207
https://www.sohu.com/a/439655421_468638
https://baijiahao.baidu.com/s?id=1753450617334241521&wfr=spider&for=pc
https://m.elecfans.com/article/1107269.html
https://www.elecfans.com/d/1412716.html

// IN1 pwm1 9 27// IN2 pwm2 6 26// IN3 pwm3 5 25// INH1 enable1 8 12// INH2 enable2 7 13// INH3 enable3 4 14// in-line current sense - phase 1/A 35// in-line current sense - phase 1/C 34
#include
class LowPassFilte{public: LowPassFilte(float Tf); // 低通滤波器时间常量 ~LowPassFilte() = default; float operator()(float x); float Tf; //!< 低通滤波器时间常量protected: unsigned long timestamp_prev; //!< 上次执行时间戳 float y_prev; //!< 经过上次执行后过滤到的值};
LowPassFilte::LowPassFilte(float time_constant) : Tf(time_constant), y_prev(0.0f){ timestamp_prev = micros();}
float LowPassFilte::operator()(float x){ unsigned long timestamp = micros(); float dt = (timestamp - timestamp_prev) * 1e-6f;
if (dt < 0.0f || dt > 0.5f) dt = 1e-3f;
float alpha = Tf / (Tf + dt); float y = alpha * y_prev + (1.0f - alpha) * x;
y_prev = y; timestamp_prev = timestamp; return y;}
LowPassFilte LF_a(0.01); // 原始数据滤波器LowPassFilte LF_b(0.01); // A相电流滤波器LowPassFilte LF_c(0.01); // C相电流滤波器
// AS5600编码器支持spi,iic和模拟量三种数据传输方式,这里用iic(同时也是最常用的方式)// magnetic sensor instance - I2CMagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);TwoWire I2Cone = TwoWire(0);
// BLDC motor & driver instanceBLDCMotor motor = BLDCMotor(11);BLDCDriver3PWM driver = BLDCDriver3PWM(27, 26, 25, 12, 13, 14);
InlineCurrentSense Cs_motor(0.001, 50.0, 35, 36, 34);
// voltage set point variablefloat target_voltage = 5.0;// instantiate the commanderCommander command = Commander(Serial);void doTarget(char *cmd){ command.scalar(&target_voltage, cmd);}
void setup(){ // initialise magnetic sensor hardware I2Cone.begin(18, 5, 400000); sensor.init(&I2Cone); // link the motor to the sensor motor.linkSensor(&sensor);
// power supply voltage driver.voltage_power_supply = 12; driver.init(); motor.linkDriver(&driver);
// aligning voltage motor.voltage_sensor_align = 5; // choose FOC modulation (optional) motor.foc_modulation = FOCModulationType::SpaceVectorPWM; // set motion control loop to be used motor.controller = MotionControlType::torque;
// use monitoring with serial Serial.begin(115200); // comment out if not needed motor.useMonitoring(Serial);
// initialize motor motor.init(); // align sensor and start FOC motor.initFOC();
// add target command T command.add('T', doTarget, "target voltage");
Serial.println(F("Motor ready.")); Serial.println(F("Set the target voltage using serial terminal:")); _delay(1000);
Cs_motor.init();}
void loop(){
// main FOC algorithm function // the faster you run this function the better // Arduino UNO loop ~1kHz // Bluepill loop ~10kHz motor.loopFOC(); // Motion control function // velocity, position or voltage (defined in motor.controller) // this function can be run at much lower frequency than loopFOC() function // You can also use motor.move() and set the motor.target in the code motor.move(target_voltage);
// Cs_motor.getPhaseCurrents(); Serial.print(LF_b((Cs_motor.getPhaseCurrents()).a)); Serial.print(","); Serial.println(LF_c((Cs_motor.getPhaseCurrents()).c));
// Serial.print(LF_a(analogRead(35))); // Serial.print(","); // Serial.print(LF_b((3.3 * ((float)analogRead(35) - 1930) / 4096.0) * 20.0)); // Serial.print(","); // Serial.println(LF_c((-3.3 * ((float)analogRead(34) - 1930) / 4096.0) * 20.0));
// user communication command.run();}

相电流的检测函数

评论
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 192浏览
  • 飞凌嵌入式基于瑞芯微RK3562系列处理器打造的FET3562J-C全国产核心板,是一款专为工业自动化及消费类电子设备设计的产品,凭借其强大的功能和灵活性,自上市以来得到了各行业客户的广泛关注。本文将详细介绍如何启动并测试RK3562J处理器的MCU,通过实际操作步骤,帮助各位工程师朋友更好地了解这款芯片。1、RK3562J处理器概述RK3562J处理器采用了4*Cortex-A53@1.8GHz+Cortex-M0@200MHz架构。其中,4个Cortex-A53核心作为主要核心,负责处理复杂
    飞凌嵌入式 2025-01-24 11:21 155浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 267浏览
  • 不让汽车专美于前,近年来哈雷(Harley-Davidson)和本田(Honda)等大型重型机车大厂的旗下车款皆已陆续配备车载娱乐系统与语音助理,在路上也有越来越多的普通机车车主开始使用安全帽麦克风,在骑车时透过蓝牙连线执行语音搜寻地点导航、音乐播放控制或免持拨打接听电话等各种「机车语音助理」功能。客户背景与面临的挑战以本次分享的客户个案为例,该客户是一个跨国车用语音软件供货商,过往是与车厂合作开发前装车机为主,且有着多年的「汽车语音助理」产品经验。由于客户这次是首度跨足「机车语音助理」产品,因
    百佳泰测试实验室 2025-01-24 17:00 58浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 201浏览
  • 随着AI大模型训练和推理对计算能力的需求呈指数级增长,AI数据中心的网络带宽需求大幅提升,推动了高速光模块的发展。光模块作为数据中心和高性能计算系统中的关键器件,主要用于提供高速和大容量的数据传输服务。 光模块提升带宽的方法有两种:1)提高每个通道的比特速率,如直接提升波特率,或者保持波特率不变,使用复杂的调制解调方式(如PAM4);2)增加通道数,如提升并行光纤数量,或采用波分复用(CWDM、LWDM)。按照传输模式,光模块可分为并行和波分两种类型,其中并行方案主要应用在中短距传输场景中成本
    hycsystembella 2025-01-25 17:24 50浏览
  • 前篇文章中『服务器散热效能不佳有解吗?』提到气冷式的服务器其散热效能对于系统稳定度是非常重要的关键因素,同时也说明了百佳泰对于散热效能能提供的协助与服务。本篇将为您延伸说明我们如何进行评估,同时也会举例在测试过程中发现的问题及改善后的数据。AI服务器的散热架构三大重点:GPU导风罩:尝试不同的GPU导风罩架构,用以集中服务器进风量,加强对GPU的降温效果。GPU托盘:改动GPU托盘架构,验证出风面积大小对GPU散热的影想程度。CPU导风罩:尝试封闭CPU导风罩间隙,集中风流,验证CPU降温效果。
    百佳泰测试实验室 2025-01-24 16:58 53浏览
  • 故障现象 一辆2007款日产天籁车,搭载VQ23发动机(气缸编号如图1所示,点火顺序为1-2-3-4-5-6),累计行驶里程约为21万km。车主反映,该车起步加速时偶尔抖动,且行驶中加速无力。 图1 VQ23发动机的气缸编号 故障诊断接车后试车,发动机怠速运转平稳,但只要换挡起步,稍微踩下一点加速踏板,就能感觉到车身明显抖动。用故障检测仪检测,发动机控制模块(ECM)无故障代码存储,且无失火数据流。用虹科Pico汽车示波器测量气缸1点火信号(COP点火信号)和曲轴位置传感器信
    虹科Pico汽车示波器 2025-01-23 10:46 136浏览
  • 项目展示①正面、反面②左侧、右侧项目源码:https://mbb.eet-china.com/download/316656.html前言为什么想到要做这个小玩意呢,作为一个死宅,懒得看手机,但又想要抬头就能看见时间和天气信息,于是就做个这么个小东西,放在示波器上面正好(示波器外壳有个小槽,刚好可以卡住)功能主要有,获取国家气象局的天气信息,还有实时的温湿度,主控采用ESP32,所以后续还可以开放更多奇奇怪怪的功能,比如油价信息、股票信息之类的,反正能联网可操作性就大多了原理图、PCB、面板设计
    小恶魔owo 2025-01-25 22:09 114浏览
  • 书接上回:【2022年终总结】阳光总在风雨后,启航2023-面包板社区  https://mbb.eet-china.com/blog/468701-438244.html 总结2019,松山湖有个欧洲小镇-面包板社区  https://mbb.eet-china.com/blog/468701-413397.html        2025年该是总结下2024年的喜怒哀乐,有个好的开始,才能更好的面对2025年即将
    liweicheng 2025-01-24 23:18 101浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦