Lieber Besucher, herzlich willkommen bei: RCLine Forum. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

1

Dienstag, 15. Dezember 2009, 11:58

Schalter mit programmierbarem Schaltpunkt - Quarz erforderlich?

Hallo zusammen,

ich möchte mir einen RC-Schalter mit programmierbarem Schaltpunkt bauen. Anwendung wäre zum Beispiel das schalten von Landescheinwerfern bei einer bestimmten Klappenstellung.

Ich möchte das Ganze mit einem ATtiny25 moglichst ohne Quarz realisieren. Dann hätte ich noch 2 Pins für andere Sachen frei.

Daher die Frage:
Ist es sinnvoll / erforderlich einen Quarz zu verwenden oder ist die geberseitige WIederholgenauigkeit im allgemeinen so "schlecht" dass die Abweichungen des internen Oszillators keine große Rolle spielen?

Danke für Eure Antworten,
Gruß,
Stefan

2

Dienstag, 15. Dezember 2009, 12:34

die Präzision eines aktuellen Computersenders dürfte hier schon recht stabil sein, weil einerseits die Potispannung stabilisiert ist, andererseits das Timing von einem Quarz abgeleitet ist. Temperaturdrift des Potis dürfte vernachlässigbar sein. Eher noch die Abhängigkeit von einer bestimmten mechanischen Stellung.

Was den internen Oszillators des ATtiny 25 anbelangt, sagt das Datenblatt (S. 196), dass es im Bereich von 0...55°C eine Frequenzveränderung von 7,85MHz auf 8MHz gibt. Das sind etwa 2% Timingfehler.
Bezogen auf einen 50mm Steuerknüppel mit 90° Ausschlag macht das dann einen Versatz vom Schaltpunkt von etwa 1,5mm aus.

3

Dienstag, 15. Dezember 2009, 12:46

RE: Schalter mit programmierbarem Schaltpunkt - Quarz erforderlich?

Zitat

Original von swessels
ich möchte mir einen RC-Schalter mit programmierbarem Schaltpunkt bauen. Anwendung wäre zum Beispiel das schalten von Landescheinwerfern bei einer bestimmten Klappenstellung.

Ich möchte das Ganze mit einem ATtiny25 moglichst ohne Quarz realisieren. Dann hätte ich noch 2 Pins für andere Sachen frei.

Daher die Frage:
Ist es sinnvoll / erforderlich einen Quarz zu verwenden oder ist die geberseitige WIederholgenauigkeit im allgemeinen so "schlecht" dass die Abweichungen des internen Oszillators keine große Rolle spielen?

Der Geber wird ein sehr genaues Signal liefern. Schließlich kann schon eine kleine Servoabweichung die Trimmung versauen und das haben die Sender alle im Griff.

Allerdings wirst du bei deinem Schalter keine so hohe Genauigkeit brauchen, solange du nicht mehr als 1 oder 2 Schaltpunkte hast. Immerhin ist der Bereich etwa 0,7-1,7ms, d.h. ein deutlicher Unterschied. Das sollte auch ohne Quarz realisierbar sein.

RK

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

4

Dienstag, 15. Dezember 2009, 12:47

Danke für die Info. Dann werde ich doch lieber ene Quarz verwenden.

@RK:

Es gibt nur einen (programmierbaren) Schaltpunkt. Den hätte ich halt gerne immer an der selben Geberposition.

Gruß,
Stefan

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »swessels« (15. Dezember 2009, 12:49)


5

Dienstag, 15. Dezember 2009, 16:01

Hallo Stefan,

vertraue den Vorrednern und verzichte auf den Quarz.
Es ist vermutlich viel sinnvoller "Lücken" zu programmieren, also z.B. Geber < 30% => an, Geber > 35% => aus, dazwischen => alten Zustand beibehalten.
Gerade beim konktreten Fall der Landescheinwerfer wäre die so realisierte Hysterese eh sinnvoll, damit die nicht beim Umschaltpunkt "verrückt" spielen...

Olli

6

Dienstag, 15. Dezember 2009, 17:22

Servu,

