in meinem letzten Project (Anzeige für digitale Messschieber) habe ich eine akustische Limit Überwachung eingebaut. Funktioniert (oder besser soll so funktionieren) wie ein Abstandswarmer. Also ab Messwert X% vom Limit beginnt ein Interwallton, dessen Intervalle kürzer werden und ab ca. 98% in Dauerton übergehen. Wie ich es bisher gemacht habe: - Ein 1kHz clock geht an einen Pin an dem ein Piezobuzzer hängt. - Der Pin wird durch einen PWM eneabled. Also 1kHz wird nur für die dutyCycle durchgelassen. Die PMW arbeitet mit einer Periode von ca. 500ms Geht soweit. Probleme: - Setze ich nur den Abstand Limit/Messwert als dutyCycle um klingt es irgendwie blöd, weil sich ja an der Frequenz (Periode PMW) nichts ändert - Ändere ich mit dem Abstand die PWM-Frequenz klingt es zwar besser aber auch noch nicht so wie man es von einem Abstandswarmer gewohnt ist. - Auch die Kombination von Beidem (Periode und dutyCycle) ist irgendwie noch nicht das Wahre. Hab so das Gefühl, als wenn die lineare Umsetzung Abstand/PMW-Periode das Problem ist. Hat jemand eine Idee, wie man sowas besser machen kann? Danke Reiner
Reiner W. schrieb: > Hab so das Gefühl, als wenn die lineare Umsetzung Abstand/PMW-Periode > das Problem ist. Natürlich. 50cm auf 40cm ist 10cm und 20% 20cm auf 10cm ist 10cm und 50% > Hat jemand eine Idee, wie man sowas besser machen kann? Abstand merken, bei der nächsten Abfrage Verhältnis zueinander ausrechnen, Frequenz um diesen Faktor erhöhen / verringern.
Marc Vesely schrieb: > Abstand merken, bei der nächsten Abfrage Verhältnis zueinander > ausrechnen, Frequenz um diesen Faktor erhöhen / verringern. Danke, für deine Antwort. Bin mir aber nicht ganz sicher, ob ich dich korrekt verstehe. Eigentlich mache ich das ja schon so:
1 | (void) beep (uint16 MessWert) { |
2 | uint16 Limit; |
3 | uint8 dcProzent = Messwert * 100 / Limit; // Messwert ist dcProzent vom Limit |
4 | |
5 | /*Abstand der High Pulse wird kleiner je näher der Messwert dem Limit kommt*/
|
6 | uint8 PMW_Periode = 255 - dcProzent; // 255 -> f/255 ... f/155 |
7 | |
8 | /*Umrechnung Compare Wert an geänderte Priode
|
9 | damit bleibt der dutyCycle (dcProzent) umabhängig von der Periode*/
|
10 | uint8 PMW_Compare = dcProzent * PMW_Periode / 100; |
11 | |
12 | PMW_Write_Period(PMW_Periode); //Write Period to PMW |
13 | PMW_Write_Compare(PMW_Compare); //Write Compare to PMW |
14 | }
|
Oder hab ich da was nicht verstanden?
Reiner W. schrieb: Was, genau, macht diese Funktion mit dem übegebenen Wert: > PMW_Write_Compare(PMW_Compare); //Write Compare to PMW Wenn ich das jetzt richtig im Ohr habe, dann sind die Piepser meines Rückfahrpiepsers im Auto immer gleich lang. Nur das INtervall dazwischen ist anders. Wenn die Funktion PWM_Write_Compare da also nicht noch rumrechnerein mit dem Wert macht (weil es zb Prozent erwartet), dann sollte es doch eigentlich ein konstanter Wert hier tun?
Karl Heinz schrieb: > Wenn ich das jetzt richtig im Ohr habe, dann sind die Piepser meines > Rückfahrpiepsers im Auto immer gleich lang. Nur das INtervall dazwischen > ist anders. Hmmm. Ich glaube du hast Recht, werde es aber noch ausprobieren. Reiner W. schrieb: > Bin mir aber nicht ganz sicher, ob ich dich > korrekt verstehe. Eigentlich mache ich das ja schon so: Da das alles sowieso subjektiv ist, würde ich es an deiner Stelle mit einer Tabelle versuchen. 100 Bytes sind nicht viel, die ganze Umrechnerei nimmt ja fast soviel. Dann kannst du es auch so einstellen, wie es dir am besten erscheint.
Karl Heinz schrieb: > Wenn ich das jetzt richtig im Ohr habe, dann sind die Piepser meines > Rückfahrpiepsers im Auto immer gleich lang. Nur das INtervall dazwischen > ist anders. Ja, da hast du recht. Ich verändere hier neben der Frequenz zusätzlich noch den dutyCycle. Aber ich glaub auch, dass das das nicht nötig ist. Der Constanze Wert müsste dann wohl
1 | PMW_Periode / 2 |
sein, wenn immer ein DC von 50% eingestellt sein soll. Muss ich nur noch rumspielen, wie man den DC praktisch auslegt. Marc Vesely schrieb: > Da das alles sowieso subjektiv ist, würde ich es an deiner Stelle > mit einer Tabelle versuchen. 100 Bytes sind nicht viel, die ganze > Umrechnerei nimmt ja fast soviel. Ja, ich tendiere auch dazu. Ich denke, dass es sich vlt. genau wie mit der Lichtstärke verhalten könnte. Wahrscheinlich sollte die Frequenz logarithmisch zunehmen. Werde ich heute mal ausprobieren. Da ich ja mit recht wenigen Stufen klarkommen würde, könnte ich ja ein bit durch ein UINT8 oder UINT16 schieben und hätte dann ja einen quadratisch ansteigenden Wert. Danke für die Hilfe
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.