Problem PWM zu große OFF-Zeiten

Gast #2831515
Lesenswert?

Hallo!

Ich möchte mittels einem AT90PWM3B einen High-Low-Side-Treiber 
ansteuern.

Das Problem ist, ich bekomme keine durchgängige (über die Zeit) PWM.
In den einzelnen Blöcken funktioniert die High bzw. Low-Side Steuerung, 
jedoch habe ich bei größerer Zeitauflösung (am Oszi) zwischen den 
einzelnen PWM-Blöcken eine OFF-Zeit.

Kann mir jemand sagen, wie diese zustande kommt, bzw. was ich in meinem 
Code falsch mache?!

Bin über jede Hilfe dankbar!

Gruss
Angehängte Dateien:
Gast #2831531
Lesenswert?

@Joe: Sry, hab ich vergessen ;)!


#include <avr/io.h>
#include <avr/interrupt.h>

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxx
// Ramp_Mode_Selection
  int ramp_mode = 0;    // Mode: 
4=Four_Ramp/2=Two_Ramp/1=One_Ramp/0=Center_Aligned

// Define_Times
  double Freq_clk_psc = 16000000;
  double DUTY_CYCLE;
  double Freq_psc_cycle;
  double Per_psc_cycle;
  double DEAD_TIME;
  double ON_TIME_0;
  double ON_TIME_1;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
xxxxxxxxxxxxxxxx


void init_pwm_value(void)
{

  DUTY_CYCLE = 0.20;
  DEAD_TIME = 0.00001;
  Freq_psc_cycle = 22000;

  Per_psc_cycle = 1/Freq_psc_cycle;
  ON_TIME_0 = DUTY_CYCLE * Per_psc_cycle;


};


// Power_Stage_Controll_2_Initalisation
void init_psc2(void)
{

  PSOC2 = (1<<POEN2A)|(1<<POEN2B);

  OCR2SA = (ON_TIME_0/2)*Freq_clk_psc;
  OCR2RB = ((Per_psc_cycle/2)*Freq_clk_psc)-1;
  OCR2SB = (DEAD_TIME*Freq_clk_psc)+OCR2SAH;


}

// Ramp_Mode_Initialisation
void init_ramp_mode(void)
{
    switch (ramp_mode)
    {
      case 4:
      PCNF2 = (1<<PMODE21)|(1<<PCLKSEL2)|(1<<POP2); // Four_Ramp_Mode
      break;

      case 2:
      PCNF2 = (1<<PMODE20)|(1<<POP2); // Two_Ramp_Mode
      break;

      case 1:
      PCNF2 = (0<<PMODE21)|(0<<PMODE20)|(1<<POP2); // One_Ramp_Mode
      break;

      case 0:
      PCNF2 = 
(1<<PMODE21)|(1<<PMODE20)|(1<<POP2)|(0<<PCLKSEL2)|(1<<PALOCK2); // 
Center_Aligned_Mode // Slow_Clock_Input (PCLKSEL2 = 0)
      break;
    }
}

// Power_Stage_Controll_Input_Initialisation // page:167
void init_psc_input(void)
{
  PFRC2A = 0;
  PFRC2B = 0;
}

// PWM_Output_Selection
void init_pwm_out(void)
{
  PCTL2 = (1<<PRUN2); // PWM_Output_enable

}

int main(void)
{
  init_pwm_value();
  init_psc2();
  init_ramp_mode();
  init_psc_input();
  init_pwm_out();

    while(1)
    {
    }


}
Gast #2831534
Lesenswert?

Hi

>  double Freq_clk_psc = 16000000;
>  double DUTY_CYCLE;
>  double Freq_psc_cycle;
>  double Per_psc_cycle;
>  double DEAD_TIME;
>  double ON_TIME_0;
>  double ON_TIME_1;

Wozu braucht man da 'Double'?

MfG Spess
Gast #2831539
Lesenswert?

@spess53:

Ja, braucht man nicht unbedingt ;) aber an dem wirds nicht liegen ;)#

@joni-st: Ist leider auch nicht mein privates Oszi :(!

Hat schon jemand eine Ahnung, was in meinem Code verkehrt läuft?

Danke!

Gruss
#2832035
Lesenswert?

Wo sind die Interrupt-Routinen??
Andere Frage... du hast die Totzeit so angegeben:
DEAD_TIME = 0.00001;
Wenn ich da als Einheit Sekunden annehme, ist die Dead-Time 10us. Das 
ist genau die Summe zwischen den beiden Impulsen. Wäre also korrekt...
Dann hast Du
DUTY_CYCLE = 0.20;
Sind das Prozent (bzw. Anteilig also 20%) oder Sekunden?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren