856 lines
22 KiB
C
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
|
|
//
|
|
|
|
|