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:
1
AKTIVIERE INTERRUPTS
2
STARTE HAUPTSCHLEIFE
3
{
4
STARTE ALLE TIMER UND ÖFFNE ALLE INT-PINS
5
ERZEUGE EIN PWM-SIGNAL MIT DEM TASTVERHÄLTNIS DUTY/1024
6
}
7
8
WENN DER TIMER ABGELAUFEN IST:
9
{
10
VERGLEICHE DIE ZÄHLERSTÄNDE VON INT0 UND INT1
11
JENACHDEM WELCHE DER BEIDEN VARIABLEN HÖHER IST,
12
INKREMENTIERE ODER DEKREMENTIERE VARIABLE "DUTY"
13
}
14
15
16
WENN EINE STEIGENDE FLANKE AM INT0-PIN ENTDECKT WIRD:
17
{
18
INKREMENTIERE ZÄHLERVARIABLE1
19
}
20
21
WENN EINE STEIGENDE FLANKE AM INT1-PIN ENTDECKT WIRD:
22
{
23
INKREMENTIERE ZÄHLERVARIABLE2
24
}
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?
1
$regfile = "M8def.dat"
2
$crystal = 16000000
3
$hwstack = 32
4
$swstack = 10
5
$framesize = 40
6
7
Dim Duty As Word
8
Const Reload = 0
9
10
Dim Counts As Word
11
Counts = 0
12
13
Dim Counts2 As Word
14
Counts2 = 0
15
16
17
Config Portb.1 = Output
18
Config Portb.2 = Output
19
Config Portb.0 = Output
20
Led Alias Portb.2
21
Led2 Alias Portb.0
22
23
Config Timer1 = Pwm , Prescale = 1 , Pwm = 10 , Compare A Pwm = Clear Down
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.
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.
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...
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
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.
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
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.