#define MAIN 1
#include "system_defines.h"
#include "cyclone_device.h"
#include "pmbus_commands.h"
#include "pmbus.h"
#include "variables.h"
#include "function_definitions.h"
#include "software_interrupts.h"
#include "cyclone_defines.h"
#include "stdio.h"
#define PERIOD (40000) // 4 Ghz high speed clock/100 KHz switching frequency = 40000.
//to jumper 64 pin open loop board for fake power supply feed back
//
// J22 pins 2 to 3 - DPWM0A to FLTRDPWM0
// J11 pins 1 to 2 - FLTRDPWM0 to voltage loop feedback
// j7 pins 1 to 2 - voltage loop feedback to EAP0
int ram_eadcdac;
// comment for hyperknob [min=0, max=16383, step=256]
void init_front_end0(void)
{
FeCtrl0Regs.EADCDAC.bit.DAC_VALUE = 0;
FeCtrl0Regs.EADCCTRL.bit.AFE_GAIN = 2;
FeCtrl0Regs.EADCCTRL.bit.EADC_MODE=3; // continue SAR mode =3
}
void init_front_end1(void)//for CT1 sensing
{
FeCtrl1Regs.EADCDAC.bit.DAC_VALUE = 0;
FeCtrl1Regs.EADCCTRL.bit.AFE_GAIN = 2;
FeCtrl1Regs.EADCCTRL.bit.EADC_MODE=3; // continue SAR mode =3
}
void init_front_end2(void)//for CT2 sensing
{
FeCtrl2Regs.EADCDAC.bit.DAC_VALUE = 0;
FeCtrl2Regs.EADCCTRL.bit.AFE_GAIN = 2;
FeCtrl2Regs.EADCCTRL.bit.EADC_MODE=3; // continue SAR mode =3
}
void init_front_ends(void)
{
init_front_end0();
init_front_end1();
init_front_end2();
}
void init_dpwm0(void)
{
Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 0; //disable locally for init
Dpwm0Regs.DPWMCTRL0.bit.CLA_EN = 1; //default is 1 - use cla
Dpwm0Regs.DPWMCTRL0.bit.PWM_MODE = 0; //normal mode
Dpwm0Regs.DPWMPRD.all = PERIOD; //use .all for all values, make sure scaling matches.
Dpwm0Regs.DPWMEV1.all = 0; //Put event 1 at start of period
Dpwm0Regs.DPWMEV2.all = PERIOD/4; //1/4 of period - divide is OK because it's all constants.
Dpwm0Regs.DPWMEV3.all = PERIOD/2; //1/2 of period
Dpwm0Regs.DPWMEV4.all = (PERIOD * 3)/4; //3/4 of period
Dpwm0Regs.DPWMSAMPTRIG1.all = (PERIOD * 3)/4; //3/4 of period
Dpwm0Regs.DPWMCTRL2.bit.SAMPLE_TRIG_1_EN = 1; //enable 1 sample trigger
Dpwm0Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1; //update at end of period
Dpwm0Regs.DPWMCTRL0.bit.PWM_EN = 1; //enable locally
}
void init_filter0(void)
{
//PID setup taken from a random topology - lab is for closing loop, not tuning parameters.
Filter0Regs.FILTERKPCOEF0.bit.KP_COEF_0 = 800;
Filter0Regs.FILTERKICOEF0.bit.KI_COEF_0 = 50;
Filter0Regs.FILTERKDCOEF0.bit.KD_COEF_0 = 1500;
Filter0Regs.FILTERKDALPHA.bit.KD_ALPHA_0 = -1;
Filter0Regs.FILTERKICLPHI.bit.KI_CLAMP_HIGH = 0x7FFFFF;
Filter0Regs.FILTERKICLPLO.bit.KI_CLAMP_LOW = 0;
Filter0Regs.FILTEROCLPHI.bit.OUTPUT_CLAMP_HIGH = 0x7FFFFF;
Filter0Regs.FILTEROCLPLO.bit.OUTPUT_CLAMP_LOW = 0;
Filter0Regs.FILTERCTRL.bit.FILTER_EN = 1;
//enable OK here, because nothing will happen until DPWM and front end are globally enabled
//Better option for handling shoot through - uses full dynamic range of filter
LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 = (PERIOD/2) >> 4; //KCOMP is at 4 ns, period is at 250 ps
Filter0Regs.FILTERCTRL.bit.OUTPUT_MULT_SEL =3; //select half period kcomp for output multiplier
}
void init_filter1(void)
{
//PID setup taken from a random topology - lab is for closing loop, not tuning parameters.
Filter1Regs.FILTERKPCOEF0.bit.KP_COEF_0 = 800;
Filter1Regs.FILTERKICOEF0.bit.KI_COEF_0 = 50;
Filter1Regs.FILTERKDCOEF0.bit.KD_COEF_0 = 1500;
Filter1Regs.FILTERKDALPHA.bit.KD_ALPHA_0 = -1;
Filter1Regs.FILTERKICLPHI.bit.KI_CLAMP_HIGH = 0x7FFFFF;
Filter1Regs.FILTERKICLPLO.bit.KI_CLAMP_LOW = 0;
Filter1Regs.FILTEROCLPHI.bit.OUTPUT_CLAMP_HIGH = 0x7FFFFF;
Filter1Regs.FILTEROCLPLO.bit.OUTPUT_CLAMP_LOW = 0;
Filter1Regs.FILTERCTRL.bit.FILTER_EN = 1;
//enable OK here, because nothing will happen until DPWM and front end are globally enabled
//Better option for handling shoot through - uses full dynamic range of filter
LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 = (PERIOD/2) >> 4; //KCOMP is at 4 ns, period is at 250 ps
Filter1Regs.FILTERCTRL.bit.OUTPUT_MULT_SEL = 3; //select half period kcomp for output multiplier
}
void init_filter2(void)
{
//PID setup taken from a random topology - lab is for closing loop, not tuning parameters.
Filter2Regs.FILTERKPCOEF0.bit.KP_COEF_0 = 800;
Filter2Regs.FILTERKICOEF0.bit.KI_COEF_0 = 50;
Filter2Regs.FILTERKDCOEF0.bit.KD_COEF_0 = 1500;
Filter2Regs.FILTERKDALPHA.bit.KD_ALPHA_0 = -1;
Filter2Regs.FILTERKICLPHI.bit.KI_CLAMP_HIGH = 0x7FFFFF;
Filter2Regs.FILTERKICLPLO.bit.KI_CLAMP_LOW = 0;
Filter2Regs.FILTEROCLPHI.bit.OUTPUT_CLAMP_HIGH = 0x7FFFFF;
Filter2Regs.FILTEROCLPLO.bit.OUTPUT_CLAMP_LOW = 0;
Filter2Regs.FILTERCTRL.bit.FILTER_EN = 1;
//enable OK here, because nothing will happen until DPWM and front end are globally enabled
//Better option for handling shoot through - uses full dynamic range of filter
LoopMuxRegs.FILTERKCOMPA.bit.KCOMP0 = (PERIOD/2) >> 4; //KCOMP is at 4 ns, period is at 250 ps
Filter2Regs.FILTERCTRL.bit.OUTPUT_MULT_SEL = 3; //select half period kcomp for output multiplier
}
void init_loop_mux(void)
{
LoopMuxRegs.DPWMMUX.bit.DPWM0_FILTER_SEL = 0; //use filter 0 for DPWM 0
LoopMuxRegs.SAMPTRIGCTRL.bit.FE0_TRIG_DPWM0_EN = 1; //use DPWM0 for filter0 sample trigger
LoopMuxRegs.FECTRL0MUX.bit.DPWM0_FRAME_SYNC_EN = 1; //trigger ramp steps with DPWM0 frame sync
}
void init_loop_mux1(void)
{
LoopMuxRegs.DPWMMUX.bit.DPWM0_FILTER_SEL = 1; //use filter 0 for DPWM 0
LoopMuxRegs.SAMPTRIGCTRL.bit.FE0_TRIG_DPWM0_EN = 1; //use DPWM0 for filter0 sample trigger
LoopMuxRegs.FECTRL0MUX.bit.DPWM0_FRAME_SYNC_EN = 1; //trigger ramp steps with DPWM0 frame sync
}
void global_enable(void)
{
union GLBEN_REG glben_store; //collect global enable bits for simultaneous use
glben_store.all = 0;
glben_store.bit.DPWM0_EN = 1;
glben_store.bit.FE_CTRL0_EN = 1;
glben_store.bit.FE_CTRL1_EN = 1;
glben_store.bit.FE_CTRL2_EN = 1;
LoopMuxRegs.GLBEN = glben_store;
}
void ramp_up0(void)
{
FeCtrl0Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl0Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x3fff; //ramp up to the top
FeCtrl0Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl0Regs.EADCDAC.bit.DAC_VALUE = 0x2; //start at the lowest safe value
FeCtrl0Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl0Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void ramp_up1(void)
{
FeCtrl1Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl1Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x3fff; //ramp up to the top
FeCtrl1Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl1Regs.EADCDAC.bit.DAC_VALUE = 0x2; //start at the lowest safe value
FeCtrl1Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl1Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void ramp_up2(void)
{
FeCtrl2Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl2Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x3fff; //ramp up to the top
FeCtrl2Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl2Regs.EADCDAC.bit.DAC_VALUE = 0x2; //start at the lowest safe value
FeCtrl2Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl2Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void ramp_down0(void)
{
FeCtrl0Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl0Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x2;//finish at the lowest safe value
FeCtrl0Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl0Regs.EADCDAC.bit.DAC_VALUE = 0x3fff; //ramp down from the top
FeCtrl0Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl0Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void ramp_down1(void)
{
FeCtrl1Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl1Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x2;//finish at the lowest safe value
FeCtrl1Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl1Regs.EADCDAC.bit.DAC_VALUE = 0x3fff; //ramp down from the top
FeCtrl1Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl1Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void ramp_down2(void)
{
FeCtrl2Regs.RAMPCTRL.bit.FIRMWARE_START = 0; //clear it to make sure we get a rising edge
FeCtrl2Regs.RAMPDACEND.bit.RAMP_DAC_VALUE = 0x2;//finish at the lowest safe value
FeCtrl2Regs.DACSTEP.bit.DAC_STEP = 0x40; //make it slow for a while
FeCtrl2Regs.EADCDAC.bit.DAC_VALUE = 0x3fff; //ramp down from the top
FeCtrl2Regs.RAMPCTRL.bit.RAMP_EN = 1;
FeCtrl2Regs.RAMPCTRL.bit.FIRMWARE_START = 1; //start it.
}
void wait_for_ramp_end(void)
{
volatile int i;
while(FeCtrl0Regs.RAMPSTAT.bit.RAMP_BUSY == 1)
{
pmbus_handler();
}
}
void init_timer_interrupt(void)
{
TimerRegs.T16PWM2CMP0DAT.all = 1562; //Threshold to reset counter - 15.625 mHz/10 KHz.
TimerRegs.T16PWM2CMPCTRL.all = 2; //Enables compare 0 (reset) interrupt
TimerRegs.T16PWM2CNTCTRL.all = 0x00c; //PWM counter is running & enables PWM counter reset by compare action on compare 0
write_reqmask(CIMINT_ALL_PWM2_COMP); //enable pwm2cmp
enable_interrupt();
}
void init_ADC_polled(void)
{
AdcRegs.ADCCTRL.bit.MAX_CONV = 6; // A total of 5 conversions (0 to 4)
AdcRegs.ADCCTRL.bit.SINGLE_SWEEP = 1;
AdcRegs.ADCCTRL.bit.ADC_EN = 1;
AdcRegs.ADCSEQSEL0.bit.SEQ0 = 0; // ad00 AC-L order0
AdcRegs.ADCSEQSEL0.bit.SEQ1 = 2; // AD01 IIN
AdcRegs.ADCSEQSEL0.bit.SEQ2 = 3; // AD03 VB
AdcRegs.ADCSEQSEL0.bit.SEQ3 = 4; // ad04 AC-N
AdcRegs.ADCSEQSEL1.bit.SEQ4 = 6; // ad06 CT-1 order4
AdcRegs.ADCSEQSEL1.bit.SEQ5 = 7; // ad07 VB-OV
AdcRegs.ADCSEQSEL1.bit.SEQ6 = 13; // ad13 CT-2
AdcRegs.ADCSEQSEL1.bit.SEQ7 = 9; // ad09
AdcRegs.ADCSEQSEL2.bit.SEQ8 = 13; // ad13
AdcRegs.ADCAVGCTRL.bit.AVG0_CONFIG = 0; // Average 4 samples of ad06
AdcRegs.ADCAVGCTRL.bit.AVG0_EN = 1; // Module0 averaging enabled
AdcRegs.ADCAVGCTRL.bit.AVG1_CONFIG = 1; // Average 8 samples of AD02
AdcRegs.ADCAVGCTRL.bit.AVG1_EN = 1; // Module1 averaging enabled
AdcRegs.ADCAVGCTRL.bit.AVG2_CONFIG = 2; // Average 16 samples of AD04
AdcRegs.ADCAVGCTRL.bit.AVG2_EN = 1; // Module2 averaging enabled
AdcRegs.ADCAVGCTRL.bit.AVG3_CONFIG = 3; // Average 32 samples of ad06
AdcRegs.ADCAVGCTRL.bit.AVG3_EN = 1; // Module3 averaging enabled
AdcRegs.ADCAVGCTRL.bit.AVG4_CONFIG = 3; // Average 4 samples of ad08
AdcRegs.ADCAVGCTRL.bit.AVG4_EN = 1; // Module4 averaging enabled
AdcRegs.ADCAVGCTRL.bit.AVG5_CONFIG = 3; // Average 4 samples of ad08
AdcRegs.ADCAVGCTRL.bit.AVG5_EN = 1; // Module4 averaging enabled
AdcRegs.ADCCTRL.bit.SW_START = 1; // trigger a new measurement sequence
ad02_raw_min = ad06_raw_min = ad06B_raw_min = ad04_raw_min = ad08_raw_min = 0xFFF; //initialize minimums to maximum value
ad02_avg_min = ad06_avg_min = ad06B_avg_min = ad04_avg_min = ad08_avg_min = 0xFFF;
}
void main()
{
if(MiscAnalogRegs.GLBIOREAD.bit.TDO_IO_READ == 0) //emergency backdoor - TMS is normally pulled up by external resistor
{
clear_integrity_word(); //if it's pulled down, clear checksum (integrity word)
}
// GioRegs.FAULTDIR.bit.FLT0_DIR = 1; //make fault 0 an output for instrumentation
init_pmbus();
init_ADC_polled();
init_dpwm0();
init_front_ends();
//init_filter0();
init_loop_mux1();
//init_front_end0();
init_front_ends();
global_enable();
init_timer_interrupt();
for(;;)
{
ramp_up0();
ramp_up1();
ramp_up2();
wait_for_ramp_end();
ramp_down0();
ramp_down1();
ramp_down2();
wait_for_ramp_end();
}
}
#pragma INTERRUPT(c_int00,RESET)
void c_int00(void)
{
main();
}