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
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
#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){} }
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.