Duty-Cycle mit AtTiny2313 "messen"

Gast #1960578
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!
#1960605
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.
#1960615
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.
#1960705
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.