目录
概述
本文主要介绍基于DengFOC的库函数,实现直流无刷电机控制(FOC)的电流环控制。笔者详细介绍了电流环采样电流时用到的函数。DengFOC的软件架构,电流环模式实现的原理等内容。
源代码下载地址:
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