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.h

151 lines
3.1 KiB
C++

/*
* EPWM.h
*
* Author: Aleksey Gerasimenko
* gerasimenko.aleksey.n@gmail.com
*/
#include "F28335/DSP28x_Project.h"
#include "DSP28335/CPUBase.h"
#ifndef DSP28335_EPWM_H_
#define DSP28335_EPWM_H_
namespace DSP28335
{
enum CLOCKPRESCALE {DIV01, DIV02, DIV04, DIV08, DIV16, DIV32, DIV64, DIV128};
enum HIGHSPEEDCLOCKPRESCALE {HSDIV01, HSDIV02, HSDIV04, HSDIV06, HSDIV08, HSDIV10, HSDIV12, HSDIV14};
struct EPWMStatusBitField
{
Uint16 new_cycle:1;
Uint16 adc_soc:1;
Uint16 adc_ready:1;
};//EPWMStatusBitField
union EPWMStatusRegister
{
Uint16 all;
EPWMStatusBitField bit;
EPWMStatusRegister():
all(0)
{}
};//EPWMStatusRegister
struct EPWMConfiguration
{
float fpwm;
float pulse_sync;
float pulse_adc_soc;
float adc_soc_offset;
Uint16 adc_soc_quantity;
EPWMConfiguration():
fpwm(500.0),
pulse_sync(1.0e-6),
pulse_adc_soc(10.0e-6),
adc_soc_offset(FP_ZERO),
adc_soc_quantity(1)
{}
};//EPWMConfiguration
class EPWMConfigModificator
{
private:
EPWMConfiguration m_config;
public:
bool modify;
public:
EPWMConfigModificator();
void set_config(EPWMConfiguration& refconfig);
EPWMConfiguration get_config();
public:
void reset();
public:
void set_pwm_frquency(float fpwm);
void set_pulse_sync(float pulse_sync);
void set_pulse_adc_soc(float pulse_adc_soc);
void set_adc_soc_offset(float adc_soc_offset);
void set_adc_soc_quantity(Uint16 adc_soc_quantity);
public:
float get_pwm_frquency();
float get_pulse_sync();
float get_pulse_adc_soc();
float get_adc_soc_offset();
Uint16 get_adc_soc_quantity();
//
};//EPWMConfigModificator
struct EPWMSetup: public DSP28335::CPUBaseSetup
{
EPWMConfiguration parameters;
EPWMSetup():
DSP28335::CPUBaseSetup(),
parameters()
{}
};//EPWMSetup
class EPWM: public DSP28335::CPUBase
{
private:
EPWMConfiguration m_configuration_current;
EPWMConfiguration m_configuration_new;
private:
float m_fcpu;
float m_timer_period;
float m_timer_step;
float m_time_sample_adc;
float m_clock_prescale_list[8];
float m_high_speed_clock_prescale[8];
Uint16 m_tbprd; //TBPRD
Uint16 m_clkdiv;
Uint16 m_hspclkdiv;
Uint16 m_cmpr_sync;
Uint16 m_cmpr_adc_offset;
Uint16 m_cmpr_adc_start;
Uint16 m_cmpr_adc_stop;
Uint16 m_cmpr_adc_width;
Uint16 m_cmpr_adc_step;
Uint16 m_adc_soc_quantity;
Uint16 m_adc_soc_counter;
public:
EPWMStatusRegister status;
public:
EPWM();
void setup(const EPWMSetup& setup);
void configure(const EPWMConfiguration& config);
public:
void set_actions();
void clear_actions();
public:
float get_time_sample_adc();
public:
void epwm1_adc_drive();
public:
void epwm2_adc_drive();
private:
void (EPWM::*_epwm2_adc_drive)();
void _epwm2_adc_drive_mode_start();
void _epwm2_adc_drive_mode_stop();
public:
void epwm1_interrupt_ack();
void epwm2_interrupt_ack();
private:
void (*_gpio_setup)();
};
} /* namespace DSP28335 */
#endif /* DSP28335_EPWM_H_ */