Forum: PC-Programmierung Auswertung Temperatursensor über RS232


von blubb (Gast)


Lesenswert?

Hallo,

ich habe einen Temperatursensor SMT 160-30, der ein PWM-Signal ausgibt 
über die serielle Schnittstelle an meinen Rechner angeschlossen. Die 
Abfrage des Signals funktioniert auch. Jetzt habe ich aber noch Probleme 
mit der Auswertung.

Das PWM-Signal hat eine Frequenz von 2-4 KHz. Ich arbeite mit Visual C++ 
6.0.
Ich muss nun das Verhältnis zwischen High- und Low-Pegel-Dauer messen.


Bisher habe ich folgenden Code:

int k=0;
int high=0;
int Signal;
double Durchl=100000.0;    //double um beim teilen einen float-Wert zu 
erhalten

while(k<Durchl)
{
  Signal=m_rs232.GetCDHolding();   //Signal neu einlesen
  high+=Signal;
  k++;
}

m_Temp=(((high/Durchl)-0.32)*212.77);

Mit diesem Code habe ich nun leider Schwankungen von teilweise mehr als 
4° und eine CPU-Auslastung von 60-100%.

Hat jemand eine Idee wie ich die Auswertung verbessern kann? Habe schon 
versucht, zuerst eine Flanke zu erkennen und dann erst mit der Messung 
zu starten um nicht mittendrin zu zählen anzufangen. Geht mit wenig 
Aufwand jedoch nur beim Start der Messung. Und es treibt die 
CPU-Belastung noch weiter hoch.... :(

von H.H. (Gast)


Lesenswert?

Moin,es wäre vielleicht sinnvoller das PWM Signal mit einem Mikro 
auszuwerten, und dann die Daten seriell zum PC schicken

von Karl H. (kbuchegg)


Lesenswert?

Das Problem dürfte an dieser Stelle wohl Windows sein.
In Windows hast du nun mal keine Garantie dafür, dass
du absolut konstate Durchlaufzeiten durch dein Programm
hast. Windows ist nun mal ein Multitasking System, dass
deinem Prozess zu jeder Zeit den Prozessor entziehen kann.
Und wenn Windows im Hintergrund beschliesst den Speicher
aufzuräumen, hast du sowieso schlechte Karten.

Die einfachste Lösung, wie H.H. schon anmerkte, dürfte
wohl der Einsatz eines externen µC seins, der die
Messwerte ausmisst und das Ergebnis über RS232 mitteilt.

von blubb (Gast)


Lesenswert?

Das Problem ist, dass mir die Aufgabe so vorgegeben wurde und ich das 
jetzt irgendwie lösen muss ohne µC.

Die Durchlaufzeit der Schleife wäre ja prinzipiell egal um lediglich das 
Verhältnis zu kriegen, das Problem ist glaub nur, dass dann bei 
Unterbrechungen auch bei "unvollständigen" Peridoden gezählt wird.

von Karl H. (kbuchegg)


Lesenswert?

dann miss die Zeit nicht über Schleifendurchläufe
sondern mittels clock()

Also:
Warten auf steigende Flanke
momentane Zeit mittels clock feststellen -> T1
Warten auf fallende Flank
momentane Zeit mittels clock feststellen -> T2
Warten auf steigende Flanke
momentane Zeit mittels clock feststellen -> T3


gesammte Zeit:  T3 - T1
Low-Zeit  T3 - T2
High-Zeit T2 - T1

von Karl H. (kbuchegg)


Lesenswert?

Wenn clock() nicht genügend Auflösung bietet:
Entweder über mehrer Flanken messen
oder einen höher auflösenden Timer benutzen.
Die High-Performance-Counter von Windows könnten
da weiter helfen.

von Johnny (Gast)


Lesenswert?

Ohne Zusatzhardware wird das auf diese Weise nie vernünftig 
funktionieren mit dem seriellen Port.

Evtl. kannst Du mit dem Signal auf den Eingang der Soundkarte gehen und 
dann in der Software einen Mittelwert des PWM-Signals bilden.

von Karl heinz B. (kbucheg)


Lesenswert?

> Ohne Zusatzhardware wird das auf diese Weise nie vernünftig
> funktionieren mit dem seriellen Port.

Da hat er allerdings recht.

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.