DSP-Board/software/ADC_PWM_SPI_SLAVE.c
Simon 2dd2cef347 Software c2000 hinzugefügt
4fach Multilevel-PWM mit i2S Empfang
2025-04-05 10:30:58 +02:00

856 lines
22 KiB
C

//#############################################################################
//
// File: Example_F2802xAdc_TempSensorConv.c
//
// Title: Example ADC Temperature Sensor Conversion to Degrees
// Celsius/Degrees Kelvin
//
//! \addtogroup example_list
//! <h1>ADC Temperature Sensor Conversion</h1>
//!
//! This program shows how to convert a raw ADC temperature sensor reading
//! into deg. C or deg. K.
//!
//! Watch Variables:
//! - temp
//! - degC
//! - degK
//
//#############################################################################
// $TI Release: F2802x Support Library v3.02.00.00 $
// $Release Date: Thu Oct 18 15:45:37 CDT 2018 $
// $Copyright:
// Copyright (C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//#############################################################################
//
// Included Files
//
#include "DSP28x_Project.h" // DSP28x Headerfile
#include "common/include/adc.h"
#include "common/include/clk.h"
#include "common/include/flash.h"
#include "common/include/gpio.h"
#include "common/include/pie.h"
#include "common/include/pll.h"
#include "common/include/wdog.h"
#include "common/include/pwm.h"
#include "common/include/spi.h"
#include "math.h"
//
// Defines
//
// Length of the word being sent
//
#define CHAR_LENGTH SPI_CharLength_16_Bits
#define CHAR_MAX (0xFFFF >> (SPI_CharLength_16_Bits - CHAR_LENGTH))
//
// Micro-seconds to wait for ADC conversion. Longer than necessary.
//
#define CONV_WAIT 1L
//
// Function Prototypes
//
void InitEPwm1(void);
void InitEPwm2(void);
void InitEPwm3(void);
void InitEPwm4(void);
void InitEPwm1Example(void);
void InitEPwm2Example(void);
void InitEPwm3Example(void);
void InitEPwm4Example(void);
__interrupt void epwm1_isr(void);
__interrupt void epwm2_isr(void);
__interrupt void epwm3_isr(void);
__interrupt void epwm4_isr(void);
//__interrupt void spiTxFifoIsr(void);
//__interrupt void spiRxFifoIsr(void);
void spi_xmit(uint16_t a);
void spi_fifo_init(void);
void spi_init(void);
void error(void);
//
// Defines for the Maximum Dead Band values
//
#define EPWM1_MAX_DB 0x03FF
#define EPWM2_MAX_DB 0x03FF
#define EPWM3_MAX_DB 0x03FF
#define start1 0
#define stop1 start1+EPWM1_MAX_DB
#define start2 0x0400
#define stop2 0x0400+EPWM1_MAX_DB
#define start3 0x0800
#define stop3 0x0800+EPWM1_MAX_DB
#define EPWM1_MIN_DB 0
#define EPWM2_MIN_DB 0
#define EPWM3_MIN_DB 0
//
// Defines to keep track of which way the Dead Band is moving
//
#define DB_UP 1
#define DB_DOWN 0
CLK_Handle myClk;
FLASH_Handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;
PWM_Handle myPwm1, myPwm2, myPwm3;
//
// Globals
//
int16_t pwm = 0x1ff;
int16_t temp; //raw temperature sensor reading
int16_t degC; //temperature in deg. C
int16_t degK; //temperature in deg. K
static uint16_t ADC0 = 0;
static uint16_t ADC1 = 0;
uint32_t EPwm1TimerIntCount;
uint32_t EPwm2TimerIntCount;
uint32_t EPwm3TimerIntCount;
uint16_t EPwm1_DB_Direction;
uint16_t EPwm2_DB_Direction;
uint16_t EPwm3_DB_Direction;
uint16_t sdata[2]; // Send data buffer
uint16_t rdata[2]; // Receive data buffer
uint16_t rdata_point;
static int16_t a = 0;
static int16_t c = 0;
#define PI 3.14159265358979323846
CLK_Handle myClk;
FLASH_Handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;
SPI_Handle mySpi;
//
// Main
//
void main()
{
uint16_t i;
uint16_t m;
ADC_Handle myAdc;
CPU_Handle myCpu;
PLL_Handle myPll;
WDOG_Handle myWDog;
//
// Initialize all the handles needed for this application
//
myAdc = ADC_init((void *)ADC_BASE_ADDR, sizeof(ADC_Obj));
myClk = CLK_init((void *)CLK_BASE_ADDR, sizeof(CLK_Obj));
myCpu = CPU_init((void *)NULL, sizeof(CPU_Obj));
myFlash = FLASH_init((void *)FLASH_BASE_ADDR, sizeof(FLASH_Obj));
myGpio = GPIO_init((void *)GPIO_BASE_ADDR, sizeof(GPIO_Obj));
myPie = PIE_init((void *)PIE_BASE_ADDR, sizeof(PIE_Obj));
myPll = PLL_init((void *)PLL_BASE_ADDR, sizeof(PLL_Obj));
myPwm1 = PWM_init((void *)PWM_ePWM1_BASE_ADDR, sizeof(PWM_Obj));
myPwm2 = PWM_init((void *)PWM_ePWM2_BASE_ADDR, sizeof(PWM_Obj));
myPwm3 = PWM_init((void *)PWM_ePWM3_BASE_ADDR, sizeof(PWM_Obj));
mySpi = SPI_init((void *)SPIA_BASE_ADDR, sizeof(SPI_Obj));
myWDog = WDOG_init((void *)WDOG_BASE_ADDR, sizeof(WDOG_Obj));
//
// Perform basic system initialization
//
WDOG_disable(myWDog);
CLK_enableAdcClock(myClk);
(*Device_cal)();
//
// Enable SPI-A Clock
//
CLK_enableSpiaClock(myClk);
//
// Select the internal oscillator 1 as the clock source
//
CLK_setOscSrc(myClk, CLK_OscSrc_Internal);
//
// Setup the PLL for x10 /2 which will yield 50Mhz = 10Mhz * 10 / 2
//
PLL_setup(myPll, PLL_Multiplier_10, PLL_DivideSelect_ClkIn_by_2);
//
// Disable the PIE and all interrupts
//
PIE_disable(myPie);
PIE_disableAllInts(myPie);
CPU_disableGlobalInts(myCpu);
CPU_clearIntFlags(myCpu);
//
// If running from flash copy RAM only functions to RAM
//
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif
//
// Initialize GPIO
//
GPIO_setPullUp(myGpio, GPIO_Number_0, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_1, GPIO_PullUp_Disable);
GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_EPWM1A);
GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_EPWM1B);
GPIO_setPullUp(myGpio, GPIO_Number_2, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_3, GPIO_PullUp_Disable);
GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_EPWM2A);
GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_EPWM2B);
GPIO_setPullUp(myGpio, GPIO_Number_4, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_5, GPIO_PullUp_Disable);
GPIO_setMode(myGpio, GPIO_Number_4, GPIO_4_Mode_EPWM3A);
GPIO_setMode(myGpio, GPIO_Number_5, GPIO_5_Mode_EPWM3B);
GPIO_setPullUp(myGpio, GPIO_Number_6, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_7, GPIO_PullUp_Disable);
GPIO_setMode(myGpio, GPIO_Number_6, GPIO_6_Mode_EPWM4A);
GPIO_setMode(myGpio, GPIO_Number_7, GPIO_7_Mode_EPWM4B);
//
// Initialize GPIO SPI
//
GPIO_setPullUp(myGpio, GPIO_Number_16, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_17, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_18, GPIO_PullUp_Enable);
GPIO_setPullUp(myGpio, GPIO_Number_19, GPIO_PullUp_Enable);
GPIO_setQualification(myGpio, GPIO_Number_16, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_17, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_18, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_19, GPIO_Qual_ASync);
GPIO_setMode(myGpio, GPIO_Number_16, GPIO_16_Mode_SPISIMOA);
GPIO_setMode(myGpio, GPIO_Number_17, GPIO_17_Mode_SPISOMIA);
GPIO_setMode(myGpio, GPIO_Number_18, GPIO_18_Mode_SPICLKA);
GPIO_setMode(myGpio, GPIO_Number_19, GPIO_19_Mode_SPISTEA_NOT);
// EPWM sync
GPIO_setMode(myGpio, GPIO_Number_33, GPIO_33_Mode_EPWMSYNCO);
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
// Enable XCLOCKOUT to allow monitoring of oscillator 1
//
// GPIO_setMode(myGpio, GPIO_Number_18, GPIO_18_Mode_XCLKOUT);
CLK_setClkOutPreScaler(myClk, CLK_ClkOutPreScaler_SysClkOut_by_1);
//
// Setup a debug vector table and enable the PIE
//
PIE_setDebugIntVectorTable(myPie);
PIE_enable(myPie);
//
// Register interrupt handlers in the PIE vector table
//
PIE_registerPieIntHandler(myPie, PIE_GroupNumber_3, PIE_SubGroupNumber_1,
(intVec_t)&epwm1_isr);
PIE_registerPieIntHandler(myPie, PIE_GroupNumber_3, PIE_SubGroupNumber_2,
(intVec_t)&epwm2_isr);
PIE_registerPieIntHandler(myPie, PIE_GroupNumber_3, PIE_SubGroupNumber_3,
(intVec_t)&epwm3_isr);
// PIE_registerPieIntHandler(myPie, PIE_GroupNumber_6, PIE_SubGroupNumber_1,
// (intVec_t)&spiRxFifoIsr);
// PIE_registerPieIntHandler(myPie, PIE_GroupNumber_6, PIE_SubGroupNumber_2,
// (intVec_t)&spiTxFifoIsr);
spi_init(); // Initialize SPI
spi_fifo_init(); // Initialize the SPI FIFOs
//
// Initialize the send data buffer
//
for(i=0; i<2; i++)
{
sdata[i] = i;
}
rdata_point = 0;
CLK_disableTbClockSync(myClk);
InitEPwm1();
InitEPwm2();
InitEPwm3();
CLK_enableTbClockSync(myClk);
//
// Initialize counters
//
EPwm1TimerIntCount = 0;
EPwm2TimerIntCount = 0;
EPwm3TimerIntCount = 0;
//
// Enable CPU INT3 which is connected to EPWM1-3 INT
//
CPU_enableInt(myCpu, CPU_IntNumber_3);
//
// Enable EPWM INTn in the PIE: Group 3 interrupt 1-3
//
PIE_enablePwmInt(myPie, PWM_Number_1);
PIE_enablePwmInt(myPie, PWM_Number_2);
PIE_enablePwmInt(myPie, PWM_Number_3);
// PIE_enablePwmInt(myPie, PWM_Number_4);
// PIE_enableInt(myPie, PIE_GroupNumber_6, PIE_InterruptSource_SPIARX);
// PIE_enableInt(myPie, PIE_GroupNumber_6, PIE_InterruptSource_SPIATX);
// CPU_enableInt(myCpu, CPU_IntNumber_6);
//
// Initialize the ADC
//
ADC_enableBandGap(myAdc);
ADC_enableRefBuffers(myAdc);
ADC_powerUp(myAdc);
ADC_enable(myAdc);
ADC_setVoltRefSrc(myAdc, ADC_VoltageRefSrc_Int);
//
// Connect channel A5 internally to the temperature sensor
//
ADC_enableTempSensor(myAdc);
//
// Set SOC0 channel select to ADCINA5
//
ADC_setSocChanNumber (myAdc, ADC_SocNumber_0, ADC_SocChanNumber_A1);
//
// Set SOC1 channel select to ADCINA5
//
ADC_setSocChanNumber (myAdc, ADC_SocNumber_1, ADC_SocChanNumber_A1);
//
// Set SOC0 acquisition period to 37 ADCCLK
//
ADC_setSocSampleWindow(myAdc, ADC_SocNumber_0,
ADC_SocSampleWindow_37_cycles);
//
// Set SOC1 acquisition period to 37 ADCCLK
//
ADC_setSocSampleWindow(myAdc, ADC_SocNumber_1,
ADC_SocSampleWindow_37_cycles);
//
// Connect ADCINT1 to EOC1
//
ADC_setIntSrc(myAdc, ADC_IntNumber_1, ADC_IntSrc_EOC1);
//
// Enable ADCINT1
//
ADC_enableInt(myAdc, ADC_IntNumber_1);
//
// Note: two channels have been connected to the temp sensor
// so that the first sample can be discarded to avoid the
// ADC first sample issue. See the device errata.
//
//
// Set the flash OTP wait-states to minimum. This is important
// for the performance of the temperature conversion function.
//
FLASH_setup(myFlash);
//
// Enable global Interrupts and higher priority real-time debug events
//
CPU_enableGlobalInts(myCpu);
CPU_enableDebugInt(myCpu);
//
// Main program loop - continually sample temperature
//
for(;;)
{
//
// Force start of conversion on SOC0 and SOC1
//
ADC_forceConversion(myAdc, ADC_SocNumber_0);
ADC_forceConversion(myAdc, ADC_SocNumber_1);
//
// Wait for end of conversion.
//
while(ADC_getIntStatus(myAdc, ADC_IntNumber_1) == 0)
{
}
ADC0 = ADC_readResult(myAdc, ADC_ResultNumber_0);
ADC1 = ADC_readResult(myAdc, ADC_ResultNumber_1);
//
// Clear ADCINT1
//
ADC_clearIntFlag(myAdc, ADC_IntNumber_1);
//
// Get temp sensor sample result from SOC1
//
temp = ADC_readResult(myAdc, ADC_ResultNumber_1);
//
// Convert the raw temperature sensor measurement into temperature
//
// degC = ADC_getTemperatureC(myAdc, temp);
// degK = ADC_getTemperatureK(myAdc, temp);
DELAY_US(10);
// DELAY_US(220);
uint16_t data = SPI_read(mySpi);
SPI_write(mySpi, data);
float b = (int) (data - 0x8000); //PWM setzen
// float b = (sin((float)PI*0.02*m))*2200;
// float b = (sin((float)PI*0.1*m))*2200;
a = (int16_t) b;
c = (int16_t) (b / 1000);
// m++;
}
}
//
// epwm1_isr -
//
__interrupt void
epwm1_isr(void)
{
switch (c) {
case 0:
if (a>0) {
PWM_setCmpA(myPwm1, a-start1);
PWM_setCmpB(myPwm1, 0);
}
else {
PWM_setCmpA(myPwm1, 0);
PWM_setCmpB(myPwm1, -a+start1);
}
PWM_setCmpA(myPwm2, 0);
PWM_setCmpB(myPwm2, 0);
PWM_setCmpA(myPwm3, 0);
PWM_setCmpB(myPwm3, 0);
break;
case 1:
PWM_setCmpA(myPwm1, stop1);
PWM_setCmpB(myPwm1, 0);
PWM_setCmpA(myPwm2, a-start2);
PWM_setCmpB(myPwm2, 0);
PWM_setCmpA(myPwm3, 0);
PWM_setCmpB(myPwm3, 0);
break;
case -1:
PWM_setCmpA(myPwm1, 0);
PWM_setCmpB(myPwm1, stop1);
PWM_setCmpA(myPwm2, 0);
PWM_setCmpB(myPwm2, -(a+start2));
PWM_setCmpA(myPwm3, 0);
PWM_setCmpB(myPwm3, 0);
break;
case 2:
PWM_setCmpA(myPwm1, stop1);
PWM_setCmpB(myPwm1, 0);
PWM_setCmpA(myPwm2, stop2);
PWM_setCmpB(myPwm2, 0);
PWM_setCmpA(myPwm3, a-start3);
PWM_setCmpB(myPwm3, 0);
break;
case -2:
PWM_setCmpA(myPwm1, 0);
PWM_setCmpB(myPwm1, stop1);
PWM_setCmpA(myPwm2, 0);
PWM_setCmpB(myPwm2, stop2);
PWM_setCmpA(myPwm3, 0);
PWM_setCmpB(myPwm3, -(a+start3));
break;
case 3:
PWM_setCmpA(myPwm1, stop1);
PWM_setCmpB(myPwm1, 0);
PWM_setCmpA(myPwm2, stop2);
PWM_setCmpB(myPwm2, 0);
PWM_setCmpA(myPwm3, stop3);
PWM_setCmpB(myPwm3, 0);
break;
case -3:
PWM_setCmpA(myPwm1, 0);
PWM_setCmpB(myPwm1, stop1);
PWM_setCmpA(myPwm2, 0);
PWM_setCmpB(myPwm2, stop2);
PWM_setCmpA(myPwm3, 0);
PWM_setCmpB(myPwm3, stop3);
break;
default:
//sollte nur bei clipping auftreten
break;
}
EPwm1TimerIntCount++;
PWM_clearIntFlag(myPwm1);
PIE_clearInt(myPie, PIE_GroupNumber_3);
}
//
// epwm2_isr -
//
__interrupt void
epwm2_isr(void)
{
EPwm2TimerIntCount++;
PWM_clearIntFlag(myPwm2);
PIE_clearInt(myPie, PIE_GroupNumber_3);
}
//
// epwm3_isr -
//
__interrupt void
epwm3_isr(void)
{
EPwm3TimerIntCount++;
PWM_clearIntFlag(myPwm3);
PIE_clearInt(myPie, PIE_GroupNumber_3);
}
void
InitEPwm1()
{
CLK_enablePwmClock(myClk, PWM_Number_1);
PWM_setPeriod(myPwm1, EPWM1_MAX_DB); // Set timer period
PWM_setPhase(myPwm1, 0x0000); // Phase is 0
PWM_setCount(myPwm1, 0x0000); // Clear counter
//
// Setup TBCLK
//
PWM_setCounterMode(myPwm1, PWM_CounterMode_UpDown); // Count up
PWM_disableCounterLoad(myPwm1); // Disable phase loading
//
// Clock ratio to SYSCLKOUT
//
// PWM_setHighSpeedClkDiv(myPwm1, PWM_HspClkDiv_by_4);
// PWM_setClkDiv(myPwm1, PWM_ClkDiv_by_4);
PWM_setHighSpeedClkDiv(myPwm1, PWM_HspClkDiv_by_1);
PWM_setClkDiv(myPwm1, PWM_ClkDiv_by_1);
//
// Load registers every ZERO
//
PWM_setShadowMode_CmpA(myPwm1, PWM_ShadowMode_Shadow);
PWM_setShadowMode_CmpB(myPwm1, PWM_ShadowMode_Shadow);
PWM_setLoadMode_CmpA(myPwm1, PWM_LoadMode_Zero);
PWM_setLoadMode_CmpB(myPwm1, PWM_LoadMode_Zero);
//
// Setup compare
//
PWM_setCmpA(myPwm1, 3000);
PWM_setCmpB(myPwm1, 3000);
//
// Set actions
//
PWM_setActionQual_CntUp_CmpA_PwmA(myPwm1, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpA_PwmA(myPwm1, PWM_ActionQual_Set);
PWM_setActionQual_CntUp_CmpB_PwmB(myPwm1, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpB_PwmB(myPwm1, PWM_ActionQual_Set);
//
// Active Low PWMs - Setup Deadband
//
PWM_setDeadBandOutputMode(myPwm1,
PWM_DeadBandOutputMode_Bypass);
EPwm1_DB_Direction = DB_UP;
//
// Select INT on Zero event
//
PWM_setIntMode(myPwm1, PWM_IntMode_CounterEqualZero);
PWM_enableInt(myPwm1); // Enable INT
//
// Generate INT on 3rd event
//
// PWM_setIntPeriod(myPwm1, PWM_IntPeriod_ThirdEvent);
PWM_setIntPeriod(myPwm1, PWM_IntPeriod_FirstEvent);
}
void
InitEPwm2()
{
CLK_enablePwmClock(myClk, PWM_Number_2);
PWM_setPeriod(myPwm2, EPWM2_MAX_DB); // Set timer period
PWM_setPhase(myPwm2, 0x0000); // Phase is 0
PWM_setCount(myPwm2, 0x0000); // Clear counter
//
// Setup TBCLK
//
PWM_setCounterMode(myPwm2, PWM_CounterMode_UpDown); // Count up
PWM_disableCounterLoad(myPwm2); // Disable phase loading
//
// Clock ratio to SYSCLKOUT
//
PWM_setHighSpeedClkDiv(myPwm2, PWM_HspClkDiv_by_1);
PWM_setClkDiv(myPwm2, PWM_ClkDiv_by_1);
//
// Load registers every ZERO
//
PWM_setShadowMode_CmpA(myPwm2, PWM_ShadowMode_Shadow);
PWM_setShadowMode_CmpB(myPwm2, PWM_ShadowMode_Shadow);
PWM_setLoadMode_CmpA(myPwm2, PWM_LoadMode_Zero);
PWM_setLoadMode_CmpB(myPwm2, PWM_LoadMode_Zero);
//
// Setup compare
//
PWM_setCmpA(myPwm2, 3000);
PWM_setCmpB(myPwm2, 3000);
//
// Set actions
//
PWM_setActionQual_CntUp_CmpA_PwmA(myPwm2, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpA_PwmA(myPwm2, PWM_ActionQual_Set);
PWM_setActionQual_CntUp_CmpB_PwmB(myPwm2, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpB_PwmB(myPwm2, PWM_ActionQual_Set);
//
// Active Low PWMs - Setup Deadband
//
PWM_setDeadBandOutputMode(myPwm2,
PWM_DeadBandOutputMode_Bypass);
EPwm2_DB_Direction = DB_UP;
//
// Select INT on Zero event
//
PWM_setIntMode(myPwm2, PWM_IntMode_CounterEqualZero);
PWM_enableInt(myPwm2); // Enable INT
//
// Generate INT on 3rd event
//
PWM_setIntPeriod(myPwm2, PWM_IntPeriod_FirstEvent);
}
void
InitEPwm3()
{
CLK_enablePwmClock(myClk, PWM_Number_3);
PWM_setPeriod(myPwm3, EPWM3_MAX_DB); // Set timer period
PWM_setPhase(myPwm3, 0x0000); // Phase is 0
PWM_setCount(myPwm3, 0x0000); // Clear counter
//
// Setup TBCLK
//
PWM_setCounterMode(myPwm3, PWM_CounterMode_UpDown); // Count up
PWM_disableCounterLoad(myPwm3); // Disable phase loading
//
// Clock ratio to SYSCLKOUT
//
PWM_setHighSpeedClkDiv(myPwm3, PWM_HspClkDiv_by_1);
PWM_setClkDiv(myPwm3, PWM_ClkDiv_by_1);
//
// Load registers every ZERO
//
PWM_setShadowMode_CmpA(myPwm3, PWM_ShadowMode_Shadow);
PWM_setShadowMode_CmpB(myPwm3, PWM_ShadowMode_Shadow);
PWM_setLoadMode_CmpA(myPwm3, PWM_LoadMode_Zero);
PWM_setLoadMode_CmpB(myPwm3, PWM_LoadMode_Zero);
//
// Setup compare
//
PWM_setCmpA(myPwm3, 3000);
//
// Set actions
//
PWM_setActionQual_CntUp_CmpA_PwmA(myPwm3, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpA_PwmA(myPwm3, PWM_ActionQual_Set);
PWM_setActionQual_CntUp_CmpB_PwmB(myPwm3, PWM_ActionQual_Clear);
PWM_setActionQual_CntDown_CmpB_PwmB(myPwm3, PWM_ActionQual_Set);
//
//
// Active Low PWMs - Setup Deadband
//
PWM_setDeadBandOutputMode(myPwm3,
PWM_DeadBandOutputMode_Bypass);
EPwm3_DB_Direction = DB_UP;
//
// Select INT on Zero event
//
PWM_setIntMode(myPwm3, PWM_IntMode_CounterEqualZero);
PWM_enableInt(myPwm3); // Enable INT
//
// Generate INT on 3rd event
//
PWM_setIntPeriod(myPwm3, PWM_IntPeriod_ThirdEvent);
}
//
// delay_loop - Some Useful local functions
//
void
delay_loop()
{
long i;
for (i = 0; i < 1000000; i++)
{
}
return;
}
//
// error -
//
void
error(void)
{
__asm(" ESTOP0"); //Test failed!! Stop!
for (;;)
{
__asm(" NOP");
}
}
//
// spi_init -
//
void
spi_init()
{
CLK_enableSpiaClock(myClk);
//
// Reset on, rising edge, 16-bit char bits
//
SPI_setCharLength(mySpi, SPI_CharLength_16_Bits);
//
// Enable master mode, normal phase, enable talk, and SPI int disabled.
//
SPI_setMode(mySpi, SPI_Mode_Slave);
SPI_enableTx(mySpi);
SPI_setBaudRate(mySpi, SPI_BaudRate_1_MBaud);
//
// Relinquish SPI from Reset
//
SPI_enableLoopBack(mySpi);
SPI_enable(mySpi);
//
// Set so breakpoints don't disturb xmission
//
SPI_setPriority(mySpi, SPI_Priority_FreeRun);
return;
}
//
// spi_fifo_init -
//
void
spi_fifo_init()
{
//
// Initialize SPI FIFO registers
//
SPI_enableChannels(mySpi);
SPI_enableFifoEnh(mySpi);
SPI_resetTxFifo(mySpi);
SPI_clearTxFifoInt(mySpi);
SPI_resetRxFifo(mySpi);
SPI_clearRxFifoInt(mySpi);
SPI_setRxFifoIntLevel(mySpi, SPI_FifoLevel_4_Words);
return;
}
//
// End of File
//