This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Compiler/TMS320F28027: Pass Adc Value to PWM for change of duty cycle

Part Number: TMS320F28027

Tool/software: TI C/C++ Compiler

Dear Sir,

Please tell how to pass adc output to pwm function InitEPwm2Example(Volt) for changing of duty ratio.

My adc and epwm2 is working fine separately. I'm not able to return value from function

interrupt void adc_isr(void) even if it changed to interrupt float adc_isr(void). return value can't be passed to main function. Also, If I insert  InitEPwm2Example(Volt) in interrupt void adc_isr(void) that also does not work. 

// TI File $Revision: /main/4 $

//   PWM+ADC

//   $End_Boot_Table

//

//###########################################################################

 

#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

interrupt void adc_isr(void);

void Adc_Config(void);//where defined?

// Global variables used in this example:

Uint16 LoopCount;

Uint16 ConversionCount;

Uint16 Voltage1[10];

Uint16 Voltage2[10];

float Volt;

 

// Prototype statements for functions found within this file.

 

interrupt void epwm1_tzint_isr(void);

interrupt void epwm2_tzint_isr(void);

 

 

// Global variables used in this example

Uint32 EPwm1TZIntCount;

Uint32 EPwm2TZIntCount;

 

 

main()

{

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the DSP2802x_SysCtrl.c file.

   InitSysCtrl();

 

// Step 2. Initalize GPIO:

// This example function is found in the DSP2802x_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

// InitGpio(); // Skipped for this example

 

// For this case just init GPIO pins for ePWM1, ePWM2, and TZ pins

// InitEPwm1Gpio();

   InitEPwm2Gpio();

   InitTzGpio();

 

// Step 3. Clear all interrupts and initialize PIE vector table:

// Disable CPU interrupts

   DINT;

 

// Initialize the PIE control registers to their default state.

// The default state is all PIE interrupts disabled and flags

// are cleared.

// This function is found in the DSP2802x_PieCtrl.c file.

   InitPieCtrl();

 

// Disable CPU interrupts and clear all CPU interrupt flags:

   IER = 0x0000;

   IFR = 0x0000;

 

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the interrupt

// is not used in this example. This is useful for debug purposes.

// The shell ISR routines are found in DSP2802x_DefaultIsr.c.

// This function is found in DSP2802x_PieVect.c.

   InitPieVectTable();

 

// Interrupts that are used in this example are re-mapped to

// ISR functions found within this file.

   EALLOW; // This is needed to write to EALLOW protected registers

// PieVectTable.EPWM1_TZINT = &epwm1_tzint_isr;

   PieVectTable.EPWM2_TZINT = &epwm2_tzint_isr;

   PieVectTable.ADCINT1 = &adc_isr;

   EDIS;   // This is needed to disable write to EALLOW protected registers

 

// Step 4. Initialize all the Device Peripherals:

// This function is found in DSP2802x_InitPeripherals.c

// InitPeripherals(); // Not required for this example

   InitAdc(); // For this example, init the ADC

 

   // Enable ADCINT1 in PIE

     PieCtrlRegs.PIEIER1.bit.INTx1 = 1;      // Enable INT 1.1 in the PIE

     IER |= M_INT1;                                         // Enable CPU Interrupt 1

     EINT;                                                 // Enable Global interrupt INTM

     ERTM;                                                 // Enable Global realtime interrupt DBGM

 

     LoopCount = 0;

     ConversionCount = 0;

 

 

 

   EALLOW;

   AdcRegs.ADCCTL1.bit.INTPULSEPOS      = 1;   //ADCINT1 trips after AdcResults latch

       AdcRegs.INTSEL1N2.bit.INT1E     = 1;   //Enabled ADCINT1

       AdcRegs.INTSEL1N2.bit.INT1CONT = 0;   //Disable ADCINT1 Continuous mode

       AdcRegs.INTSEL1N2.bit.INT1SEL    = 1;   //setup EOC1 to trigger ADCINT1 to fire

       AdcRegs.ADCSOC0CTL.bit.CHSEL     = 4;   //set SOC0 channel select to ADCINA4

       AdcRegs.ADCSOC1CTL.bit.CHSEL     = 2;   //set SOC1 channel select to ADCINA2

       AdcRegs.ADCSOC0CTL.bit.TRIGSEL   = 5;   //set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1

       AdcRegs.ADCSOC1CTL.bit.TRIGSEL   = 5;   //set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1

       AdcRegs.ADCSOC0CTL.bit.ACQPS     = 6;   //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

       AdcRegs.ADCSOC1CTL.bit.ACQPS     = 6;   //set SOC1 S/H Window to 7 ADC Clock Cycles,

 

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

   EDIS;

   // Assumes ePWM1 clock is already enabled in InitSysCtrl();

     EPwm1Regs.ETSEL.bit.SOCAEN = 1;          // Enable SOC on A group

     EPwm1Regs.ETSEL.bit.SOCASEL       = 4;          // Select SOC from from CPMA on upcount

     EPwm1Regs.ETPS.bit.SOCAPRD        = 1;          // Generate pulse on 1st event

     EPwm1Regs.CMPA.half.CMPA   = 0x0080;    // Set compare A value

     EPwm1Regs.TBPRD                          = 0xFFFF;    // Set period for ePWM1

     EPwm1Regs.TBCTL.bit.CTRMODE       = 0;          // count up and start

 

 

 

     // InitEPwm1Example();

   // Volt=Voltage1[ConversionCount]*3.3/4096;

     InitEPwm2Example(3.3);

 

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;

   EDIS;

 

// Step 5. User specific code, enable interrupts

// Initalize counters:

//   EPwm1TZIntCount = 0;

   EPwm2TZIntCount = 0;

 

// Enable CPU INT3 which is connected to EPWM1-3 INT:

   IER |= M_INT2;

 

// Enable EPWM INTn in the PIE: Group 2 interrupt 1-3

   PieCtrlRegs.PIEIER2.bit.INTx1 = 1;

   PieCtrlRegs.PIEIER2.bit.INTx2 = 1;

 

// Enable global Interrupts and higher priority real-time debug events:

   EINT;   // Enable Global interrupt INTM

   ERTM;   // Enable Global realtime interrupt DBGM

 

 

 

// Step 6. IDLE loop. Just sit and loop forever (optional):

   for(;;)

   {

       asm("         NOP");

   }

 

}

 

