Hi, ich hab hier einen Poti zwischen 5V und 0V hängen und greife in der mitte auf einen ADC ab. Das klappt auch soweit, jedoch möchte ich die Frequenz linear regeln, was in der jetzigen Programmierweise nicht passiert, da ich OCR1A neu belege und damit ja quasi die Periodendauer. Kann man diesen hyperbolischen Verlauf, der entsteht linearisieren mittels Formeln oder sollte ich vieleicht ganz anders an das Problem gehen?
ich nutze einen timer der einen compare interrupt auslöst, in der routine wird dann das ereignis bearbeitet, welches in der einstellbaren frequenz ablaufen soll.
Wenn du die Frequenz einstellen möchtest nimm den CTC Modus! Dann macht der Timmer das alles automatisch und du must nur einen neuen TOP Wert vorgeben. Halber Wert = Halbe Frequenz. Vieleicht ist das poti auch ein Logarithmisches und kein Lineares?
wenn du clear timer on compare match meinst, den benutze ich schon, das klappt auch wunderbar, allerdings halt nicht linear, da ich damit ja die Periodendauer festlege und wenn ich die linear ändere beeinflusst das die Frequenz hyperbolisch, aber korrigiert mich ruhig wenn ich falsch liege.
also meiner Schätzung nach müsste es linear sein, denn ich gebe im moment zu testzwecken auch den wert des ADC mit aus und der verhält sich meiner meinung nach durchaus linear. Ich hatte schon evtl. daran gedacht eine Funktion zu überlagern um annähernd eine Linearität zu erreichen, aber da stehe ich im Moment leider auf dem Schlauch.
was heist denn "Schätzung"? Hast du es gemessen oder nicht? Wenn du den TOP Wert entsprechend änderst und es zu keinen unbedachten Überläufen kommt muss die Frequenz auf jeden Fall indirekt proportional zu diesem sein.
naja, das Poti ist linear, zumindest reicht es meinen Anforderungen von der linearität her. Wenn ich die Frequenz errechne mit f=fcpu/((OCR+1)*Prescale) und verändere OCR linear, dann bekomme ich ja eine Funktion der Form: a*1/x+b, somit ist diese ja nichtmehr linear. Und genau das macht mir Probleme. Ich hoffe es ist jetzt verständlicher was ich meine.
Hallo Anreas, du bist auf dem richtigen weg. Du must rechnen. Die Frequenz soll linear geändert werden je nach AD-Wert. -> f = fmin + a * ADCW fmin ist deine Startfrequez, a deine Steigung (wieviele Hertz pro AD-Step azukommen) Aus fmin ergibt sich auch der Prescal da der Zähler nur 16 Bit hat. Dann den OCR berechnen: -> OCR = fcpu / (f * Pres) Einige Werte können vorab festgelegt/berechnet werden um schneller zu werden. avr
Also den Prescaler hab ich auf 1024 festgelegt und dann habe ich mir den OCR bereich so gewählt, dass ich 10-600 bpm erreichen kann vom wertebereich, dadurch entstand die formel: OCR1A=780+(value-50)*47.37307 mit if (value<50) value = 50; vorangestellt, da das poti von 0 auf 50 zu springen tendiert und ich den bereich dann tot setzen möchte. Trotzdem bekomme ich grade im bereich um die 600 bpm extrem schnelle Änderungen vom Wert her und im Bereich von 10 bpm muss ich richtig kurbeln dass sich überhaupt der wert ändert. Danke schonmal für die ausfürlichen Antworten!
Hallo Andreas, du must beachten: F = 1 / T <-> T = 1 / F Dein OCR ist ein Zeitwert, dein AD-Wert soll porportional zur Frequenz sein. Ohne eine Division wird das nichts! avr
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.