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!