www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem bei Frequenzfolger mit ATmega8


Autor: Microwave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Community,

Ich würde gerne einen Frequenzkomparator mittels einem ATmega8 und einem 
VCO realisieren.
Dazu habe ich nun in BASCOM-AVR Code geschrieben, welcher grob folgende 
Funktion erfüllen sollte:
AKTIVIERE INTERRUPTS
STARTE HAUPTSCHLEIFE
{
     STARTE ALLE TIMER UND ÖFFNE ALLE INT-PINS
     ERZEUGE EIN PWM-SIGNAL MIT DEM TASTVERHÄLTNIS DUTY/1024
}

WENN DER TIMER ABGELAUFEN IST:
{
     VERGLEICHE DIE ZÄHLERSTÄNDE VON INT0 UND INT1
     JENACHDEM WELCHE DER BEIDEN VARIABLEN HÖHER IST,
     INKREMENTIERE ODER DEKREMENTIERE VARIABLE "DUTY"
}


WENN EINE STEIGENDE FLANKE AM INT0-PIN ENTDECKT WIRD:
{
     INKREMENTIERE ZÄHLERVARIABLE1
}

WENN EINE STEIGENDE FLANKE AM INT1-PIN ENTDECKT WIRD:
{
     INKREMENTIERE ZÄHLERVARIABLE2
}

Das Analog-Signal wird dann auf einen VCO gegeben.
Das Ausgangssignal vom VCO wird auf den einen INT-Pin zurückgeführt,
Das Referenzsignal wird auf den anderen INT-Pin geleitet.

Man kann das Verhalten eines Spannungsfolgers erkennen, bloss mit dem 
Unterschied, dass hier auf die Frequenz geachtet wird.


Leider funktioniert es mit diesem Code nicht richtig:
Getestet habe ich das ganze, in dem ich eine LED an PORTB.1 hängte,
einen Interruptpin auf Masse/VCC legte und den anderen mit dem E-Feld 
der Umgebung beaufschlagte (->50Hz-Brumm).
Unregelmässig leuchtende LEDs an den Kontrollausgängen der Interrupts 
zeigten, dass der Interruptteil funktionierte.
Also ging ich davon aus, dass sich der Mikrocontroller wie ein OP 
verhalten würde.
Der Ausgang PORTB.1 ging aber nie an den oberen oder unteren 
Spannungsanschlag.

Was habe ich wohl falsch gemacht in folgendem Code?




$regfile = "M8def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40

Dim Duty As Word
Const Reload = 0

Dim Counts As Word
Counts = 0

Dim Counts2 As Word
Counts2 = 0


Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.0 = Output
Led Alias Portb.2
Led2 Alias Portb.0

Config Timer1 = Pwm , Prescale = 1 , Pwm = 10 , Compare A Pwm = Clear Down
Config Timer0 = Timer , Prescale = 1024

On Timer0 Timer0_isr
On Int0 Int0_isr
On Int1 Int1_isr

Enable Timer0
Enable Interrupts




Duty = 512

Do
   Start Timer0
   Enable Int0
   Enable Int1
   Pwm1a = Duty
Loop

End


Timer0_isr:
   Disable Int0
   Disable Int1
   Stop Timer0
   If Counts > Counts2 Then
      Duty = Duty + 1
   Elseif Counts < Counts2 Then
      Duty = Duty - 1
   End If
   Counts = 0
   Counts2 = 0
Return


Int0_isr:
   Counts = Counts + 1
   Toggle Led
Return

Int1_isr:
   Counts2 = Counts2 + 1
   Toggle Led2
Return


Vielen Dank schonmal für eure Hilfe!

Autor: Microwave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verzeiht, ich möchte natürlich einen FrequenzFOLGER bauen. ;)

Autor: Ralli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, bei Google stößt man bei der Eingabe "Frequenzfolger" auf
esoterischen Quark. Da du hier ein eher sachlich orientiertes Publikum
hast, solltest du in simplen Worten mal beschreiben:

1) Welche Eingangssignale du hast

2) Warum ein µC

3) Was der draus machen soll

4) Welcher Idee zu deinem Lösungsansatz dahintersteckt

Üblicherweise verhalten sich µCs NICHT wie OPs!
(Falls damit Operationsverstärker gemeint sind - in Esoterik kennen
sich die meisten hier nicht so gut aus.)

Komparatoren vergleichen, xxx-Folger sollen das gerade NICHT tun.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mich wundert
Do
   Start Timer0
   Enable Int0
   Enable Int1
   Pwm1a = Duty
Loop

du hast keinerlei Synchronisierung zwischen der Timer-ISR und dieser 
Schleife hier. Der Interrupt kann dir an jeder beliebigen Stelle 
dazwischenknallen.

> Der Ausgang PORTB.1 ging aber nie an den oberen oder unteren
> Spannungsanschlag.

Das wundert mich eigentlich nicht. Du hast ja auch keinen Anschlag 
programmiert. Bei deinem Testaufbau ist die Erwartung, dass count immer 
auf 0 bleibt, während count2 immer auf ~3 oder 4 geht. Als Folge davon 
wird duty hochgezählt. Ständig. Bis die Variable überläuft.

Autor: Microwave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke erstmal für die schnellen Antworten:

Ausgangssituation ist folgende:

Ich möchte eine Istfrequenz auf eine Sollfrequenz abgleichen.

