mikrocontroller.net

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


Autor: clorky (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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:
   DDRD = 0b11100111; //Pin 4 als Eingang(Sensor)
  PORTD = 0b11111111; 

main(){

int time = 0; //Zeitvariable
while(1){

while(bit_is_set(PIND, 4)){
  time++;
  if(time>9999){
  time = 0;
  }

//Variable time ausgeben (Funktioniert)
    }
}

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!

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht 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:
int getLowTime()
{
  int time = 0;
  while (!bitIsSet()) {
    time++;
  }
}

int getHighTime()
{
  int time = 0;
  while (bitIsSet()) {
    time++;
  }
}

void main()
{
  int t1, t2;
  // der Pin kann hier auf high oder low sein, erstmal auf high warten,
  // falls der Pin auf low ist, sonst wird sofort mit der nächsten
  // Anweisung weitergemacht
  getLowTime();

  // jetzt ist der Pin garantiert auf high,
  // nun auf Flankenwechsel nach Low warten
  getHighTime();

  // jetzt ist der Pin gerade auf auf low gegangen, Low-Zeit messen
  t1 = getLowTime();

  // jetzt ist der Pin gerade auf auf high gegangen, High-Zeit messen
  t2 = getHighTime();

  // Formel: D.C. = 0.320+0.00470*t
  // nach t aufgelöst: t = (D.C.-0.32) / 0.00470
  if (t1 && t2) {
    // ggf. t1 und t2 vertauschen
    float dc = ((float) t1) / ((float) t2);
    float t = (dc-0.32f)/0.0047f;
    printf("Temperatur: %f °C\n", t);
  }
}

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.