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
@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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.