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?
Ich bin da zwar kein Profi, aber verursacht PWM hier nicht unerwünschte Störungen / Interferenzen ?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.