Die Referenzfrequenz kommt von der Sekundärspule einer SSTC, vom 
sogenannten "tank circuit" eines IHs oder auch vom Serienresonanzkreis 
einer DRSSTC.
Kurz und bündig kommt diese Sollfrequenz immer vom anzusteuernden 
Schwingkreis (in allen drei Fällen liegen solche vor).

Die Istfrequenz ist diejenige Frequenz, die die Schaltung nach dem VCO 
ausgibt.
Sie wird im wesentlichen galvanisch getrennt, verstärkt und zu den Gates 
der Brücke geleitet.
Diese kann als Halb- oder Vollbrücke ausgeführt sein, was uns jedoch 
vorerst nicht interessiert.

Nun soll einfach die Istfrequenz auf die Sollfrequenz abgestimmt werden, 
sprich, der resonante Schaltungsteil bestimmt, "wo es lang geht".

Ich dachte mir nun, wenn ich die Pulse des Referenzsignals 
(=SOLL-Frequenz) zählen würde und mit der Anzahl der vom VCO 
(=IST-Frequenz) kommenden Pulse vergliche, würde ich jeweilige 
Massnahmen einleiten können, was in diesem Fall lediglich bedeuten 
würde, die PWM-Spannung erhöhen oder herabzusetzen.

In erster Linie soll das ganze nun für weiterführende IH-Experimente 
verwendet werden, da es auf die Dauer ziemlich nervig ist, im 
50/50-Verhältnis mit den Augen zwischen Oszilloskopbildschirm (ist die 
Amplitude der Sinuswelle maximal???) und Werkstück (glüht es schon???) 
hin und her zu schalten. ;)

Wenn die Referenzfrequenz nun also 100kHz gross wäre und der VCO gäbe 
90kHz heraus, so würde man einen Unterschied in eben der Anzahl 
erfasster Pulse feststellen. Man würde die PWM-Spannung hinauf setzen, 
dass der VCO an seinem Steuereingang eine höhere Spannung erhält und 
somit höher schwingt.
Irgendwann wird sich die Frequenz eingependelt haben - bis ich das 
Werkstück aus der Spule entferne, bzw. z.B. die Curie-Temperatur 
erreicht wird.

Karl heinz Buchegger schrieb:
> Der Interrupt kann dir an jeder beliebigen Stelle
> dazwischenknallen.

Was wäre daran gravierend oder ein Grund für die Disfunktion des 
Programms?


Karl heinz Buchegger schrieb:
> Als Folge davon
> wird duty hochgezählt. Ständig. Bis die Variable überläuft.

Dann müsste die LED doch zwischenzeitlich extrem hell werden?
Aber die mittlere Helligkeit ist einfach geblieben...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Microwave schrieb:
> Wenn die Referenzfrequenz nun also 100kHz gross wäre

Ich sach mal, in Bascom kannst Du eine so hohe Frequenz nicht per 
Interrupt zählen.
Selbst in C oder Assembler dürfte es knapp werden, da Du noch 2 andere 
Interrupts hast.

Warum nimmst Du nicht einfach einen 74HC4046?


Peter

Autor: Microwave (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Klarheit, das hatte ich mir auch schon kurz überlegt, 
wollte es aber dennoch versuchen.

Weshalb ich keinen 4046 nehmen möchte?
Weil er bei mir nicht einrastet, aus welchem Grunde auch immer.

Soll ich wohl mal einen Schaltplan gestalten, dass es für euch 
vielleicht ersichtlich wird, wieso der HC4046/HC7046 nicht einrasten 
will?

Eine PLL würde nämlich wunderschönes ZCS bzw. ZVS ermöglichen, was 
natürlich das Optimum für derartige Spielchen wäre.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Microwave schrieb:
> Weshalb ich keinen 4046 nehmen möchte?
> Weil er bei mir nicht einrastet, aus welchem Grunde auch immer.

Man darf nicht den EXOR-Komparator nehmen, der hat ein lausiges 
Einrastverhalten.
PC2 (Pin 13) ist der beste.

Und dann mal an den RC des Loop-Filters spielen.


Peter

Autor: Jonas S. (microwave)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> PC2 (Pin 13) ist der beste.

So sehe ich das auch.
Zumindest bei Betrieb einer Teslaspule spann der aber auch.
Nun gut, eine TC hat ein unvorstellbar heftiges EM-Feld...

PC1 wäre deshalb gut, weil die PLL dann auf eine 90°-Phasenverschiebung 
zwischen Referenzeingang und Phasenkomparator-Eingang regelt.
Die 90° kann man nämlich wieder finden, wenn man mal die Spannung am 
Brückenausgang und die am Arbeitsschwingkreis des IHs miteinander 
vergleicht.


Mir ist noch etwas eingefallen:
Man könnte ja auch zwei Zählerbausteine mit "RESET" und etwas ähnlichem 
wie "INHIBIT" hernehmen, an deren Clock-Eingang die VCO-Ausgangsspannung 
bzw. die Feedback-Spannung anlegen und die Ausgänge auf den uC führen.

Dann muss man die beiden Bausteine nur noch eine definierte Zeit lang 
aktivieren, das Ergebnis einlesen (ggf. wandeln) und mit der Zählung #2 
vergleichen. Die Information über das Resultat könnte wiederum der 
PWM-Variable zugeführt werden (hier ja "Duty").

Man wäre dann ja wieder unabhängig vom Phasenbezug und würde lediglich 
darauf achten, dass die Frequenz des VCOs stimmt.

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.