Forum: Mikrocontroller und Digitale Elektronik [C] PWM für Ladungspumpe, Versatz realisieren?


von Ladungspumper (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich bin gerade dabei eine Ladungspumpe mit Timer1 eines Atmega32 zu 
realisieren.

Der Timer 1 läuft im 8 Bit Mode mit Fast PWM und der Channel B ist 
invertiert, Prescaler ist 1 und  die Frequenz beträgt ca 32kHz.

Auf dem Oszi sieht das auch alles ganz gut aus. Allerdings habe ich ein 
Problem:

Beide PWMs haben zum gleichen Zeitpunkt eine steigende Flanke.
Laut Wikipedia sollte aber ein kleiner Versatz drin sein.
http://de.wikipedia.org/wiki/Ladungspumpe#mediaviewer/Datei:Dickson_voltage_multiplier.svg


Der Kollege hier hat das mit einem Arduino ebenfalls so gemacht, aber 
bei ihm sieht man schön den Versatz (8:43)

http://www.youtube.com/watch?v=D826h-YQun4&index=2&list=PLjzGSu1yGFjUsB3ChZJ2_-MTNp7bHaKED

Jetzt ist die Frage, wie bekomme ich sowas auch hin?

Danke für eure Hilfe

von jonas biensack (Gast)


Lesenswert?

1
#include  <avr\io.h>  //AVR Register und Konstantendefinitionen
2
#include  <avr\interrupt.h> //AVR Interrupt Vektoren
3
#include  <stdlib.h>
4
#include  <inttypes.h>
5
#include   <util/delay.h>
6
7
8
9
              
10
// ************************************************************************************************ 
11
//                       Initialisierung          
12
// ************************************************************************************************ 
13
void initial(void)
14
{    
15
// **** Einrichten von Ein- und Ausgängen ******************************************************* 
16
DDRD = 0xff;        // PortD Ausgänge 
17
DDRC = 0x00;        // PortC Eingänge 
18
19
// **** Einrichten von PWM Betrieb *************************************************************** 
20
// Der Timer 1 wird im Fast PWM Modus betrieben
21
22
23
TCCR1A = 0b10110001;          //8 bit PWM, no Prescale, Channel B invertiert
24
TCCR1B = 0b00001001;
25
26
27
28
         
29
OCR1A=127;
30
OCR1B=137;
31
TCNT1H = 0 ;     
32
TCNT1L = 0 ; 
33
34
sei() ;
35
36
}
37
38
//Hauptprogramm
39
40
int main(void)
41
{
42
43
44
initial();  // Initialisierung Ports etc.
45
46
    
47
while(1)
48
  
49
{
50
51
52
53
54
return 0;
55
}

: Bearbeitet durch User
von jonas biensack (Gast)


Lesenswert?

#include  <avr\io.h>  //AVR Register und Konstantendefinitionen
#include  <avr\interrupt.h> //AVR Interrupt Vektoren
#include  <stdlib.h>
#include  <inttypes.h>
#include   <util/delay.h>




//
************************************************************************
************************
//                       Initialisierung
//
************************************************************************
************************
void initial(void)
{
// **** Einrichten von Ein- und Ausgängen
*******************************************************
DDRD = 0xff;        // PortD Ausgänge
DDRC = 0x00;        // PortC Eingänge

// **** Einrichten von PWM Betrieb
***************************************************************
// Der Timer 1 wird im Fast PWM Modus betrieben


TCCR1A = 0b10110001;          //8 bit PWM, no Prescale, Channel B
invertiert
TCCR1B = 0b00001001;




OCR1A=127;
OCR1B=137;
TCNT1H = 0 ;
TCNT1L = 0 ;

sei() ;

}

//Hauptprogramm

int main(void)
{
initial();  // Initialisierung Ports etc.
while(1){}
}

von Ladungspumper (Gast)


Lesenswert?

Das ging ja fix!

Aber leider sieht es nach wie vor so aus.

Aber es macht natürlich absolut Sinn diese Werte nicht im Loop 
auszugeben, ändern sich ja eh nicht.

von Ladungspumper (Gast)


Lesenswert?

Hat sich erledigt, habe auf Phase Correct PWM umgestellt, jetzt gehts.

Danke :)

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.