interrupt void epwm1_tzint_isr(void)

{

   EPwm1TZIntCount++;

 

// Leave these flags set so we only take this

// interrupt once

//

// EALLOW;

// EPwm1Regs.TZCLR.bit.OST = 1;

// EPwm1Regs.TZCLR.bit.INT = 1;

// EDIS;

 

   // Acknowledge this interrupt to receive more interrupts from group 2

   PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;

 

}

 

interrupt void epwm2_tzint_isr(void)

{

 

   EPwm2TZIntCount++;

 

// Clear the flags - we will continue to take

// this interrupt until the TZ pin goes high

//

   EALLOW;

   EPwm2Regs.TZCLR.bit.CBC = 1;

   EPwm2Regs.TZCLR.bit.INT = 1;

   EDIS;

 

   // Acknowledge this interrupt to receive more interrupts from group 2

   PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;

 

}

 

 

void InitEPwm1Example()

{

   // Enable TZ1 and TZ2 as one shot trip sources

   EALLOW;

   EPwm1Regs.TZSEL.bit.OSHT1 = 1;

   EPwm1Regs.TZSEL.bit.OSHT2 = 1;

 

   // What do we want the TZ1 and TZ2 to do?

   EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI;

   EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;

 

   // Enable TZ interrupt

   EPwm1Regs.TZEINT.bit.OST = 1;

   EDIS;

 

   EPwm1Regs.TBPRD = 6000;                         // Set timer period

   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0

   EPwm1Regs.TBCTR = 0x0000;                       // Clear counter

 

   // Setup TBCLK

   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up

   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;       // Disable phase loading

   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // Clock ratio to SYSCLKOUT

   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;

 

   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;   // Load registers every ZERO

   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

 

   // Setup compare

   EPwm1Regs.CMPA.half.CMPA = 3000;

 

   // Set actions

   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero

   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

 

 

   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;         // Set PWM1A on Zero

   EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;

 

}

 

 

void InitEPwm2Example(float x)

{

 

   // Enable TZ1 and TZ2 as one cycle-by-cycle trip sources

   EALLOW;

   EPwm2Regs.TZSEL.bit.CBC1 = 1;

   EPwm2Regs.TZSEL.bit.CBC2 = 1;

 

   // What do we want the TZ1 and TZ2 to do?

   EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_HI;

   EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;

 

   // Enable TZ interrupt

   EPwm2Regs.TZEINT.bit.CBC = 1;

   EDIS;

 

   EPwm2Regs.TBPRD = 6000;                       // Set timer period

   EPwm2Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0

   EPwm2Regs.TBCTR = 0x0000;                     // Clear counter

 

   // Setup TBCLK

   EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up

   EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;       // Disable phase loading

   EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // Clock ratio to SYSCLKOUT

   EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV4;         // Slow just to observe on the scope

 

   // Setup compare

   EPwm2Regs.CMPA.half.CMPA = 6000/x;

 

   // Set actions

   EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM2A on Zero

   EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;

 

 

   EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;           // Set PWM2A on Zero

   EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;

}

 

interrupt void adc_isr(void)

{

 

Voltage1[ConversionCount] = AdcResult.ADCRESULT0;

Voltage2[ConversionCount] = AdcResult.ADCRESULT1;

//Volt=Voltage1[ConversionCount]*3.3/4096;

// If 20 conversions have been logged, start over

if(ConversionCount == 9)

{

     ConversionCount = 0;

}

else ConversionCount++;

 

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       //Clear ADCINT1 flag reinitialize for next SOC

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

 

return;

}

 

 

 

//===========================================================================

// No more.

//===========================================================================