Forum: Mikrocontroller und Digitale Elektronik Problem PWM zu große OFF-Zeiten


von uCli (Gast)


Angehängte Dateien:

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

von Joe (Gast)


Lesenswert?

Wie sieht dein Programm aus ?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Wenn ich mir so das Signal anschaue, sieht es für mich nach einem Stack 
Overflow aus. Dünne mal deine ISRs aus... Und zeig uns mal das Programm. 
;)


Gruß
Jonathan


P.S.: Auch so ein Oszi will! :D

von uCli (Gast)


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)
    {
    }


}

von spess53 (Gast)


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

von uCli (Gast)


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

von uCli (Gast)


Lesenswert?

Benötige ich zur PWM-Generierung über die PSC-Unit, noch zusätzliche 
Timer bzw. Counter?

von Bernhard S. (b_spitzer)


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?

von M. L. (milen)


Lesenswert?

@b_spitzer: Dead-Time ist in Sekunden und Tastgrad in Prozent, also 20%.

Die Parameter funktionieren optimal innerhalb der PWM-Blöcke.

Nur woher diese Offzeiten kommen verstehe ich nicht.

Gruss

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.