www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik F/U-Wandler mit Controller


Autor: Mathe Fan (bob37)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin anfänger in bereich Microcontroller-Programmierung.
ich möchte ein Frequenz/Spannung Wandler mit dem Microcontroller
ATmega8535 in AVR Studio mit C programmieren. Am Eingang ist ein
Rechtecksignal (Frequenz 0.....4kHz) und am Ausgang soll eine Konstante
Spannung mittel PWM sein (0.....10V).
Die Frequenz am Eingang ändert sich, d.h. die Frequenz ist proportional
zur Ausgangspannung.

Meine Idee ist: Das ankommende Signal an den Input Capture Pin ICP1 des
Controllers anschließen. Nun kann entweder ein Signalwechsel von 0 nach
1 (steigende Flanke) oder von 1 nach 0 (fallende Flanke) erkannt werden
und der zu diesem Zeitpunkt aktuelle Zählerstand in ein spezielles
Register abgelegt werden. Gleichzeitig  kann auch ein entsprechendes
Interrupt ausgelöst werden. Die Periodendauer ist umgekehrt proportional
zur Ausgangspannung. im Programm muss noch der Zusammenhang zwischen
Frequenz und Spannung geschrieben werden.

Problem: ich weiß nicht, wie ich die Periode messen muss,
         in welchem Register meinen Periodenwert liegt,
         wieviele Interrupte Brauche ich dafür und wieso?
         wie kann ich PWM verwenden um meine Spannung analog zu
          bekommen.

das alles ist nur ein Teil der Aufgabe und ich muss ohne MONOFLOP 
gemacht werden.
Danke.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Muss ohne Monoflop gemacht werden"... Übungsaufgabe für einen Kurs?

Dein Lösungsansatz passt schon, ICP auf Steigende Flanke stellen, bei 
IRQ Zählerwert speichern, ICP auf Fallende Flanke umkonfigurieren, 
wieder Zählerwert speichern.

Aus den Zwei Werten kannst du dann einfach das ON/OFF Verhältniss 
berechnen und per PWM ausgeben.
Dahinter noch ein LC-Filter und nen OpAmp mit Verstärkung 2, dann kommt 
auch ein 0V..10V Signal raus.

/Ernst

Autor: Mathe Fan (bob37)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke Ernst,

>Problem: ich weiß nicht, wie ich die Periode messen muss,
>         in welchem Register meinen Periodenwert liegt,
>         wieviele Interrupte Brauche ich dafür und wieso?
>         wie kann ich PWM verwenden um meine Spannung analog zu
>          bekommen.

aber ich weiß nicht wie ich das alles auf C umsetzen muss. kannst du mir 
ein Beispiel erklären.
 was ist eigentlich IRQ ????

danke

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathe Fan wrote:

> aber ich weiß nicht wie ich das alles auf C umsetzen muss. kannst du mir
> ein Beispiel erklären.
Hab das Datenblatt für deinen Controller nicht da, nehm stattessen das 
vom Tiny2313. Sollte aber ähnlich sein

Erstmal den 16Bit Timer1 starten. Frequenz nicht zu hoch, damit wir uns 
nicht mit mehreren Überläufen innerhalb einer Periode rumschlagen 
müssen.

Den Noise-Canceler schalten wir ein, schaden tut er nicht, und leicht 
prellende Signale werden ausgefiltert.

TCCR1A=0;
TCCR1B=_BV(ICNC1)|_BV(CS11);

Der Timer zählt mit F_OSC. Bei 8MHz Takt sollte eine ganze 4kHz Periode 
also 2000 Zählerschritte lang sein. Das ist schnell genug für ne gute 
Auflösung, wird aber nicht überlaufen wenn es das nicht soll.

Interrupt dafür einschalten:
TIMSK |= _BV(ICIE1);
sei();


dazu ne ISR:
uint16_t startzeit;
uint16_t highzeit;
uint16_t periodendauer;
ISR(Timer1_CAPTURE_vect) {
 if (TCCR1B & _BV(ICIES1) {
   // Das war eine steigende Flanke, wir haben also grad den LOW-Bereich vermessen
   periodendauer = startzeit;
   startzeit=ICR1;
   periodendauer=startzeit-periodendauer;
   TCCR1B &=~_BV(ICIES1);
 } else {
  // Das war eine fallende Flanke, wir haben den HIGH-Bereich vermessen
   highzeit=ICR1-startzeit;
   TCCR1B |= _BV(ICIES1);
 }
}
Später dann einfach "highzeit / periodendauer" auswerten.


>  was ist eigentlich IRQ ????
>
"Interrupt Request" also Interrupt-Anfrage.
in dem Zusammenhang: "ISR"==Interrupt Service Routine

/Ernst

Ach ja, die Syntaxfehler, Berechnungsfehler, und Initialisierungsfehler 
sind alle volle Absicht g. Ein bischen Aufwand muss ja bei so'ner 
Hausaufgabe auch übrigbleiben. Und mit dem Datenblatt und etwas Mathe 
ist das ja gleich in Ordnung gebracht.

Autor: Philipp Co (ba4_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@bob37 Du bist nicht zufällig der aus dem Roboternetz? Mir kam nur das 
Problem und auch der Lösungsansatz extrem bekannt vor :)

Und wenn dem so ist, kann es sein, dass Du noch nicht wirklich viel 
Ahnung von µC hast? Vielleicht wäre es besser erstmal ein Tutorial 
durchzuarbeiten, danach sollte sich dein Problem auch leicht lösen 
lassen.

Gruß Philipp

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da du am eingang ja nur eine Frequenz hast die du in eine Spannung 
wandeln willst musst du nur auf Steigende- (ODER fallende-) Flanke 
triggern. Das umstellen ist nur nötig wenn du auch das 
puls-/pausen-verhältnis vom eingangssingal messen willst. Das macht das 
ganze noch mal einfacher.

Insgesammt nur n paar zeilen code (in assembler zumindest c kenn ich 
mcih nich so gut aus) und der controller langweilt sich dabei auch noch.

Autor: Philipp Co (ba4_philipp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathe Fan wrote:
>...
> Meine Idee ist: ...
>...

Der war übrigens nicht schlecht ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.