Forum: Mikrocontroller und Digitale Elektronik Problem bei Frequenzfolger mit ATmega8


von Microwave (Gast)


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:
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
24
Config Timer0 = Timer , Prescale = 1024
25
26
On Timer0 Timer0_isr
27
On Int0 Int0_isr
28
On Int1 Int1_isr
29
30
Enable Timer0
31
Enable Interrupts
32
33
34
35
36
Duty = 512
37
38
Do
39
   Start Timer0
40
   Enable Int0
41
   Enable Int1
42
   Pwm1a = Duty
43
Loop
44
45
End
46
47
48
Timer0_isr:
49
   Disable Int0
50
   Disable Int1
51
   Stop Timer0
52
   If Counts > Counts2 Then
53
      Duty = Duty + 1
54
   Elseif Counts < Counts2 Then
55
      Duty = Duty - 1
56
   End If
57
   Counts = 0
58
   Counts2 = 0
59
Return
60
61
62
Int0_isr:
63
   Counts = Counts + 1
64
   Toggle Led
65
Return
66
67
Int1_isr:
68
   Counts2 = Counts2 + 1
69
   Toggle Led2
70
Return


Vielen Dank schonmal für eure Hilfe!

von Microwave (Gast)


Lesenswert?

Verzeiht, ich möchte natürlich einen FrequenzFOLGER bauen. ;)

von Ralli (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Was mich wundert
1
Do
2
   Start Timer0
3
   Enable Int0
4
   Enable Int1
5
   Pwm1a = Duty
6
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.

von Microwave (Gast)


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...

von Peter D. (peda)


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

von Microwave (Gast)


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.

von Peter D. (peda)


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

von Jonas S. (microwave)


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.

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
Noch kein Account? Hier anmelden.