Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem beim Subtrahieren zweier Werte in C (bitweise?) (https://www.delphipraxis.net/124181-problem-beim-subtrahieren-zweier-werte-c-bitweise.html)

Matze 16. Nov 2008 12:14


Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hi zusammen,

ich lese in einem Mikrocontroller 2 Werte über einen AD-Wandler ein (10 Bit). Ich möchte nun je nach Differenz etwas anderes ausführen. Aktuell ist mir das aber zu sensibel. Ebenfalls, wenn ich nur die obersten 9 Bits nutze. Die obersten 8 sind wiederum zu grob aufgelöst.

Daher möchte ich einen Delta-Wert einführen und sobald eine Differenz großer ist als dieser Wert, soll etwas passieren.

Aktuell mache ich das so:

Code:
#define DELTA_TEMP 2
uint16_t previous_temp_val, current_temp_val;
// ...

// Temperatur steigt
if ((previous_temp_val < current_temp_val) &&
   (current_temp_val - previous_temp_val >= DELTA_TEMP))
{
  // ...
Nur funktioniert das leider nicht richtig. Darf ich das einfach so subtrahieren oder muss ich sonst etwas bestimmtes beachten?

Evtl. kann man den eingelesenen Wert (er entspricht einer Temperatur) auch umrechnen und den Delta-Wert in Grad Celsius angeben. Das habe ich jedoch nicht hinbekommen.

Gegeben ist folgendes:
10-Bit AD-Wandler: 0V entsprechen dem Wert 0, 5V dem Wert 1024
Der Temperatursensor liefert pro Kelvin einen Anstig/Abfall von 10mV.

Versucht habe ich das so: Grad = 1024 / (5 / 0,01) = 2.x
D.h. ein Kelvin würde einem Wert von 2.x entsprechen und das müsste mein Delta-Wert (= 2) sein, den ich brauche, oder nicht? :gruebel:

Grüße, Matze

Klaus01 16. Nov 2008 12:23

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Wie sieht es denn aus, wenn Di so wie unten klammerst?

Code:
#define DELTA_TEMP 2
uint16_t previous_temp_val, current_temp_val;
// ...

// Temperatur steigt
if ((previous_temp_val < current_temp_val) &&
   ((current_temp_val - previous_temp_val) >= DELTA_TEMP))
{
  // ...
Grüße
Klaus

Matze 16. Nov 2008 12:27

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hallo Klaus,

das ändert leider nichts. Wobei ich noch dazusagen muss, dass bei Erwärmung schnell erkannt wird, dass die Temperatur steigt, bei Abkühlung dauert das allerdings rund eine Minute und das ist definitiv zu lang.

Grüße

Edit: Mein Code sieht so aus:
Code:
// Temperatur steigt
if ((previous_temp_val < current_temp_val) &&
   ((current_temp_val - previous_temp_val) >= DELTA_TEMP))
{
   // ...
}
// Temperatur sinkt
else if ((previous_temp_val >= current_temp_val) &&
   ((previous_temp_val - current_temp_val) >= DELTA_TEMP))
{
   // ...
}
// Temperatur konstant
else
{
   // ...
}

Macci 16. Nov 2008 12:38

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hi,

du könntest deine if-Abfrage schöner formulieren:

Code:
// Temperatur steigt
if (previous_temp_val + DELTA_TEMP <= current_temp_val) {
  // ...
das Problem liegt aber nicht daran, ich denke eher, dass beim Einlesen der Daten etwas schief geht. Probier doch mal einen Breakpoint vor dieser if-Abfrage zu setzen, und schau dann nach, wie die beiden Werte lauten.

Viele Grüsse,
Macci

Matze 16. Nov 2008 12:50

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hallo,

ich habe das nun mit einem int16 und der Differenz gelöst. Dann kann ich auf "größer" und "kleiner" abfragen.
Einen Breakpoint zu setzen bringt mir leider nichts, da ich keine Rückleitung vom MC zum Laptop habe und das somit nicht auswerten kann.

Grüße

messie 16. Nov 2008 13:27

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Zitat:

Zitat von Matze
Nur funktioniert das leider nicht richtig. Darf ich das einfach so subtrahieren oder muss ich sonst etwas bestimmtes beachten?

Nur so aus Interesse: was kam denn raus, bzw. wie äußerte sich der Fehler?
Zitat:

Zitat von Matze
D.h. ein Kelvin würde einem Wert von 2.x entsprechen und das müsste mein Delta-Wert (= 2) sein, den ich brauche, oder nicht? :gruebel:

Ja, ein Grad entspricht etwa 2 digits.
Wie schnell heizt Du denn auf? Du sagtest ja, dass das Reagieren zeitkritisch sein könnte? Ist Dein Sensor denn schnell genug?

Grüße, Messie

Matze 16. Nov 2008 13:35

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hallo,

der Sensor regiert schnell genug, denn wenn ich die vollen 10 Bit nehme, dann wechselt das sehr flott. Das Problem ist nur, wenn ich bsp mit dem Finger auf den Sensor lange, dann zeigt der MC mir per LED eine steigende Temp. an, wechselt dann zur konstanten Temp. und wieder zur sinkenden. Immer hin und her.

Ich habe aber eh das Problem, dass ich gar nicht genau weiß, wie ich feststellen kann, ob die Temperatur zugenommen hat. Ich darf der Variablen mit dem alten Wert den neuen gar nicht zuweisen, denn sonst kann es sein, dass die Temperatur weiter steigt, aber geringer als das Delta und dann wird mir eine konstante Temperatur angezeigt.

Grüße

messie 16. Nov 2008 13:46

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Da würde ich evtl. einen Index mitlaufen lassen. Wenn i > i-1 wird der Zähler hochgezählt, sonst gehalten oder runtergezählt. Wenn Du eine Schwelle von n Samples hochgezählt hast, hat es eine wirkliche Steigerung gegeben und Du kannst den Wert übergeben.

Grüße, Messie

Matze 16. Nov 2008 13:50

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hm, verstehe ich nicht ganz. Aktuell habe ich es so:

Code:
current_temp = 0;
old_temp = 0;

// ...

current_temp = ADC_Wert;

if (old_temp == 0)
  old_temp = current_temp;

// ...
// diff berechnen etc.
// ...

// Temp. steigt
if (diff >= DELTA)
{
  // mach was
  old_temp = current_temp;
}
// Temp. sinkt
else if (diff <= -DELTA)
{
  // mach was
  old_temp = current_temp;
}
// Temp. konst.
else
{
  // mach was
}
Und das geht leider nicht, da die Temperatur bsp. steigt, mir das signalisiert wird und weitersteigt. Wenn das langsam weitersteigt, würde die Differenz so kleiner sein als DELTA und mir eine konstante. Temperatur anzeigen.

Grüße

markusj 16. Nov 2008 14:00

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Dem könntest du z.Bsp entgegnen, in dem du dir die Temperatur merkst, bei der du zum ersten Mal unterhalb des Deltas lagst.
Definierst du dann noch einen Toleranzbereich um diese Temperatur herum, schlägt das ganze erst wieder an, wenn du aus diesem Bereich herausgerutscht bist. Solange du dich innerhalb des Fensters bewegst (das z.Bsp Delta-Groß sein könnte), gehst du von einer konstanten Temperatur aus.

mfG
Markus

Matze 16. Nov 2008 14:22

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hm, sowas in der Ar thabe ich doch. Das Problem dürfte doch weiterhin sein, dass ich in folgendem Fall nicht fesytstellen kann, ob die Temperatur weitersteigt:

Delta: 1°C

Alte Temperatur: 19°C
Aktuelle Temperatur: 20°C
=> Temperatur steigt

So, nun muss ich doch den alten Temperaturwert irgendwie verändern, damit ich im nächsten Zyklus prüfen kann, wie sich das weiter verändert hat. Wenn das weiter steigt (auch wenn es nur 0.2°C) sind, dann darf unter keinen Umständen eine konstante Temperatur angezeigt werden, auch wenn ich kleiner als das Delta bin.
Muss ich vielleicht boolsche Variablen für die 3 Status einfügen (is_rising etc.) und diese entsprechend setzen und irgendwie abfragen und neu zuweisen? Also wenn is_rising = 1 ist, dass ich dann irgendwie prüfe, bis der Wert konstant ist oder sinkt und dann die Status neu setze?


Wenn ich Messis Lösung nutzen würde, dann könnte ich ja bsp. ein Delta von 0.5°C vorgeben und den Zähler hochzählen, wenn die Differenz 0.1°C ist. Ist der Zähler 5, habe ich mein Delta erreicht und mache etwas. Doch dann müsste ich den Zähler wieder auf 0 setzen. Somit wäre in dem Moment die Signalisierung für die Temperatur konstant. Wenn die Temperatur dann weitersteigt, dann dauert es wieder mind. 5 Schritte, bis ich die LEDs zum signalisieren der steigenden Temperatur anschalten kann.
Das heißt, wenn es langsam steigt, geht die LED, die eine steigende Temperatur signalisiert, immer aus und an.

Klaus01 16. Nov 2008 15:44

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Zitat:

Zitat von Matze
... Wenn das weiter steigt (auch wenn es nur 0.2°C) sind, dann darf unter keinen Umständen eine konstante Temperatur angezeigt werden, auch wenn ich kleiner als das Delta bin.
...

Hallo Matthias,

mal eine ketzerische Frage, warum brauchst Du dann das Delta?

Grüße
Klaus

haentschman 16. Nov 2008 16:27

Re: Problem beim Subtrahieren zweier Werte in C (bitweise?)
 
Hallo Matze...

nur rein als Anregung gedacht :wink:

ich verstehe den Sinn der LED nicht so ganz. :gruebel:
- warum willst du eine steigende oder fallende Temperatur signalisieren ?
- warum spielt die Geschwindigkeit der Temperaturveränderung eine Rolle ?
- das was du mit der Klappe vorhast nennt man Zweipunktregelung.
siehe Technische Informationen:
- Zweipunkt-Regelung
- Hysterese
- viel wichtiger ist, daß eine Aktion ausgeführt wird, wenn die Temperatur einen Sollwert um eine Differenz (Hysterese) übersteigt bzw. unterschreitet.
- eventuell eine Signalisation, daß die Temperatur den oberen Grenzwert überstiegen bzw. den unteren Grenzwert unterschritten hat.
- alles was dazwischen liegt ist regelungstechnisch unrelevant (weil nicht wirklich aussagekräftig)

PS: vieleicht solltest du die digitalen Werte, welche der DA Wandler liefert experimentell ermitteln. Einmal mit Eiswasser den 0° Punkt und mit kochendem Wasser den 100° Punkt. Da Temperaturfühler in der Regel lineare Werte liefern kannst du dir dann alle Zwischenwerte ausrechnen.

technische Informationen Regelung

:hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz