www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SMT 160 Verständnisfrage Pulsbreitenmodulation


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei einen SMT 160 an einen Atmega 16 anzuschließen und 
habe dazu noch eine grundsätzliche Frage.

Ich habe http://www.goblack.de/desy/digitalt/sensoren/smt16... 
und das Datenblatt des Sensors durchgelesen und verstehe nicht was unter 
einem Arbeitstakt von 1-4khz zu verstehen ist.

In bezug auf das Rechtechsignal goblack.de dachte ich bisher immer das 
die Periodendauer T fest ist und bei steigender Temperatur die 
Einschaltzeit t1 gesteigert wird und die Ausschaltzeit t0 fällt. Dann 
währe die Periodendauer allerdings ein fester Wert und das ist laut 
Datenblatt nicht so.

Verstehe ich das jetzt richtig, dass bei steigender Temperatur die 
Periodendauer T zunimmt und dazu die Einschaltzeit t1 überproportinal 
steigt ?

Leider habe ich kein Oszilloskop, und kann´s nicht nachmessen.

Bestend Dank !

Markus

Autor: Wilhelm F. (ferkes-willem)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus:

Es wird wohl so sein, daß das Verhältnis t1/T ein Maß für die Temperatur 
ist, unabhängig der nicht festen Frequenz.

Eine Möglichkeit wäre, aus dem PWM-Signal ein analoges Signal zu 
erzeugen. Integrierer ist das Stichwort. Entweder einfach mit einem 
RC-Glied, oder einem Filter mehrfacher Ordnung. Dieses Signal in den ADC 
einlesen.

Eine weitere Möglichkeit ist, das Tastverhältnis auch direkt mit einem 
µC und Gated Timer oder Interrupt zu erfassen, wenn Geschwindigkeit bzw. 
zeitliche Auflösung des µC es zu lassen.

Anmerkung: Ich hab selbst noch so einen SMT160 hier liegen, schon fast 
20 Jahre alt, der kam nie zur Anwendung. Um 1990 herum war das was ganz 
fortschrittliches. Ich ärgerte mich damals mit einem Versandhändler 
herum, der zwar das Bauteil ohne gescheite Daten verkaufte, aber für ein 
Datenblatt extra damals umgerechnet 15 Euro (30 DM) haben wollte.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Formel möchte das Tastverhältnis, alos mißt Du eben das 
Tastverhältnis.
Mit dem Input Capture auf beide Flanken geht das auch ganz einfach.
Du solltest aber über mehrere Perioden aufaddieren, damit Du eine hohe 
Auflösung erhältst.


Peter

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Infos. Ich hab heute den ganzen Tag daran gebastelt und 
komme einfach nicht weiter. Meine Idee war: Den Ausgang des 
Temperatursensor an den Int0 und Int1 Anschluss des Atmega16 zu legen, 
Int 0 sollte dann bei steigender Flanke einen Interrupt auslösen, der 
den Zähler T0 startet.
Sobald dann eine fallende Flanke kommt löst Int1 einen Interrupt aus und 
speichert diesen Wert als Pulszeit. Sollt in der Zwischenzeit ein Timer 
Overflow kommen, wird die Puls und Periodenzeit um 255 erhöht. Bei der 
nächsten Steigenden Flanke kommt dann wieder der Interrupt von Int0 und 
die Gesamte Periodenzeit wird gespeichter.

Sollte ja eigentlich alles sein, was man dafür braucht oder ?

Später wollte ich dann die Messwerte aufsummieren, damit ich einen 
genaueren Messwert erhalte.

Jetzt habe ich aber das Problem, das die Werte sehr stark am schwanken 
sind, sehr viel stärker als die Schwankung des Temperatursensor und ich 
weiß einfach nicht wie ich das wegbekommen soll.

Ich lasse mir zur Zeit erstmal die Puls und Periodenzeit auf einem LCD 
anzeigen.
#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <inttypes.h>
#include <lcd/lcd.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <lcd/lcd.c>
#include <avr/interrupt.h>
#include <math.h>


uint16_t ueber_puls=0;
uint16_t ueber_per=0;
uint16_t puls=0;
uint16_t periode=0;
uint32_t puls1=0;
uint32_t periode1=0;



ISR(INT0_vect)          // Steigende Flanke 
{  
  periode=TCNT0+ueber_per;  // Endzeit der Periode ermitteln
  ueber_puls=0;        // Überlauf für Puls auf 0 setzen
  ueber_per=0;        // Überlauf für Periode auf 0 setzen
  TCNT0=0;          // Timer Register auf 0 setzen
}

ISR(INT1_vect)          // Fallende Flanke 
{
  puls=TCNT0+ueber_puls;    // Puls Zeit berechnen
}

ISR(TIMER0_OVF_vect)        // Overflow T0 
{
    ueber_puls=ueber_puls+255;  // bei überlauf von T0 ueber_puls um 255 erhöhen
  ueber_per=ueber_per+255;    // bei überlauf von T0 ueber_per um 255 erhöhen
}



int main(void)
{ 
  DDRB= 0b00001100;      // Pin B2,B3 als Ausgang 
  DDRD= 0b11110011;      // Pin D2,D3 als Eingang
  PORTD=0b00001100;      // Pull Up D2,D3 aktivieren
  lcd_init(LCD_DISP_ON);    // LCD initialisieren
  char Buffer[20];       // Zeichenkette deklarieren
  double x;          // Float Hilfsvariable x deklarieren
  
  MCUCR=0b00001011;      // Steigende Flanke an D2 löst Int 0 aus, Fallende Flanke an D3 Int 1
  GICR= 0b11000000;      // Interrupt 0 und 1 aktivieren
  
  TIMSK |= (1<<TOIE0);    // Timer 0 Overflow erlauben
  TCCR0 = 0b00000001;      // Teiler Timer0 auf Cpu Takt
  
  while(1)
    {
    _delay_ms(200);          // Wartezeit damit das LCD nicht flackert
    sei();              // Interrupts erlauben
    _delay_ms(20);          // Messzeit
    cli();              // Interrupts sperren

    //x=(((float)puls/periode)-0.32)*212.765957;
    //sprintf( Buffer, "Temp: %4.4f", x );
    lcd_clrscr();
    //lcd_puts(Buffer );
    
    sprintf( Buffer, "%i ",puls );
    lcd_puts(Buffer );
    sprintf( Buffer, "%i ",periode );
    lcd_puts(Buffer );
    
    periode=0;
    puls=0;
            
    }
}

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.