Lab01b-硬件完整性的开环控制
摘要
该实验室实现了标量电压/频率控制来测试硬件的完整性,即用于硬件抽象层 (HAL) 设置的 PWM 和 ADC 模块。该实验室与德州仪器 (TI)
的硬件兼容,旨在用于定制硬件验证。
介绍
在实验 1b 中,我们展示了一个没有 FAST 估计器的示例。相反,我们利用角度生成器模块来根据电机⽬标频率生成角度,并使用伏特/赫兹曲线生成输出命令电压来驱动电机。⽬的是通过这种标量伏/赫兹控制来测试 InstaSPIN‑FOC 模块,其中模块包括 PWM、ADC、CLARK、PARK 和 SVGEN。
(一)原理
为了实现更好的动态性能,需要应用更复杂的控制方案来控制ACI或PM电机。在 V/Hz 控制中,定子电压频率比通常基于这些变量的额定值。典型的 V/Hz 曲线如图 3 所示。基本上,V/Hz 曲线有以下三个速度范围:
-
在0‑fc Hz 时,需要电压,因此定子电阻上的电压降不能忽略,必须通过增加Vs 来补偿。因此,V/Hz 曲线不是线性的。截止频率(fc)和合适的定子电压可以通过 Rs ≠ 0 的稳态等效电路来分析计算。
-
在fc‑frate Hz 下,它遵循恒定的V/Hz 关系。
-
在较高的额定频率下,无法满足恒定的Vs/f 比,因为为了避免定子绕组处的绝缘击穿,定子电压将被限制在额定值。因此,所产生的气隙磁通将会减少,这将不可避免地导致产生的扭矩相应地减少。该区域通常称为“弱磁区”。为了避免这种情况,在此类频率下也违反了恒定 V/Hz 原则。
在本实验中,通过对频率施加下限来修改配置文件,如图 4 所示。这种方法对于风扇和鼓风机驱动器等低端速度响应并不重要的应用来说是可以接受的。由于额定电压(也是最大电压)以额定频率施加到电机,因此仅需要额定最小和最大频率信息来实现该配置文件。
允许命令频率低于最小频率fmin,同时输出电压在最小值Vmin 处饱和。此外,当命令频率高于最大频率fmax 时,输出电压在最大值Vmax 处饱和。
在本实验中,斜坡发生器模块用于根据电机⽬标频率生成角度。其中一个变量称StepAngleMax,用于确定斜坡信号的最小周期(1/频率)。向Angle_pu变量添加固定步长值会导致Angle_pu中的值以恒定速率循环。
在结束限制处, Angle_pu中的值简单地环绕并继续到下一个模值由步长给出。对于给定的步长,斜坡输出的频率(以 Hz 为单位)由下式给出:
其中fs是采样环路频率(以 Hz 为单位), N = 自动包装器变量Angle_pu 中的全局 Q 值。
对于 IQmath 实现,对于给定基数,每单位的最大步长 StepAngleMax频率、 fb和定义的 GLOBAL_Q 数计算如下:
同样,通过使用 _IQ() 函数将浮点数转换为 _IQ 数,StepAngleMax 也可以计算为
其中Ts是采样周期(秒)。
(二)PWMDAC观察波形
该模块将任何软件变量转换为 C2000 MCU 的 EPWMxA/B 中的 PWM 信号。因此,它可用于通过外部 RC 低通滤波器查看 PWMxA、PWMxB 引脚输出处的由变量表示的信号。
硬件原理图:
步骤1,在proj_lab01b.c中声明该PWMDAC模块的对象。
//PWMDAC变量
HAL_DacData_t gDacData;
按照步骤 2a 监视 SVGEN 的 PWM 输出。
步骤 2a,在 proj_lab01b.c 和 hal.c 中为每个 PWMDAC 通道设置正确的偏移和增益
// 设置DAC参数
gDacData.ptrData[0] = &gPwmData.Tabc.value[0];
gDacData.ptrData[1] = &gPwmData.Tabc.value[1];
gDacData.ptrData[2] = &gPwmData.Tabc.value[2];
gDacData.ptrData[3] = &gAdcData.V.value[0];
HAL_setDacParameters(halHandle, &gDacData);
// 设置每个通道的PWMDAC参数,保证输出波形
void HAL_setDacParameters(HAL_Handle handle, HAL_DacData_t *pDacData)
{
HAL_Obj *obj = (HAL_Obj *)handle;
pDacData->PeriodMax = PWMDAC_getPeriod(obj->pwmDacHandle[PWMDAC_Number_1]);
pDacData->offset[0] = _IQ(0.5);
pDacData->offset[1] = _IQ(0.5);
pDacData->offset[2] = _IQ(0.0);
pDacData->offset[3] = _IQ(0.0);
pDacData->gain[0] = _IQ(1.0);
pDacData->gain[1] = _IQ(1.0);
pDacData->gain[2] = _IQ(1.0);
pDacData->gain[3] = _IQ(1.0);
return;
} // end of HAL_setDacParameters() function
步骤 3a,连接 PWMDAC 模块的输入。(在mainISR中断函数中)
// 连接 PWMDAC 模块的输入。
gDacData.value[0] = (*gDacData.ptrData[0]); //
gDacData.value[1] = (*gDacData.ptrData[1]); //
gDacData.value[2] = (*gDacData.ptrData[2]); //
gDacData.value[3] = (*gDacData.ptrData[3]); //
HAL_writeDacData(halHandle,&gDacData);
在lab01b中,我们将项⽬相关的变量连接到PWMDAC模块;BOOSTXL-DRV8305EVM套件 + F28069M ControlCard 组合的输出波形DAC 如图所示:
Ch1‑> PWMDAC1:B 相 SVGEN 输出
Ch2‑> PWMDAC2:A 相 SVGEN 输出
按照步骤 2b 监控 ADC 采样的 Angel_gen、电流和电压。
步骤 2b,在 proj_lab01b.c 和 hal.c 中为每个 PWMDAC 通道设置正确的偏移和增益
// 设置DAC参数
gDacData.ptrData[0] = &angle_gen.Angle_pu;
gDacData.ptrData[2] = &gAdcData.I.value[0];
gDacData.ptrData[1] = &gPwmData.Tabc.value[0];
gDacData.ptrData[3] = &gAdcData.V.value[0];
HAL_setDacParameters(halHandle, &gDacData);
// 设置每个通道的PWMDAC参数,保证输出波形
void HAL_setDacParameters(HAL_Handle handle, HAL_DacData_t *pDacData)
{
HAL_Obj *obj = (HAL_Obj *)handle;
pDacData->PeriodMax = PWMDAC_getPeriod(obj->pwmDacHandle[PWMDAC_Number_1]);
pDacData->offset[0] = _IQ(0.0);
pDacData->offset[1] = _IQ(0.5);
pDacData->offset[2] = _IQ(0.0);
pDacData->offset[3] = _IQ(0.0);
pDacData->gain[0] = _IQ(1.0);
pDacData->gain[1] = _IQ(1.0);
pDacData->gain[2] = _IQ(1.0);
pDacData->gain[3] = _IQ(1.0);
return;
} // end of HAL_setDacParameters() function
注意: pDacData->offset[0] = _IQ(0.0); 已做出修改
如上,我们将相关变量连接到 PWMDAC 模块,并监控输出波形,如图所示
Ch1‑>PWMDAC1:angel_gen模块的角度输出
Ch2‑> PWMDAC3:A 相 PWM 输出
(三)DATALOG观察波形
数据记录模块可用于存储数据并绘制图表。使用 CCS 中的图形工具,可以实现虚拟示波器来监控支持数据记录的项⽬的输入/输出波形。
设置和使用图形窗口
按照以下步骤以及图所示菜单中的说明设置图形窗口
步骤 1. 在 CCS 菜单中单击Tools->Graph->Dual time。单击“导入”按钮,然后从
“…\sw\solutions\instaspin_foc\src\proj_lab01b_d1&d2_1.graphProp”
中选择适当的single or dual time文件。
步骤2. 在CCS 菜单中单击Tools->Graph->Single time。单击“导入”按钮,然后从
“…\sw\solutions\instaspin_foc\src\proj_lab01b_d3_1.graphProp”
中选择适当的single or dual time文件。
请注意,下图中的Auto Scale (GraphA)和Auto Scale (GraphB)值设置为 false。这使得可以选择 GraphA 和 GraphB 的最大 Y 值和最小 Y 值。然后选择确定。图表将导入 CCS。在工作区中按照您喜欢的方式排列窗口。
使用图表时,有多种更新窗口的方法。必须为每个Graph A 和 B 选择这些。
按此按钮可使用写入数据数组的当前值刷新当前图形窗口。每次收到新数据时都需要按下此按钮以显示新图表。
每次数据数组收到新数据时,按下此按钮即可启用自动图形更新。
每次停止调试会话时刷新图表。
重置当前图形窗口以自动适应数据数组的新比例。
步骤 3a。连接数据记录模块的输入; SVGEN 输出的数据记录图如图 7 所示
// 连接数据记录模块的输入
datalog.iptr[0] = &gPwmData.Tabc.value[0]; // datalogBuff[0]
datalog.iptr[1] = &gPwmData.Tabc.value[1]; // datalogBuff[1]
datalog.iptr[2] = &gPwmData.Tabc.value[2]; // datalogBuff[2]
datalog.Flag_EnableLogData = true;
datalog.Flag_EnableLogOneShot = false;
步骤 3b。 连接数据记录模块的输入;查看 ADC 角度和采样电流/电压的数据记录图,如图 9 所示。
datalog.iptr[0] = &angle_gen.Angle_pu; // datalogBuff[0]
datalog.iptr[1] = &gAdcData.I.value[0]; // datalogBuff[1]
datalog.iptr[2] = &gAdcData.V.value[0]; // datalogBuff[2]
(四)程序介绍
项⽬文件
angle_gen.c | 定义角度生成器模块例程 |
---|---|
vs_freq.c | 定义伏特/赫兹配置文件模块例程 |
头文件
Angle_gen.h | 包含角度生成器模块例程的公共接口 |
---|---|
vs_freq.h | 包含伏特/赫兹模块例程的公共接口 |
hal.h | 设备设置和外围驱动程序。包含 HAL 对象。 |
ctrl.h | 包含与 CTRL 对象相关的各种函数的公共接口、对象和函数定义。 |
ctrl_obj.h | 定义 CTRL 对象的结构 |
user.h | 包含 CTRL、HAL 和 EST 模块的电机控制初始化数据 |
全局对象
CTRL_Handle | ctrlHandle | 控制器对象 (CTRL) 的句柄。控制器对象实现所有 FOC 算法并调用 FAST 观察器函数。 |
---|---|---|
MOTOR_Vars_t | gMotorVars | 实施 InstaSPIN 不需要,但在项⽬中需要此结构。包含所有要打开的标志和变量,调整 InstaSPIN。 |
ANGLE_GEN_Handle | angle_genHandle | 角度生成器结构的句柄。 |
ANGLE_GEN_Obj | angle_gen | 角度生成器结构的对象。 |
VS_FREQ_Handle | vs_freqHandle | Volts/Hertz Profile 结构体的句柄 |
VS_FREQ_Obj | vs_freq | Volts/Hertz Profile 结构体的对象 |
mainISR程序框图
mainISR调用运行 FOC 的非常关键的、与时间相关的函数。 Lab01b 的框图如图10所示。
(五)具体步骤
头文件的修改
- 打开 user_j1.h
- 对电机参数做出如下修改:
#define USER_MOTOR_FREQ_LOW (10.0) // Hz - suggested to set to 10% of rated motor frequency
#define USER_MOTOR_FREQ_HIGH (100.0) // Hz - suggested to set to 100% of rated motor frequency
#define USER_MOTOR_FREQ_MAX (100.0) // Hz - suggested to set to 120% of rated motor frequency
#define USER_MOTOR_VOLT_MIN (3.0) // Volt - suggested to set to 15% of rated motor voltage
#define USER_MOTOR_VOLT_MAX (18.0) // Volt - suggested to set to 100% of rated motor voltage
将变量添加到监视窗口
- 从调试器菜单“View‑>Scripting Console”中选择脚本工具。
- 脚本控制台窗口将出现在调试器中的某个位置。
- 单击脚本工具右上角的图标
打开脚本。
- 选择文件“sw\solutions\instaspin_foc\src\proj_lab01b.js”。
- 现在,适当的电机变量会自动填充到观察窗口中,如下所示
- 变量应如图 12 所示
- 注意数字格式。
- 例如,如果“gMotorVars.Flag_enableSys”显示为字符,则鼠标右键单击它并选择“Number Format -> Decimal”
- 对于“Q‑Value(24)”格式,右键单击该值后选择“Q-Values->Q-Value(24)"
步骤 1. 断开电机,打开 EVM 套件电源,启动lab,并按照 PWMDAC 和 DATALOG 模块指令监控来自 SVGEN 的一些信号。
-
启用实时调试器
-
单击运行按钮
-
在监视窗口上启用连续刷新
-
将变量“gMotorVars.Flag_enableSys”设置为 1
-
将变量“gMotorVars.Flag_Run_Identify”设置为 1
步骤 2. 关闭 EVM 套件的电源,然后按照 PWMDAC 和 DATALOG 模块指令更改配置设置以监控来自 ANGEL_GEN 和 ADC 的一些信号。
- 将变量“gMotorVars.Flag_Run_Identify”设置为 0 以关闭电机的 PWM。
- 关闭实时控制并停止调试器。
- 关闭 EVM 套件电源
步骤 3. 连接电机,打开 EVM 套件电源
- 再次启用实时调试器
- 将变量“gMotorVars.Flag_enableSys”和“gMotorVars.Flag_Run_Identify”设置为等于 1
- 将变量“gMotorVars.SpeedRef_krpm”设置为不同的值,以确保电机仍然运行。
步骤 4. 如果完成实验,请参阅上面的步骤 2 关闭 EVM 套件的电源。