Go Down

Topic: Due generating Synchronous PWM (Read 1 time) previous topic - next topic

Hi,

I am trying to generate two synchronous PWM (in channel 5, pin 8 and 44) by directly manipulating the registers, but there is no signal generated from pin 8 or 44. I think I strictly followed the instruction from the datasheet. Is there any mistake in my codes? Any help would be much appreciated.

Code: [Select]

void setup() {
  // put your setup code here, to run once:
  pinMode(8,OUTPUT);
  pinMode(44,OUTPUT);
  PWM->PWM_WPCR= 0x50574DFC;
  PWM->PWM_DIS=  0x000000FF;
  PWM->PWM_CLK=  0x00000001;
  PWM->PWM_CH_NUM[5].PWM_CMR= 0x00010000;  // period 84KHz
  PWM->PWM_CH_NUM[5].PWM_CPRD=0x00000C00;  // 1024 resolution
  PWM->PWM_CH_NUM[5].PWM_CDTY=0x00000600;  // start duty cycle is 0
  PWM->PWM_CH_NUM[5].PWM_DT  =0x00000000;  // dead time 5 (58ns)
  PWM->PWM_SCM  =0x00020020;  // synchronous mode 2 channel 5
  PWM->PWM_SCUP =0x00000000;  // minimum update period
  PWM->PWM_ENA  =0x00000020;

}

void loop() {
  // put your main code here, to run repeatedly:
 
}

ralphnev

it not really using syncronous channels as the data sheet states / you are just using both outputs of the same channel .. `
(i didnt need dead time .. but easy to add.. )

in anyevent  here is a chunk of code that sets up TWO seperate channels (two differnt duty cycles )
if you want to just use channel outputs 5H & 5L  rip out the "syncronous" stuff (channel 0 & channel 4)
(ALSO .. i didnt need dead time .. but easy to add.. )

Code: [Select]
void
PWM_setup ()
{
//PWM config
  pmc_enable_periph_clk (ID_PWM);

  PWMC_DisableChannel (PWM, PWM_CHANNEL_4);
  PWMC_DisableChannel (PWM, PWM_CHANNEL_5);
  PWMC_DisableChannel (PWM, PWM_CHANNEL_0);

  PWMC_ConfigureClocks (pwm_clk, 0, VARIANT_MCK);

  int ulPin = 8;
  // Setup PWM for this pin {theta1}
  PIO_Configure (g_APinDescription[ulPin].pPort,
g_APinDescription[ulPin].ulPinType,
g_APinDescription[ulPin].ulPin,
g_APinDescription[ulPin].ulPinConfiguration);
  ulPin = 9;
  // Setup PWM for this pin  {thetaRB}
  PIO_Configure (g_APinDescription[ulPin].pPort,
g_APinDescription[ulPin].ulPinType,
g_APinDescription[ulPin].ulPin,
g_APinDescription[ulPin].ulPinConfiguration);
  //**pin44        {theta2}
  PIO_Configure (g_APinC19RE_Description.pPort,
g_APinC19RE_Description.ulPinType,
g_APinC19RE_Description.ulPin,
g_APinC19RE_Description.ulPinConfiguration);

  PWMC_ConfigureSyncChannel (PWM,
     PWM_SCM_SYNC4 | PWM_SCM_SYNC5 | PWM_SCM_SYNC0
     , PWM_SCM_UPDM_MODE1, 0, 0);

  PWMC_SetPeriod (PWM, PWM_CHANNEL_4, pwm_period);
  PWMC_SetPeriod (PWM, PWM_CHANNEL_5, pwm_period);

  PWMC_ConfigureChannel (PWM, PWM_CHANNEL_4, PWM_CMR_CPRE_CLKA, 0,
PWM_CMR_CPOL);
  PWMC_SetDutyCycle (PWM, PWM_CHANNEL_4, pwm_dutyRS);
  PWMC_SetDutyCycle (PWM, PWM_CHANNEL_5, pwm_duty1);

  PWMC_SetPeriod (PWM, PWM_CHANNEL_0, pwm_period);
  PWMC_SetDutyCycle (PWM, PWM_CHANNEL_0, pwm_duty1);
  PWMC_ConfigureChannel (PWM, PWM_CHANNEL_0, PWM_CMR_CPRE_CLKA, 0, 0);

  PWM->PWM_OOV = PWM_OSSUPD_OSSUPH5;
  PWMC_SetSyncChannelUpdatePeriod (PWM, 1);


  PWMC_ConfigureComparisonUnit (PWM, PWM_CHANNEL_5, 1, 1);
  PWMC_ConfigureComparisonUnit (PWM, PWM_CHANNEL_4, 1, 1);
  PWMC_ConfigureEventLineMode (PWM, 0, PWM_ELMR_CSEL5 | PWM_ELMR_CSEL4);
  PWMC_SetSyncChannelUpdateUnlock (PWM);

  PWMC_EnableChannel (PWM, PWM_CHANNEL_0);
  PWMC_SetSyncChannelUpdateUnlock (PWM);
}

Thank you sooo much. It is working now! Very helpful!


Tom_Stark I think you just forget to activate the MCK in the PMC register. Anyone correct me if I'm wrong.

Thanks,

Daniel

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy