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.
769 lines
24 KiB
C++
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 */
|