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


von Markus (Gast)


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/smt160/index.html 
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

von Wilhelm F. (Gast)


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.

von Peter D. (peda)


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

von Markus (Gast)


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.
1
#include <stdlib.h>
2
#include <stdio.h>
3
#include <avr/io.h>
4
#include <inttypes.h>
5
#include <lcd/lcd.h>
6
#define F_CPU 8000000
7
#include <util/delay.h>
8
#include <lcd/lcd.c>
9
#include <avr/interrupt.h>
10
#include <math.h>
11
12
13
uint16_t ueber_puls=0;
14
uint16_t ueber_per=0;
15
uint16_t puls=0;
16
uint16_t periode=0;
17
uint32_t puls1=0;
18
uint32_t periode1=0;
19
20
21
22
ISR(INT0_vect)          // Steigende Flanke 
23
{  
24
  periode=TCNT0+ueber_per;  // Endzeit der Periode ermitteln
25
  ueber_puls=0;        // Überlauf für Puls auf 0 setzen
26
  ueber_per=0;        // Überlauf für Periode auf 0 setzen
27
  TCNT0=0;          // Timer Register auf 0 setzen
28
}
29
30
ISR(INT1_vect)          // Fallende Flanke 
31
{
32
  puls=TCNT0+ueber_puls;    // Puls Zeit berechnen
33
}
34
35
ISR(TIMER0_OVF_vect)        // Overflow T0 
36
{
37
    ueber_puls=ueber_puls+255;  // bei überlauf von T0 ueber_puls um 255 erhöhen
38
  ueber_per=ueber_per+255;    // bei überlauf von T0 ueber_per um 255 erhöhen
39
}
40
41
42
43
int main(void)
44
{ 
45
  DDRB= 0b00001100;      // Pin B2,B3 als Ausgang 
46
  DDRD= 0b11110011;      // Pin D2,D3 als Eingang
47
  PORTD=0b00001100;      // Pull Up D2,D3 aktivieren
48
  lcd_init(LCD_DISP_ON);    // LCD initialisieren
49
  char Buffer[20];       // Zeichenkette deklarieren
50
  double x;          // Float Hilfsvariable x deklarieren
51
  
52
  MCUCR=0b00001011;      // Steigende Flanke an D2 löst Int 0 aus, Fallende Flanke an D3 Int 1
53
  GICR= 0b11000000;      // Interrupt 0 und 1 aktivieren
54
  
55
  TIMSK |= (1<<TOIE0);    // Timer 0 Overflow erlauben
56
  TCCR0 = 0b00000001;      // Teiler Timer0 auf Cpu Takt
57
  
58
  while(1)
59
    {
60
    _delay_ms(200);          // Wartezeit damit das LCD nicht flackert
61
    sei();              // Interrupts erlauben
62
    _delay_ms(20);          // Messzeit
63
    cli();              // Interrupts sperren
64
65
    //x=(((float)puls/periode)-0.32)*212.765957;
66
    //sprintf( Buffer, "Temp: %4.4f", x );
67
    lcd_clrscr();
68
    //lcd_puts(Buffer );
69
    
70
    sprintf( Buffer, "%i ",puls );
71
    lcd_puts(Buffer );
72
    sprintf( Buffer, "%i ",periode );
73
    lcd_puts(Buffer );
74
    
75
    periode=0;
76
    puls=0;
77
            
78
    }
79
}

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.