SPRUJ26A September 2021 – April 2024
The DAC128S module converts up to 8 software variables into a 12-bit integer value and transmits the data through SPI to the digital-to-analog converter (DAC) on the DAC128S085EVM as shown in Figure 3-27.
The DAC128S085EVM can be connected to the LaunchPad as shown in Figure 3-12 . Key connections of the DAC128S are shown in Figure 3-28.
LaunchPad Device | Hardware Changes Required |
---|---|
F28002x, F28003x | Jumper wire C2000 SPI_STE (SCS) pin JB-2 to SYNC pin JA-2 on the DAC128S085EVM, as shown in Figure 3-28. |
F280013x | (1) Device has only 1x
SPI module which is shared between Boosterpack site 1 and site 2.
This requires populating 0 ohm resistors on the LaunchPad to connect
the SPI signals to the Boosterpack site 2, which the DAC128S085EVM connects to. For the
specific resistor identifiers, see SPI Routing section in the
LAUNCHXL-F2800137 Schematic. (2) Jumper wire C2000 SPI_STE (SCS) pin to SYNC pin JA-2 on the DAC128S085EVM. The C2000 SPI_STE pin usage will depend on Inverter boosterpack being used:
|
Hardware changes required for DAC128S085EVM usage. In order to enable the DAC128S functionality, the predefined symbol DAC_128S_ENABLE must be added in the project properties as shown in Figure 3-19.
The code below shows the declaration of the DAC128S object. This code is located in the sys_main.c file.
DAC128S_Handle dac128sHandle; //!< the DAC128S interface handle
DAC128S_Obj dac128s; //!< the DAC128S interface object
The DAC128S085 has an eight channel, 12-bit digital-to-analog converter (DAC) , so the user can set the output number between 1 and 8 by changing the value of the DAC_EN_CH_NUM define in the dac128s085.h file. Although the sys_main.c file initializes 8 ptrData[] module inputs to 8 different variable addresses, the number of module inputs that will actually be transmitted and used during the execution of the code will be determined by the value of the DAC_EN_CH_NUM constant that is defined in the dac128s085.h file (shown below). Since most oscilloscopes only have four probes, using 4 out of the 8 DAC128S085 outputs is the default setting in this example. Using 4 outputs is the default setting in this example lab since most of the oscilloscope only has four probes. More outputs will occupy much more ISR time to convert and transmit the data, which can negatively effect the time to spend on other tasks, which is a factor that must be considered if the user desires to use more than 4 outputs.
#define DAC_EN_CH_NUM (4) // 1~8
The code below shows the initialization and setting up of the DAC128S object, handle and parameters. The code configures eight module inputs, ptrData[0] - ptrData[7], to point to the addresses of eight different software variables, but the number of module inputs that will actually be used is determined by the value of the DAC_EN_CH_NUM constant that is defined in the dac128s085.h file. The dac128s data points to different system variables depending on the build level and the control algorithm that is defined. This code can be found in the sys_main.c file.
// 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);
The below code shows the updating of the DAC128S board with the new data over SPI periodically during the execution of the motor1ctrlISR() interrupt. This code is located in the motor1_drive.c file. The number of the DAC outputs that will actually be updated will depend on the value of the DAC_EN_CH_NUM constant.
// Write the variables data value to DAC128S085
DAC128S_writeData(dac128sHandle);