You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CCS-COMM_BOARD/DSP28335/EPWM.cpp

769 lines
24 KiB
C++

/*
* EPWM.cpp
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "DSP28335/EPWM.h"
namespace DSP28335
{
//CONSTRUCTOR
EPWMConfigModificator::EPWMConfigModificator():
m_config(),
modify(true)
{}//CONSTRUCTOR
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_config(EPWMConfiguration& refconfig)
{
if(m_config.fpwm != refconfig.fpwm)
{
m_config.fpwm = refconfig.fpwm;
modify = true;
}//
if(m_config.pulse_sync != refconfig.pulse_sync)
{
m_config.pulse_sync = refconfig.pulse_sync;
modify = true;
}//
if(m_config.pulse_adc_soc != refconfig.pulse_adc_soc)
{
m_config.pulse_adc_soc = refconfig.pulse_adc_soc;
modify = true;
}//
//
if(m_config.adc_soc_offset != refconfig.adc_soc_offset)
{
m_config.adc_soc_offset = refconfig.adc_soc_offset;
modify = true;
}//
//
if(m_config.adc_soc_quantity != refconfig.adc_soc_quantity)
{
m_config.adc_soc_quantity = refconfig.adc_soc_quantity;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
EPWMConfiguration EPWMConfigModificator::get_config()
{
return m_config;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::reset()
{
modify = false;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_pwm_frquency(float fpwm)
{
if(m_config.fpwm != fpwm)
{
m_config.fpwm = fpwm;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_pulse_sync(float pulse_sync)
{
if(m_config.pulse_sync != pulse_sync)
{
m_config.pulse_sync = pulse_sync;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_pulse_adc_soc(float pulse_adc_soc)
{
if(m_config.pulse_adc_soc != pulse_adc_soc)
{
m_config.pulse_adc_soc = pulse_adc_soc;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_adc_soc_offset(float adc_soc_offset)
{
if(m_config.adc_soc_offset != adc_soc_offset)
{
m_config.adc_soc_offset = adc_soc_offset;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWMConfigModificator::set_adc_soc_quantity(Uint16 adc_soc_quantity)
{
if(m_config.adc_soc_quantity != adc_soc_quantity)
{
m_config.adc_soc_quantity = adc_soc_quantity;
modify = true;
}//
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
float EPWMConfigModificator::get_pwm_frquency()
{
return m_config.fpwm;
}//
//
// #pragma CODE_SECTION("ramfuncs");
float EPWMConfigModificator::get_pulse_sync()
{
return m_config.pulse_sync;
}//
//
// #pragma CODE_SECTION("ramfuncs");
float EPWMConfigModificator::get_pulse_adc_soc()
{
return m_config.pulse_adc_soc;
}//
//
// #pragma CODE_SECTION("ramfuncs");
float EPWMConfigModificator::get_adc_soc_offset()
{
return m_config.adc_soc_offset;
}//
//
// #pragma CODE_SECTION("ramfuncs");
Uint16 EPWMConfigModificator::get_adc_soc_quantity()
{
return m_config.adc_soc_quantity;
}//
//
//CONSTRUCTOR
EPWM::EPWM():
DSP28335::CPUBase(),
m_configuration_current(),
m_configuration_new(),
m_fcpu(150.0e6),
m_timer_period(FP_ZERO),
m_timer_step(FP_ZERO),
m_time_sample_adc(FP_ZERO),
m_clock_prescale_list(),
m_high_speed_clock_prescale(),
m_tbprd(FP_ZERO),
m_clkdiv(0),
m_hspclkdiv(0),
m_cmpr_sync(0),
m_cmpr_adc_offset(0),
m_cmpr_adc_start(0),
m_cmpr_adc_stop(0),
m_cmpr_adc_width(0),
m_cmpr_adc_step(0),
m_adc_soc_quantity(0),
m_adc_soc_counter(0),
_epwm2_adc_drive(0),
status(),
_gpio_setup(0)
//
{
m_clock_prescale_list[0] = 1.0;
m_clock_prescale_list[1] = 2.0;
m_clock_prescale_list[2] = 4.0;
m_clock_prescale_list[3] = 8.0;
m_clock_prescale_list[4] = 16.0;
m_clock_prescale_list[5] = 32.0;
m_clock_prescale_list[6] = 64.0;
m_clock_prescale_list[7] = 128.0;
//
m_high_speed_clock_prescale[0] = 1.0;
m_high_speed_clock_prescale[1] = 2.0;
m_high_speed_clock_prescale[2] = 4.0;
m_high_speed_clock_prescale[3] = 6.0;
m_high_speed_clock_prescale[4] = 8.0;
m_high_speed_clock_prescale[5] = 10.0;
m_high_speed_clock_prescale[6] = 12.0;
m_high_speed_clock_prescale[7] = 14.0;
//
}//end CONSTRUCTOR
void EPWM::setup(const EPWMSetup& setup)
{
m_status = true;
//m_status &= m_mode == DSP28335::EPWM::UNDEFINED ? true : false;
m_status &= setup.parameters.fpwm > (float)(5.0) ? true : false;
m_status &= setup.parameters.pulse_sync != FP_ZERO ? true : false;
m_status &= setup.parameters.pulse_adc_soc != FP_ZERO ? true : false;
m_status &= setup.parameters.adc_soc_offset >= FP_ZERO ? true : false;
m_status &= setup.parameters.adc_soc_quantity >= 1 ? true : false;
m_status &= setup.gpio_setup != 0 ? true : false;
//
if(m_status)
{
m_configuration_current = setup.parameters;
m_tbprd = 0;
m_clkdiv = 0;
m_hspclkdiv = 0;
m_cmpr_sync = 0;
//
m_cmpr_adc_start = 0;
m_cmpr_adc_stop = 0;
m_cmpr_adc_width = 0;
m_cmpr_adc_step = 0;
//
m_adc_soc_quantity = setup.parameters.adc_soc_quantity;
m_adc_soc_counter = 0;
//
m_timer_period = m_fcpu/m_clock_prescale_list[m_clkdiv]/m_high_speed_clock_prescale[m_hspclkdiv]/setup.parameters.fpwm;
//
while(m_timer_period>(float)(32767.0))
{
m_clkdiv++;
if(m_clkdiv >= 8)
{
m_clkdiv = 0;
m_hspclkdiv++;
//
}//if
//
m_timer_period = m_fcpu/m_clock_prescale_list[m_clkdiv]/m_high_speed_clock_prescale[m_hspclkdiv]/setup.parameters.fpwm;
//
}//while
//
m_timer_step = (m_clock_prescale_list[m_clkdiv] * m_high_speed_clock_prescale[m_hspclkdiv])/m_fcpu;
m_tbprd = (Uint16)m_timer_period;
m_cmpr_sync = m_tbprd - (Uint16)(setup.parameters.pulse_sync/m_timer_step);
m_cmpr_adc_width = (Uint16)((float)(setup.parameters.pulse_adc_soc/m_timer_step));
m_cmpr_adc_step = (Uint16)((float)((float)m_timer_period/((float)setup.parameters.adc_soc_quantity)));
m_cmpr_adc_offset = (Uint16)((float)(m_timer_period * setup.parameters.adc_soc_offset));
m_time_sample_adc = m_timer_step * ((float)m_cmpr_adc_step);
status.all = 0;
//
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
// Setup TBCLK
EPwm1Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //
EPwm1Regs.TBCTL.bit.PHSEN = 0x0; //
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync down-stream module
//
EPwm1Regs.TBCTL.bit.CLKDIV = m_clkdiv;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
//
EPwm1Regs.TBCTL.bit.FREE_SOFT = 0;
// Setup shadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set actions
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLB.all = 0;
EPwm1Regs.AQSFRC.bit.ACTSFA = 0;
EPwm1Regs.AQSFRC.bit.ACTSFB = 0;
EPwm1Regs.AQSFRC.bit.OTSFA = 0;
EPwm1Regs.AQSFRC.bit.OTSFB = 0;
EPwm1Regs.AQCSFRC.bit.CSFA = 0; // Forces a continuous low on output A
EPwm1Regs.AQCSFRC.bit.CSFB = 0; // Forces a continuous low on output B
// Dead-band
EPwm1Regs.DBCTL.bit.OUT_MODE = 0; // Enable module
EPwm1Regs.DBCTL.bit.POLSEL = 0; // Active High complementary
EPwm1Regs.DBCTL.bit.IN_MODE = 0; //
EPwm1Regs.DBFED = 0;
EPwm1Regs.DBRED = 0;
// Set Compare values
EPwm1Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
EPwm1Regs.CMPB = 0; // Set Compare B value
// Interrupt where we will change the Compare Values
//EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; // Select INT on equal to CMPA
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
//EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA equal to zero: 1-zero; 2-period
//EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Disable INT EPWMxSOCA
//EPwm1Regs.ETSEL.bit.SOCBSEL = 2 // SOCB equal to period
//EPwm1Regs.ETSEL.bit.SOCBEN = 0; // Disable INT EPWMxSOCB
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; //
EPwm1Regs.ETPS.bit.INTCNT = 0;
// PWM-Chopper
EPwm1Regs.PCCTL.all = 0; // PWM-Chopper Control Register
// Trip-Zone Submodule
EPwm1Regs.TZSEL.all = 0; // Trip-Zone Select Register
EPwm1Regs.TZCTL.all = 0; // Trip-Zone Control Register
EPwm1Regs.TZEINT.all = 0; // Trip-Zone Enable Interrupt Register
//EPwm1Regs.TZFLG.all = 0; // Trip-Zone Flag Register
//EPwm1Regs.TZCLR.all = 0; // Trip-Zone Clear Register
//EPwm1Regs.TZFRC.all = 0; // Trip-Zone Force Register
// Setup TBCLK
EPwm2Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm2Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm2Regs.TBCTR = 0x0000; // Clear counter
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //
EPwm2Regs.TBCTL.bit.PHSEN = 0x0; //
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync down-stream module
//
EPwm2Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
//
EPwm2Regs.TBCTL.bit.FREE_SOFT = 0;
// Setup shadowing
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_IMMEDIATE;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set actions
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count
EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm2Regs.AQCTLB.all = 0;
EPwm2Regs.AQSFRC.bit.ACTSFA = 0;
EPwm2Regs.AQSFRC.bit.ACTSFB = 0;
EPwm2Regs.AQSFRC.bit.OTSFA = 0;
EPwm2Regs.AQSFRC.bit.OTSFB = 0;
EPwm2Regs.AQCSFRC.bit.CSFA = 0; // Forces a continuous low on output A
EPwm2Regs.AQCSFRC.bit.CSFB = 0; // Forces a continuous low on output B
// Dead-band
EPwm2Regs.DBCTL.bit.OUT_MODE = 0; // Enable module
EPwm2Regs.DBCTL.bit.POLSEL = 0; // Active High complementary
EPwm2Regs.DBCTL.bit.IN_MODE = 0; //
EPwm2Regs.DBFED = 0;
EPwm2Regs.DBRED = 0;
// Set Compare values
EPwm2Regs.CMPA.half.CMPA = m_cmpr_adc_offset; // Set compare A value
EPwm2Regs.CMPB = 0; // Set Compare B value
// Interrupt where we will change the Compare Values
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; //
EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable INT
//EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA equal to zero: 1-zero; 2-period
//EPwm2Regs.ETSEL.bit.SOCAEN = 1; // Disable INT EPWMxSOCA
//EPwm2Regs.ETSEL.bit.SOCBSEL = 2 // SOCB equal to period
//EPwm2Regs.ETSEL.bit.SOCBEN = 0; // Disable INT EPWMxSOCB
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST; //
EPwm2Regs.ETPS.bit.INTCNT = 0;
// Setup TBCLK
EPwm5Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm5Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;// Count up/down
EPwm5Regs.TBCTL.bit.PHSEN = 0x0; // Disable phase loading
EPwm5Regs.TBCTL.bit.PRDLD = TB_SHADOW; //
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync down-stream module
//
EPwm5Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
//
EPwm5Regs.TBCTL.bit.FREE_SOFT = 0;
// Setup shadowing
EPwm5Regs.CMPCTL.bit.SHDWAMODE = 0;
EPwm5Regs.CMPCTL.bit.SHDWBMODE = 0;
EPwm5Regs.CMPCTL.bit.LOADAMODE = 0; // Load on Zero
EPwm5Regs.CMPCTL.bit.LOADBMODE = 0;
// Set actions
EPwm5Regs.AQCTLA.all = 0;
EPwm5Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM2B on event B, up count
EPwm5Regs.AQCTLB.bit.PRD = AQ_CLEAR;
EPwm5Regs.AQSFRC.bit.ACTSFA = 0;
EPwm5Regs.AQSFRC.bit.ACTSFB = 0;
EPwm5Regs.AQSFRC.bit.OTSFA = 0;
EPwm5Regs.AQSFRC.bit.OTSFB = 0;
EPwm5Regs.AQCSFRC.bit.CSFA = 0; // Forces a continuous low on output A
EPwm5Regs.AQCSFRC.bit.CSFB = 0; // Forces a continuous low on output B
// Dead-band
EPwm5Regs.DBCTL.bit.OUT_MODE = 0; // Enable module
EPwm5Regs.DBCTL.bit.POLSEL = 0; // Active Hi complementary
EPwm5Regs.DBCTL.bit.IN_MODE = 0; //
EPwm5Regs.DBFED = 0;
EPwm5Regs.DBRED = 0;
// Set Compare values
EPwm5Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
EPwm5Regs.CMPB = 0; // Set Compare B value
// Interrupt where we will change the Compare Values
EPwm5Regs.ETSEL.all = 0;
EPwm5Regs.ETPS.all = 0;
// PWM-Chopper
EPwm5Regs.PCCTL.all = 0; // PWM-Chopper Control Register
// Trip-Zone Submodule
EPwm5Regs.TZSEL.all = 0; // Trip-Zone Select Register
EPwm5Regs.TZCTL.all = 0; // Trip-Zone Control Register
EPwm5Regs.TZEINT.all = 0; // Trip-Zone Enable Interrupt Register
// Setup TBCLK
EPwm6Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm6Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;// Count up/down
EPwm6Regs.TBCTL.bit.PHSEN = 0x0; // Disable phase loading
EPwm6Regs.TBCTL.bit.PRDLD = TB_SHADOW; //
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Sync down-stream module
//
EPwm6Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm6Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
//
EPwm6Regs.TBCTL.bit.FREE_SOFT = 0;
// Setup shadowing
EPwm6Regs.CMPCTL.bit.SHDWAMODE = 0;
EPwm6Regs.CMPCTL.bit.SHDWBMODE = 0;
EPwm6Regs.CMPCTL.bit.LOADAMODE = 0; // Load on Zero
EPwm6Regs.CMPCTL.bit.LOADBMODE = 0;
// Set actions
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM2A on event A, up count
EPwm6Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm6Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM2B on event B, up count
EPwm6Regs.AQCTLB.bit.PRD = AQ_CLEAR;
EPwm6Regs.AQSFRC.bit.ACTSFA = 0;
EPwm6Regs.AQSFRC.bit.ACTSFB = 0;
EPwm6Regs.AQSFRC.bit.OTSFA = 0;
EPwm6Regs.AQSFRC.bit.OTSFB = 0;
EPwm6Regs.AQCSFRC.bit.CSFA = 0; // Forces a continuous low on output A
EPwm6Regs.AQCSFRC.bit.CSFB = 0; // Forces a continuous low on output B
// Dead-band
EPwm6Regs.DBCTL.bit.OUT_MODE = 0; // Enable module
EPwm6Regs.DBCTL.bit.POLSEL = 0; // Active Hi complementary
EPwm6Regs.DBCTL.bit.IN_MODE = 0; //
EPwm6Regs.DBFED = 0;
EPwm6Regs.DBRED = 0;
// Set Compare values
EPwm6Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
EPwm6Regs.CMPB = 0; // Set Compare B value
// Interrupt where we will change the Compare Values
EPwm6Regs.ETSEL.all = 0;
//EPwm6Regs.ETPS.bit.INTPRD = 0; //
EPwm6Regs.ETPS.all = 0;
// PWM-Chopper
EPwm6Regs.PCCTL.all = 0; // PWM-Chopper Control Register
// Trip-Zone Submodule
EPwm6Regs.TZSEL.all = 0; // Trip-Zone Select Register
EPwm6Regs.TZCTL.all = 0; // Trip-Zone Control Register
EPwm6Regs.TZEINT.all = 0; // Trip-Zone Enable Interrupt Register
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
_epwm2_adc_drive = &DSP28335::EPWM::_epwm2_adc_drive_mode_start;
_gpio_setup = setup.gpio_setup;
(*_gpio_setup)();
m_mode = DSP28335::EPWM::OPERATIONAL;
//
}
//
}//end
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::configure(const EPWMConfiguration& config)
{
m_status = true;
m_status &= config.fpwm > (float)(5.0) ? true : false;
m_status &= config.pulse_sync != FP_ZERO ? true : false;
m_status &= config.pulse_adc_soc != FP_ZERO ? true : false;
m_status &= config.adc_soc_offset >= FP_ZERO ? true : false;
m_status &= config.adc_soc_quantity >= 1 ? true : false;
//
if(m_status)
{
m_configuration_current = config;
m_tbprd = 0;
m_clkdiv = 0;
m_hspclkdiv = 0;
m_cmpr_sync = 0;
//
m_cmpr_adc_start = 0;
m_cmpr_adc_stop = 0;
m_cmpr_adc_width = 0;
m_cmpr_adc_step = 0;
//
m_adc_soc_quantity = config.adc_soc_quantity;
m_adc_soc_counter = 0;
//
m_timer_period = m_fcpu/m_clock_prescale_list[m_clkdiv]/m_high_speed_clock_prescale[m_hspclkdiv]/config.fpwm;
//
while(m_timer_period>(float)(32767.0))
{
m_clkdiv++;
if(m_clkdiv >= 8)
{
m_clkdiv = 0;
m_hspclkdiv++;
//
}//if
//
m_timer_period = m_fcpu/m_clock_prescale_list[m_clkdiv]/m_high_speed_clock_prescale[m_hspclkdiv]/config.fpwm;
//
}//while
//
m_timer_step = (m_clock_prescale_list[m_clkdiv] * m_high_speed_clock_prescale[m_hspclkdiv])/m_fcpu;
m_tbprd = (Uint16)m_timer_period;
m_cmpr_sync = m_tbprd - (Uint16)(config.pulse_sync/m_timer_step);
m_cmpr_adc_width = (Uint16)((float)(config.pulse_adc_soc/m_timer_step));
//m_cmpr_adc_step = (Uint16)(m_tbprd/config.adc_soc_quantity);
m_cmpr_adc_step = (Uint16)((float)((float)m_timer_period/((float)config.adc_soc_quantity)));
m_cmpr_adc_offset = (Uint16)((float)(m_timer_period * config.adc_soc_offset));
m_time_sample_adc = m_timer_step * ((float)m_cmpr_adc_step);
status.all = 0x0001;
//
//
EPwm1Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm1Regs.TBCTL.bit.CLKDIV = m_clkdiv;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
EPwm1Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
EPwm2Regs.TBPRD = m_tbprd;
EPwm2Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
//
// EPwm2Regs.CMPA.half.CMPA = m_cmpr_adc_offset; // Set compare A value
EPwm5Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm5Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
EPwm5Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
// Setup TBCLK
EPwm6Regs.TBPRD = m_tbprd; // Set timer period 801 TBCLKs
EPwm6Regs.TBCTL.bit.CLKDIV = m_clkdiv;;
EPwm6Regs.TBCTL.bit.HSPCLKDIV = m_hspclkdiv;
EPwm6Regs.CMPA.half.CMPA = m_cmpr_sync; // Set compare A value
//
}
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::set_actions()
{
// Set EPWM1 actions
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM1A on event A, up count
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
//EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM1A on event A, up count
//EPwm1Regs.AQCTLA.bit.PRD = AQ_SET;
//
// Set EPWM5 actions
EPwm5Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM2B on event B, up count
EPwm5Regs.AQCTLB.bit.PRD = AQ_CLEAR;
//EPwm5Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Set PWM2B on event B, up count
//EPwm5Regs.AQCTLB.bit.PRD = AQ_SET;
//
// Set EPWM6 actions
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM2A on event A, up count
EPwm6Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm6Regs.AQCTLB.bit.CAU = AQ_SET; // Set PWM2B on event B, up count
EPwm6Regs.AQCTLB.bit.PRD = AQ_CLEAR;
//EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Set PWM2A on event A, up count
//EPwm6Regs.AQCTLA.bit.PRD = AQ_SET;
//EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Set PWM2B on event B, up count
//EPwm6Regs.AQCTLB.bit.PRD = AQ_SET;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::clear_actions()
{
// Clear actions
EPwm1Regs.AQCTLA.bit.CAU = AQ_NO_ACTION;
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
//
// Set EPWM5 actions
EPwm5Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;
EPwm5Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
//
// Set EPWM6 actions
EPwm6Regs.AQCTLA.bit.CAU = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;
EPwm6Regs.AQCTLB.bit.PRD = AQ_NO_ACTION;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
float EPWM::get_time_sample_adc()
{
return m_time_sample_adc;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::epwm1_adc_drive()
{
m_adc_soc_counter = 0;
m_cmpr_adc_start = m_cmpr_adc_offset;
m_cmpr_adc_stop = m_cmpr_adc_offset + m_cmpr_adc_width;
//
//new_cycle = 1;
//adc_soc = 0;
//adc_ready = 0;
status.all = 0x001;
// Set Compare values
EPwm2Regs.CMPA.half.CMPA = m_cmpr_adc_start; // Set compare A value
_epwm2_adc_drive = &DSP28335::EPWM::_epwm2_adc_drive_mode_start;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::epwm2_adc_drive()
{
(this->*_epwm2_adc_drive)();
//
}//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::_epwm2_adc_drive_mode_start()
{
//new_cycle = 0;
//adc_soc = 1;
//adc_ready = 0;
status.all = 0x002;
// Set Compare values
EPwm2Regs.CMPA.half.CMPA = m_cmpr_adc_stop; // Set compare A value
_epwm2_adc_drive = &DSP28335::EPWM::_epwm2_adc_drive_mode_stop;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::_epwm2_adc_drive_mode_stop()
{
m_adc_soc_counter++;
m_cmpr_adc_start += m_cmpr_adc_step;
m_cmpr_adc_stop += m_cmpr_adc_step;
//new_cycle = 0;
//adc_soc = 0;
//adc_ready = 1;
status.all = 0x004;
// Set Compare values
EPwm2Regs.CMPA.half.CMPA = m_cmpr_adc_start; // Set compare A value
_epwm2_adc_drive = &DSP28335::EPWM::_epwm2_adc_drive_mode_start;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::epwm1_interrupt_ack()
{
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
//
}//
//
// #pragma CODE_SECTION("ramfuncs");
void EPWM::epwm2_interrupt_ack()
{
EPwm2Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
//
}//
//
} /* namespace DSP28335 */