Forum: Mikrocontroller und Digitale Elektronik Duty-Cycle mit AtTiny2313 "messen"


von clorky (Gast)


Lesenswert?

Moin,

ich habe folgendes Problem:
ich möchte mithilfe meines AtTiny2313 einen Duty-Cycle auswerten. Der 
Cycle kommt von diesem Temperatursensor:

http://www.me.mcut.edu.tw/%2Fself_store%2F5%2Fself_attach%2FDS_SMT16030.pdf

Da ich recht frisch auf dem Gebiet bin, haben mir auch andere 
Forenbeiträge leider nicht geholfen...

Im Prinzip gibts glaube ich 2 Möglichkeiten: eine Schleife, die 
Hochzählt, solange der PIN HIGH ist.
Die zweite funktioniert wohl mit dem internen Timer und ist wesentlich 
"sauberer" programmiert.

Hier meine Idee zur Schleife:
1
   DDRD = 0b11100111; //Pin 4 als Eingang(Sensor)
2
  PORTD = 0b11111111; 
3
4
main(){
5
6
int time = 0; //Zeitvariable
7
while(1){
8
9
while(bit_is_set(PIND, 4)){
10
  time++;
11
  if(time>9999){
12
  time = 0;
13
  }
14
15
//Variable time ausgeben (Funktioniert)
16
    }
17
}

Was passiert ist, dass die Ausgabe immer Mist ist, z.B. die Zahl 0411. 
Resette ist den AtTiny, kommt wieder 0411.

Danke für eure Hilfe!

von Lehrmann M. (ubimbo)


Lesenswert?

clorky schrieb:
> Was passiert ist, dass die Ausgabe immer Mist ist, z.B. die Zahl 0411.
> Resette ist den AtTiny, kommt wieder 0411.

Woher weisst du das? Ist überhaupts gesichert, dass diese Ausgabe (wie 
auch immer sie aussehen mag) zu 100% richtig funktioniert?

- Kannst du eine Logik-Änderung am Eingangspin die immer zum Zeitpunkt 
n*411 auftritt ausschließen?

- Taktversorgung & Fuses ?

- Verbinde mal einen Taster + entsprechende Schaltung (s.Tutorial) an 
den Eingang und überprüfe ob du per Hand andere vielfache deines Wertes 
erreichen kannst.

von Frank B. (foobar)


Lesenswert?

In dem Datenblatt steht, daß das Tastverhältnis die Temperatur angibt. 
Du misst nur die Länge des High-Pulses und das auch noch falsch, da du 
die Zeitmessung jeweils vor der Messung zurücksetzen musst und für eine 
Pulsmessung erstmal einen Flankenwechsel feststellen musst. Hier ein 
Verbesserungsvorschlag:
1
int getLowTime()
2
{
3
  int time = 0;
4
  while (!bitIsSet()) {
5
    time++;
6
  }
7
}
8
9
int getHighTime()
10
{
11
  int time = 0;
12
  while (bitIsSet()) {
13
    time++;
14
  }
15
}
16
17
void main()
18
{
19
  int t1, t2;
20
  // der Pin kann hier auf high oder low sein, erstmal auf high warten,
21
  // falls der Pin auf low ist, sonst wird sofort mit der nächsten
22
  // Anweisung weitergemacht
23
  getLowTime();
24
25
  // jetzt ist der Pin garantiert auf high,
26
  // nun auf Flankenwechsel nach Low warten
27
  getHighTime();
28
29
  // jetzt ist der Pin gerade auf auf low gegangen, Low-Zeit messen
30
  t1 = getLowTime();
31
32
  // jetzt ist der Pin gerade auf auf high gegangen, High-Zeit messen
33
  t2 = getHighTime();
34
35
  // Formel: D.C. = 0.320+0.00470*t
36
  // nach t aufgelöst: t = (D.C.-0.32) / 0.00470
37
  if (t1 && t2) {
38
    // ggf. t1 und t2 vertauschen
39
    float dc = ((float) t1) / ((float) t2);
40
    float t = (dc-0.32f)/0.0047f;
41
    printf("Temperatur: %f °C\n", t);
42
  }
43
}

Mit float-Variablen geht die Berechnung am einfachsten. Wenn du die 
nicht hast, kann man das aber auch leicht in Festkommarechnungen per int 
umschreiben.

von Peter D. (peda)


Lesenswert?

Warum nimmst Du nicht die Input Capture Unit?
Damit geht es am einfachsten und genauesten.

Du must trotzdem über mehrere Perioden mitteln, da der Sensor einen sehr 
starken Jitter hat.

Bei 256 Perioden hast Du eine Meßrate von 4kHz / 256 = 15 Messungen/s, 
das sollte ausreichen.


Peter

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.