Arduino DUE- problem with a dead time

Dear all,

I have been trying to implement dead time on the Arduino Due board using complementary PWM outputs in order to control H-bridge inverter. On the first view, my program code works, but not completely correct. Actually, two problem are appeared :

  • at the beginning and in the end of the output signals I get overlaps - dead time in this two points does not have reaction
  • if I adjust constant modulation signal instead of sin, every some time I can see bigger value of the dead time than adjusted value in the program code.

Does anybody know how I can solve this problem?
Maybe, I cannot see some detail which makes this problem.


Here is my program code, for the channel 0 :

float x = 0; // argument of the sine function
const float pi = 3.1415;
int i = 0;
int k = 0;
float carrierfreq = 4000; // Carrier frequency
float modfreq = 50; // Modulation frequency
float ris = carrierfreq / modfreq; // points where the sine function is divided
float Ton1 = 0; // ignition time, random initialization
int DeadTimeHigh = 500;
int DeadTimeLow = 500;
float lookup1[2500];
int clkfreq = 42000000;
float cprd = (clkfreq /(carrierfreq*2));

void lookuptable() {
for (i = 0; i <= ris; i++) {
lookup1 = sin(x);
x = x + 2 * pi / ris;
}
}

void PWM_Handler(void)
{
PWM->PWM_ISR2;

Ton1 = abs(lookup1[k + 1]) * cprd;

if (lookup1[k + 1] >= 0) {
PWM->PWM_CH_NUM[0].PWM_CDTYUPD = Ton1;
PWM->PWM_CH_NUM[0].PWM_DTUPD = DeadTimeHigh;
}

else {
PWM->PWM_CH_NUM[0].PWM_CDTYUPD = 0;
PWM->PWM_CH_NUM[0].PWM_DTUPD = DeadTimeLow;
}

if ((k + 1) < ris) {
k++;
}
else {
k = 0;
}

}

void setPWMpin(uint32_t pin) {
PIO_Configure(g_APinDescription[pin].pPort,
PIO_PERIPH_B,
g_APinDescription[pin].ulPin,
g_APinDescription[pin].ulPinConfiguration);

}

void setup() {

Serial.begin(9600);

lookuptable(); // calling the function to be done

// Making active desired PWM pin

setPWMpin(34); //PWML0
setPWMpin(35); //PWMH0

pmc_enable_periph_clk(ID_PWM);

PWMC_DisableChannel(PWM, 0);

PWMC_ConfigureClocks(clkfreq, 0, VARIANT_MCK);

PWMC_ConfigureSyncChannel (PWM, PWM_SCM_SYNC0, PWM_SCM_UPDM_MODE1, 0, 0);

PWMC_ConfigureChannelExt(PWM,
0,
PWM_CMR_CPRE_CLKA,
PWM_CMR_CALG,
0,
PWM_CMR_CES,
PWM_CMR_DTE,
0,
0);
PWMC_SetPeriod(PWM, 0, cprd);
PWMC_SetDutyCycle(PWM, 0, Ton1);
PWMC_SetDeadTime(PWM, 0, DeadTimeHigh, DeadTimeLow);

PWMC_EnableChannel(PWM,0); // Enabling the channel 0

NVIC_DisableIRQ(PWM_IRQn);
NVIC_ClearPendingIRQ(PWM_IRQn);
NVIC_SetPriority(PWM_IRQn, 0);
NVIC_EnableIRQ(PWM_IRQn);
PWMC_EnableIt(PWM, 0, PWM_IER2_WRDY);
}

void loop() {

Serial.println(34);

}


Thanks a lot!

Have you since modified the code given? On first try, it does not compile.

I've been trying to modife the code, but I haven't found any good solution yet. Cood works, just you need the 1.5.6. version arduino program. Do you know somethng about the dead time? Have you has similar experience? Regards