Forum: Mikrocontroller und Digitale Elektronik Warnton bei Annäherung


von Reiner W. (reiner_w)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Reiner W. (reiner_w)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Reiner W. (reiner_w)


Lesenswert?

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