ZHCUBZ5A September 2021 – April 2024
DAC128S 模块可将最多 8 个软件变量转换为 12 位整数值,并通过 SPI 将数据传输至 DAC128S085EVM 上的数模转换器 (DAC),如图 3-27 所示。
DAC128S085EVM 可以连接到 LaunchPad,如图 3-12 所示。图 3-28 展示了 DAC128S 的主要连接。
LaunchPad 器件 | 所需硬件更改 |
---|---|
F28002x、F28003x | 跳线 C2000 SPI_STE (SCS) 引脚 JB-2 至 DAC128S085EVM 上的 SYNC 引脚 JA-2,如图 3-28 所示。 |
F280013x | (1) 器件只有 1 个 SPI 模块,该模块在 BoosterPack 站点 1 和站点 2 之间共享。这需要在 LaunchPad 上填充 0Ω 电阻器来将 SPI 信号连接到 DAC128S085EVM 连接到的 BoosterPack 站点 2。有关特定的电阻器标识符,请参阅 LAUNCHXL-F2800137 原理图中的 SPI 路由 部分。 (2) 跳线将 C2000 SPI_STE (SCS) 引脚接至 DAC128S085EVM 上的 SYNC 引脚 JA-2。C2000 SPI_STE 引脚使用情况将取决于所使用的逆变器 BoosterPack:
|
使用 DAC128S085EVM 时需要进行硬件更改。要启用 DAC128S 功能,必须在工程属性中添加预定义的符号 DAC_128S_ENABLE,如图 3-19 所示。
下面的代码演示了 DAC128S 对象的声明。此代码位于 sys_main.c 文件中。
DAC128S_Handle dac128sHandle; //!< the DAC128S interface handle
DAC128S_Obj dac128s; //!< the DAC128S interface object
DAC128S085 具有 8 通道 12 位数模转换器 (DAC),因此用户可以通过更改 dac128s085.h 文件中 DAC_EN_CH_NUM define 的值将输出数设置为 1 到 8 之间的值。尽管 sys_main.c 文件将 8 个 ptrData[] 模块输入初始化为 8 个不同的变量地址,但在代码执行期间实际发送和使用的模块输入数量将由 dac128s085.h 文件中定义的 DAC_EN_CH_NUM 常量的值决定(如下所示)。大多数示波器只有四个探针,因此使用 8 个 DAC128S085 输出中的 4 个是本示例中的默认设置。使用 4 个输出是本示例实验中的默认设置,因为大多数示波器只有四个探针。更多的输出将占用更多的 ISR 时间来转换和传输数据,这可能会对用于其他任务的时间产生负面影响,如果用户希望使用不止 4 个输出,必须考虑这一因素。
#define DAC_EN_CH_NUM (4) // 1~8
下面的代码演示了 DAC128S 对象、句柄和参数的初始化和设置。代码会配置八个模块输入 ptrData[0] - ptrData[7],以指向八个不同软件变量的地址,但实际使用的模块输入数量由 dac128s085.h 文件中定义的 DAC_EN_CH_NUM 常量的值决定。dac128s 数据指向不同的系统变量,具体取决于构建级别和定义的控制算法。此代码可在 sys_main.c 文件中找到。
// initialize the DAC128S
dac128sHandle = DAC128S_init(&dac128s);
// setup SPI for DAC128S
DAC128S_setupSPI(dac128sHandle);
... ...
// Build_Level_2 or Level_3, verify the estimator
dac128s.ptrData[0] = &motorVars_M1.angleGen_rad; // CH_A
dac128s.ptrData[1] = &motorVars_M1.angleEST_rad; // CH_B
dac128s.ptrData[2] = &motorVars_M1.anglePLL_rad; // CH_C
dac128s.ptrData[3] = &motorVars_M1.adcData.I_A.value[0]; // CH_D
dac128s.ptrData[4] = &motorVars_M1.adcData.V_V.value[0]; // CH_E, N/A
dac128s.ptrData[5] = &motorVars_M1.adcData.I_A.value[1]; // CH_F, N/A
dac128s.ptrData[6] = &motorVars_M1.adcData.I_A.value[2]; // CH_G, N/A
dac128s.ptrData[7] = &motorVars_M1.adcData.V_V.value[1]; // CH_H, N/A
dac128s.gain[0] = 4096.0f / MATH_TWO_PI;
dac128s.gain[1] = 4096.0f / MATH_TWO_PI;
dac128s.gain[2] = 4096.0f / MATH_TWO_PI;
dac128s.gain[3] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
dac128s.gain[4] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V;
dac128s.gain[5] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
dac128s.gain[6] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_CURRENT_A;
dac128s.gain[7] = 2.0f * 4096.0f / USER_M1_ADC_FULL_SCALE_VOLTAGE_V;
dac128s.offset[0] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[1] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[2] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[3] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[4] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[5] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[6] = (uint16_t)(0.5f * 4096.0f);
dac128s.offset[7] = (uint16_t)(0.5f * 4096.0f);
下面的代码演示了在 motor1ctrlISR() 中断执行期间通过 SPI 定期使用新数据更新 DAC128S 电路板。此代码位于 motor1_drive.c 文件中。实际更新的 DAC 输出数量将取决于 DAC_EN_CH_NUM 常数的值。
// Write the variables data value to DAC128S085
DAC128S_writeData(dac128sHandle);