Hallo!
Ich stehe im Moment vor einem kleinen (großen) Problem:
Ich möchte mit Bascom ein Programm für einen ATtiny24 schreiben, das es
ermöglicht, anhand der Stellung eines DIP Schalters verschiedene
Frequenzen zu erzeugen.
Wie ich die PWM ansich erzeuge ist mir klar. Jedoch bin ich mir nicht
schlüssig darüber, wie ich dem Programm nun mitteilen kann, dass es bei
Schalterstellung X eine Frequenz von z.B. 33,0 Hz, bei Y 35,4 Hz und bei
Z 36,6 Hz erzeugen soll.
Kann mir da jemand auf die Sprünge helfen oder mir vielleicht anhand der
drei o.a. Frequenzen das eine oder andere Beispiel an den Kopf werfen?
Zwar hab ich bereits im Forum und auch über diverse Suchmaschinen
gesucht, konnte bisher aber leider nichts finden, woraus ich wirklich
schlau wurde.
Ich sag schonmal vielen Dank!
Gruß,
Kai
Tipp 1: Dipschalter kann man als (Binär-)Zahl einlesen (z.B. 3 Schalter
-> 0-7), diese Zahl kann man als Array-index benutzen
Tipp 2: Bei soo niedrigen Frequenzen nimmt man software-PWM (Ist
bestimmt bei Bascom schon eingebaut, aber das Bascom-Manual musst du
lesen, nicht ich ;) ). Bei Soft-PWM wird i.d.R eine Variable hoch (oder
auch runter, ist egal) gezählt, als zusätzlicher Teiler. Wie weit da
gezählt werden muss, kann man dann z.B. aus einem Array auslesen.
Also:
- lies nach, wie man in Bascom ein PWM-Signal ausgibt
- bau das so um, dass du die Frequenz einstellen kannst
- lies nach, wie man Dipschalter einliest (PINS, SChieberegister, oder
wieauchimmer)
- Ordne die Schalter-Stellungen den PWM-Einstellungen zu.
(Nennt man Divide-And-Conquer-Methode: Zerteil die Aufgabe in kleine
Teile, und löse die nacheinander).
hth. Jörg
ps: wozu brauchst du ein PWM-Signal mit einstellbarer FREQUENZ ?
Bei PWM stellt man doch normalerweise den 'Duty-Cycle' (die An/Aus-Zeit)
ein...
Hallo Jörg!
Danke für deine Antwort.
Wie ich grundsätzlich die PWM erzeuge stellt kein Problem dar. Dazu habe
ich mich hierdran orientiert:
http://www.roboternetz.de/wissen/index.php/Bascom_und_PWM#Grundprogramm
Mit dem Umbauen des Codes, so, dass je nach Schalterstellung eine andere
Frequenz erzeugt wird, hab ich meine Probleme.
Ich weiss leider nicht, was genau ich ändern muss/kann/darf und wie das
dann aussehen muss.
Der Rest, wie das Auslesen des DIP Schalters usw. ist keine große Hürde.
Die Schaltung soll am Ende insgesamt, abhängig von der Stellung des DIP
Schalters, 64 verschiedene Töne generieren und als externes CTCSS-Modul
für CB-Funkgeräte dienen.
Ich weiss, dass es solche Module fertig zu kaufen gibt, da ist aber das
Problem, dass sie 1. recht teuer und 2. i.d.R. unzulässig sind, da sie
ins Gerät eingebaut werden müssen. Darum mein Versuch, eine externe
Lösung zu bauen.
Die Hardware ist soweit auch schon fertig, es fehlt nur noch die
Programmierung. Und die bereitet mir schon seit einigen Wochen
Kopfzerbrechen.
Meinst du das CTCSS: http://de.wikipedia.org/wiki/CTCSS ?
Das wird ein bisschen komplizierter als ein 30Hz PWM-Signal.
Da musst du nämlich einen Ton erzeugen, d.h. ein schnelles
(Hardware-)PWM-Signal mit dem passenden Sinus modulieren (Stichworte:
Sinustabelle, DSS -> "Digital Signal Synthesis").
Sollte aber noch machbar sein.
hth. Jörg
Das ist mir schon klar.
Das PWM Signal wird durch einen Tiefpass geschickt und dort dann in ein
Sinus Signal umgewandelt. Das ist soweit alles gelöst.
Hier mal ein Ausschnitt des Codes für die PWM:
1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up Prescale = 1
2
3
Do
4
Compare1a = 255
5
Loop
6
7
End
Die Frage ist nun, ausgegangen vom ATtiny24 (1 MHz), was muss ich hier
ändern, um z.B. auf eine Frequenz von 33,0 Hz zu kommen?
Für solche Dinge lässt man den Tiny besser eine Sinuskurve abklappern
und die mit hoher PWM Frequenz ausgeben. Dann reicht ein simpler
Tiefpass und es sieht trotzdem nicht schlecht aus.
Als Beispiel kann die Applikations Note AVR314 von Atmel dienen. Hier
werden mit einem beliebigen AVR DTMF Touchtones erzeugt - also sogar
zwei Töne gleichzeitig.
Für die neuen Frequenzen muss man dann halt rechnen.
Kai schrieb:> Kann mir da jemand auf die Sprünge helfen oder mir vielleicht anhand der> drei o.a. Frequenzen das eine oder andere Beispiel an den Kopf werfen?
DDS
Der Seite von Jesper Hansen mit seinem miniDDS sind leider die Links zum
Code-Download abhanden gekommen.
http://www.radanpro.com/Radan2400/mikrokontroleri/Jesper's%20AVR%20pages%20-%20MiniDDS.htm
Der Kern ist eine kleine Assembler-Schleife, die sich per Inline
bestimmt auch in BASCOM umsetzen lässt.
Was du brauchst sind:
- eine Sinustabelle
- ein Phasenzähler
- ein DAC
- und ein Phaseninkrement, passend zu deiner Frequenz berechnet