直流无刷电机控制(FOC):电流模式

目录

概述

1 系统框架结构

1.1 硬件模块介绍

1.2 硬件实物图

1.3 引脚接口定义

2 代码实现

2.1 软件架构

2.2 电流检测函数

3 电流环功能实现

3.1 代码实现

3.2 测试代码实现

4 测试


概述

本文主要介绍基于DengFOC的库函数,实现直流无刷电机控制(FOC)的电流环控制。笔者详细介绍了电流环采样电流时用到的函数。DengFOC的软件架构,电流环模式实现的原理等内容。

源代码下载地址:

dengfoctestdemo资源-CSDN文库

1 系统框架结构

1.1 硬件模块介绍

系统硬件框架结构功能如下:

电机模块: 2208直流无刷电机(数量:1)

编码器:  选用AS5600编码器,用于获取当前电机转动的角度,其通过I2C接口与MCU进行通信

驱动板(FOC): 通过接收到MCU传送的PWM芯片,直接作用到MOS管上,以驱动直流无刷电机工作。

主控模块:使用ESP32 ( ESP32-WROOM-32E)

电流检测功能: 使用MCU ADC功能检测INA240的输出电压值

1.2 硬件实物图

1.3 引脚接口定义

 1) 电机驱动板与电机之间的接口

2)编码器与MCU接口

3)电流检测

2 代码实现

2.1 软件架构

2.2 电流检测函数

1)源代码介绍

代码12行: 定义参考电压值

代码13行: ADC的最大值(12bit )

代码16: 计算比率

代码25~26行: 定义ADC的端口

代码28行: 分流电阻

代码29行: 电流放大倍数

代码31行: 电流放大的比率 

代码55~59行: 获取ADC的count值

代码61~66行: 配置ADC的端口模式

​ 

代码69~91行: 获取ADC的均值 

代码93~99行:  读电流参数初始化

代码104~109行:  获取电流值

 2)源代码文件

编写InlineCurrent.c文件的内容

#include <Arduino.h> 
#include "InlineCurrent.h"


//  - shunt_resistor  - 分流电阻值
//  - gain  - 电流检测运算放大器增益
//  - phA   - A 相 adc 引脚
//  - phB   - B 相 adc 引脚
//  - phC   - C 相 adc 引脚(可选)


#define _ADC_VOLTAGE 3.3f            //ADC 电压
#define _ADC_RESOLUTION 4095.0f      //ADC 分辨率

// ADC 计数到电压转换比率求解
#define _ADC_CONV ( (_ADC_VOLTAGE) / (_ADC_RESOLUTION) )

#define NOT_SET -12345.0
#define _isset(a) ( (a) != (NOT_SET) )

CurrSense::CurrSense(int Mot_Num)
{
  if(Mot_Num==0)
  {
    pinA = 39;
    pinB = 36;
    //int pinC;
    _shunt_resistor = 0.01;
    amp_gain  = 50;
    
    volts_to_amps_ratio = 1.0f /_shunt_resistor / amp_gain; // volts to amps
    
    // gains for each phase
    gain_a = volts_to_amps_ratio*-1;
    gain_b = volts_to_amps_ratio*-1;
    gain_c = volts_to_amps_ratio;
  }

  if(Mot_Num==1)
  {
    pinA = 35;
    pinB = 34;
    //int pinC;
    _shunt_resistor = 0.01;
    amp_gain  = 50;
    
    volts_to_amps_ratio = 1.0f /_shunt_resistor / amp_gain; // volts to amps
    
    // gains for each phase
    gain_a = volts_to_amps_ratio*-1;
    gain
### 直流无刷电机 FOC 控制中的电流环实现 #### 电流环的作用 在直流无刷电机的磁场定向控制 (FOC) 中,电流环起着至关重要的作用。电流环负责精确调节流入电机各相绕组的电流,从而确保电机按照预期的方式运行。通过调整电流环内的比例积分 (PI) 调节器参数,可以优化电机性能,提高动态响应速度和稳定性。 #### 实现原理 电流环的工作流程主要包括以下几个方面: - **采样**:使用电流传感器获取电机三相电流的实际值。 - **转换**:将三相电流转换到旋转坐标系下的 d-q 轴分量。 - **比较**:将实际测得的 d-q 轴电流与设定的目标电流进行对比。 - **调节**:根据误差信号,由 PI 调节器计算出所需的电压指令。 - **逆变**:最终生成 PWM 波形来驱动功率器件改变电机输入电压。 这一过程能够有效抑制负载扰动带来的影响,并保持良好的稳态特性[^3]。 #### 代码示例 下面是一个简单的 Arduino 平台下基于 SimpleFOC 库实现电流环的例子: ```cpp #include <SimpleFOC.h> // 创建 BLDCMotor 对象 BLDCMotor motor = BLDCMotor(8); // 定义控制器对象 PID currReg_dq; currReg_dq.setGains(Kp, Ki); void setup(){ // 初始化电机配置... // 设置为电流控制模式 motor.controller = &currReg_dq; // 配置电流 PI 参数 float Kp = 1.0f; float Ki = 0.5f; } void loop(){ // 设定目标电流 motor.command.iD = 0.0f; // 默认d轴电流设为零 motor.command.iQ = 1.0f; // q轴电流设为目标值 // 更新一次 FOC 循环 motor.loop(); } ``` 此段程序展示了如何定义并初始化一个 PID 类型的电流调节器 `currReg_dq` 来管理电机内部的 d-q 轴电流。此外,在主循环里指定了期望达到的 dq 轴电流水平并通过调用 `motor.loop()` 方法完成整个控制周期的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值