genau!
Hysterese geht ganz einfach: wenn der Schwellwert der Impulslänge im Ergebnis überschritten wurde, wird einfach bei der Messung der Impulslänge noch etwas (= der Betrag der Hysterese) draufaddiert. Dann muß die Eingangs-Impulslänge min. um diesen Betrag wieder zurückgehen, damit der Schwellwert wieder unterschritten wird.

Grüße,

Thomas

mwe

RCLine User

Wohnort: Tübingen

  • Nachricht senden

7

Dienstag, 15. Dezember 2009, 17:47

Machs ohne Quarz, reicht völlig. Ich habe oft dreistufige Schalter so realisiert, das geht prima. Wenn z.B. der Pitchknüppel den Landescheinwerfer mitnehmen soll macht das bisschen Drift gar nix, merkt man wirklich nicht und lohnt den Aufwand nicht.

RudiRolf

RCLine User

Beruf: Mechaniker

  • Nachricht senden

8

Dienstag, 15. Dezember 2009, 20:35

Hallo
beim grossen C werden bestimmt noch Bausätze für diese Funktion verkauft die noch analog soll heisen ohne Prozessor aufgebaut sind und mit Poti der Schaltpunkt am Modul eingestellt wird da ist die Genauigkeit auch nicht besser
MfG
Rudi

hsh

RCLine User

Wohnort: Österreich

  • Nachricht senden

9

Dienstag, 15. Dezember 2009, 21:14

Falls es wirklich zu einer merkbaren Drift des Schaltpunktes kommt, kannst du dir immer noch eine automatische Kalibrierung über die 20ms Framezeit basteln. Ich glaube aber nicht, dass du die 2% bis 5% Abweichung über Temperatur- und Spannungsbereich bemerken wirst. Wir fliegen ja doch meist irgendwo zwischen 0 und 30°C.
mfg Harald

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

10

Mittwoch, 16. Dezember 2009, 09:24

Hallo zusammen,

nochmals Danke für Eure Ausführungen. Ich werde es doch ohne Quarz machen.
An die Hysterese hab ich gar nicht gedacht, damit ist der Quarz nicht nötig.

Ausserdem habe ich doch glatt vergessen das Negieren des Schaltausgangs vorzusehen... :wall: Ist ja zum Glück nur Software.

Gruß,
Stefan

swessels

RCLine User

  • »swessels« ist der Autor dieses Themas

Wohnort: 31535 Neustadt, in der Woche HH

Beruf: Arbeitsplanung in der Luftfahzeugkomponenten - Instandsetzung

  • Nachricht senden

11

Donnerstag, 17. Dezember 2009, 15:00

Funktioniert, ohne Quarz

Hallo zusammen,

das ganze funktioniert bestens, auch e Quarz. Im Moment ist die Schaltung noch auf dem Steckbrett, die Inpulse kommen von einem Graupner Servotester.

Hier mal der Code, wäre Nett wenn Ihr mal drüber schauen könntet.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//Tiny25Lights
//RC - gesteuerter Schalter mit programmierbarem Schaltpunkt
//
//Funktion:
//Auswertung des PPM - Signals durch zählen der Timerticks (Timer1) zwischen steigender und fallender Flanke von INT0 (PB2).
//Der ermittelte Zahlenwert wird mit einem im EEPROM abgelegten Wert verglichen. Ist der ermittelte Wert größer oder gleich
//dem Vergleichswert, wird der Schaltausgang (PB3) auf "high" gesetzt. Sinkt der ermittelte Wert unter den Vergleichswert,
//wird der Schaltpin mit einer Hysterese von 5 Timerticks (konfigurierbar über HIST) auf "low" gesetzt.
//Die LED an PB1 dient zur Kontrolle des aktuellen Schaltzustands.
//
//Programmierung:
//Wir der Taster an PB0 beim anlegen der Spannungsversorgung betätigt, wird die Programmierung des Schaltpunktes ermöglicht.
//Die LED an PB1 blinkt 4 mal. Wird der taster nun noch einmal betätigt, wird der aktuelle wert für die Schaltschwele im
//EEPROM gespeichert. Bestätigung durch 4x blinken der LED an PB1.
//
//To Do.:
//- Invertierung des Schaltsignals mittels Jumper oder Programmierung
//- Softwarereset nach Programmiervorgang
//
//Initial values:
//Clock:    Interner RC-oscillator @8MHz
//CKDIV_8:    Programmiert
//Timer1:    Free Running, prescaler 16 (72,5 ticks/ms), overflow interrupt enabled
//INT0:        Aktiviert, steigende Flanke
//BOD:        2,7V

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <util/delay.h>

