Probleme bei 8fach ADC und PWM mit ATmega16

OP #1368104
Lesenswert?

Ich möchte mit Soft-PWM acht einzeln überwachte Akkus an ihre 
Ladschlussspannung bringen und dort halten. Der jeweilige PWM-Ausgang 
geht über 5,6KOhm auf die Basis eines BD238 (NPN). Der Kollektor bekommt 
5V Versorgungsspannung und der Emitter ist am Pulspol des Akkus 
angeschlossen. Der Minuspol des Akkus wiederum an Masse. Die 
ADC-Wandlung für den Akku liegt am Pluspol des Akkus.
Das ganze klappt mit einer ADC-Wandlung auch sehr gut. Sobald aber eine 
zweite ADC-Wandlung dazu kommt wird das Programm so langsam das man die 
Pulse der PWM mitzählen kann. Im GCC bin ich nicht fündig geworden.

Verwendet wird AVR-Studio 4.15; Pony-Prog 3.07a Beta; ATmega 16 16Mhz 
auf einem Pollin-Evaluationsboard

Die Fuses sind richtig, da andere Programm in der richtigen 
Geschwindigkeit ablaufen.

Vielleicht kann mir jemand mal auf die Sprünge helfen, denn ganz so fit 
bin ich noch nicht in der µC-Materie.
Angehängte Dateien:
#1368141
Lesenswert?

Splitte dein Programm in Funktionen auf!

Es ist doch Unsinn zb. den ADC Code 8 mal im Programm zu haben, wenn 
alles was sich ändert, die Kanalnummer ist. Da kann man auch eine 
Funktion schreiben, die die Kanalnummer erhält und den Messwert 
zurückliefert (die simple Variante).

Des weiteren willst du dich unbedingt über Timer informieren!
So ein Timer kann in regelmässigen Zeitabständen eine Funktion ausführen 
(die sog. Interrupt Service Routine oder ISR)

In der ISR kannst du deine PWM unterbringen und du kannst dort auch die 
ADC Wandlung eines Kanals anstossen, die du im nächsten ISR Aufruf 
auswertest. Bei jedem ISR Aufruf kommt reihum der nächste Kanal drann. 
Oder: Der ADC kann dich aber auch selbst über ein fertiges 
Wandlerergebnis mit einem Interrupt informieren, woraufhin in der 
zugehörigen ISR auf den nächsten Kanal geschaltet wird und die nächste 
Wandlung angestossen wird.

Kurz und Knapp: Dein ganzer jetziger Programmaufbau ist Sch....
So wirst du nicht zum Ziel kommen.
Möglichkeiten gibt es viele, aber so gut wie alle führen über Interrupts 
und ISR. Nur so kannst du erreichen, dass dein Programm mehr oder 
weniger x-Dinge 'gleichzeitig' macht.
OP #1370225
Lesenswert?

War wieder zu einfach mal dort nachzuschauen.

Habe mir die entsprechenden Artikel durchgelesen, komme aber nicht so 
wirklich weiter da die meisten Beispiele in Assembler sind.

Klar ist, das Programm soll geteilt werden. Ich denke, da die 
PWM-Regelung auf den PORT's PC0 bis 7 Zeitkritischer ist als die 
AD-Wandlung, sollten die ADC's per Interupt gestartet werden. Oder 
können beide ausgegliedert werden?
Wie fange ich das Ganze an? Soviel Erfahrung habe ich leider noch nicht.

Ein einfaches Beispiel zum Anschauen wäre nicht schlecht.

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