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
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
@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) { } }
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
@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
Benötige ich zur PWM-Generierung über die PSC-Unit, noch zusätzliche Timer bzw. Counter?
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?
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.