#define HIST 5                            //Histerese 5 Timerticks

uint8_t switchpoint_e EEMEM = 108;        //Speichert die Schaltschwelle im EEPROM
uint8_t switchpoint = 0;                //Schaltschwelle im RAM
volatile uint8_t oflag = 0;                //Timeroverflow - Flag
volatile uint8_t pulse_start = 0;        //Speichert TCNT0 bei steigender Flanke an INT0
volatile uint8_t pulse_stop = 0;        //Speichert TCNT0 bei fallender Flanke an INT0
uint8_t pulse =0;                        //Speichert die gemessene Pulslänge
uint8_t pflag = 0;                        //Flag Programmierung ja/nein
uint8_t tflag = 0;                        //Flag für Tastendruck

void init() {
    //ports
    DDRB |= (1<<PB1) | (1<<PB3);        //Schalt- und LED-Pin auf Ausgang
    DDRB &= ~(1<<PB0);                    //Tasterpin auf Eingang
    DDRB &= ~(1<<PB2);                    //INT0 Pin auf Eingang
    
    PORTB &= ~(1<PB3);                    //Schaltpin 0
    PORTB &= ~(1<PB1);                    //LED-Pin 0
    PORTB |= (1<<PB0);                    //Tasterpin interner pull-up an
    
    //Schaltpunkte
    switchpoint = eeprom_read_byte(&switchpoint_e);
    //rflag = eeprom_read_byte(&rflag_e);
    
    //programming ?
    if((PINB & (1<<PB0)) == 0) {
        pflag = 1;
        for(int i = 0; i <=7; ++i) {
                PORTB ^= (1<<PB1);
                _delay_ms(250);
        }
    }
    
    //timer1
    TIMSK |= (1<<TOIE1);                //Timer 1 overflow interrupt enable
    TCCR1 |= (1<<CS12) | (1<<CS10);        //Timer1 start prescaler 16
    
    //INT0
    MCUCR |= (1<<ISC01) | (1<<ISC00);    //INT0 steigende Flanke
    GIMSK |= (1<<INT0);                    //INT0 einschalten
    
    sei();                                //Interrupts freigeben
}    

int main(void) {
    init();
    while(1) {
        //Impulsmessung
        if(oflag == 0) {
            pulse = pulse_stop - pulse_start;
        }
        else {
            pulse = pulse_stop - pulse_start + 255;
        }
        //Impulsauswertung
        if(pulse >= switchpoint) {
            PORTB |= (1<<PB3);
        }
        else if(pulse <= (switchpoint - HIST)) {
            PORTB &= ~(1<<PB3);
        }
        //Programmierung
        if(pflag == 1) {
            if((PINB & (1<<PB0)) == 0) {
                tflag = 1;
                _delay_ms(40);
            }
            if((PINB & (1<<PB0)) == 0 && tflag == 1) {
                cli();
                switchpoint = pulse;
                eeprom_write_byte(&switchpoint_e, switchpoint);
                for(int i = 0; i <=7; ++i) {
                    PORTB ^= (1<<PB1);
                    _delay_ms(250);
                }
                sei();
            }
            else {
                tflag = 0;
            }
        }
    }
    return(1);
}

ISR(TIMER1_OVF_vect) {
    oflag=1;
}

ISR(INT0_vect) {
    if((MCUCR & (1<<ISC00)) == 1) {
        pulse_start = TCNT1;
        pulse = 0;
        oflag = 0;
    }
    else {
        pulse_stop = TCNT1;
    }
    MCUCR ^= (1<<ISC00);
}


Die Tastenentprellung ist nicht sauber, aber ich denke für den Anwendungsfall reicht es so.

Gruß,
Stefan