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.

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

1

Mittwoch, 22. Oktober 2008, 20:35

Encoder programmieren, ber wie?

Hallo

hat jemand erfahrung mit atmel programmierung und kann mir verraten, wie man einen Encoder mittels Atmel simuliert. idee ist so ein Drehknopf wie beim autoradio mittels mikro processor zu simulieren...ihr kennt das..man dreht den knopf und irgendwie werden impulse mittels lichtschranken glaub ich erzeugt..auch wen man den knopf immer weiter in eine richtung dreht (hat kein anschlag) so erkennt der prozessor das ende...

ich weiss nicht wie ich sowas programmieren kann.Hat jemand Tipps? :)

PS: bin noch anfänger in programmierung ;)
Hello

2

Donnerstag, 23. Oktober 2008, 00:25

Hi,

wenn Du nicht auf C bestehst und auch mit Bascom klarkommst, hätte ich ein Stückchen Code für so einen Encoder da.

Viele Grüße

Torsten
[SIZE=4]www.zuendapp.net - die grösste Zündapp-Community im Internet! :ok:[/SIZE]

3

Donnerstag, 23. Oktober 2008, 00:57

Wie ist denn eigentlich die genaue Fragestellung?

Encoder ist ein hochtrabendes Wort.

Bei dem was du oben schilderst brauchst du eigentlich nur einen Zaehler. Am besten in zwei Interrupt Routinen (einmal rauf und einmal runter) eine Variable veraendern und damit das Ganze auch nach Aus-/Einschalten noch geht sichern der Variablen in den nichtfluechtigen Speicher. Und der Anschlag in beide Richtungen wird in den beiden Routinen einfach als Grenzwert festgelegt.
Im Hauptprogramm dann einfach nur den aktuellen Stand der Variablen auswerten und drauf reagieren.

Wenn ich mich recht erinner ist bei den Beispielprogrammen was ueber Interrupts dabei. Ansonsten auch noch einiges in den Datenblaettern der Atmels.
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

4

Donnerstag, 23. Oktober 2008, 08:04

Ich denke "Encoder" meint einen Encoder für Drehimpulsgeber.
Ich hab das mal so gelöst, das ich die beiden Ausgänge des Impulsgebers auf jeweils einen Interrupteingang des Microcontrollers gegeben habe.
In der dazugehörigen Interruptroutine wurde dann das jeweilige Partnersignal angeschaut und je nachdem ob da ne 1 oder ne 0 stand ( = rechts oder links gedreht wurde ) rauf oder runter gezählt.
Der Vorteil dieses Konzepts ist, das keine Drehimpulse verloren gehen können und sowas sehr schnell reagiert.
Man sollte aber dazu Drehimpulsgeber mit Lichtschranken benutzen, weil die mechanische Variante ein Kontaktprellen haben kann und somit mehrere Schaltstufen überspringen kann.

Beim Partnerinterrupt wars dann, soweit ich mich erinnern kann genau umgekehrt.
Schau Dir mal das Impulsdiagramm so eines Drehimpulsgebers an, dann wird Dir vermutlich klarer was ich meine.
Im Prinzip ist das vom Programm her ein "Fünfzeiler".

// Die ISR0, steigende Flanke
void int0isr (void)
{
if (pind.1=0) // Input Pin des INT1 - anpassen !
{
ui_variable++;
if (ui_variable>maxwert) // Min und Maxwerte abfangen
{ui_variable=maxwert;};
}
else
{
ui_variable--;
if (ui_variable<minwert)
{ui_variable=minwert;};
};
};

Die ISR1 steigende Flanke
void int1isr (void)
{
if (pind.2=0) // Input Pin des INT0 - anpassen !
{
ui_variable--;
if (ui_variable<minwert)
{ui_variable=minwert;};
}
else
{
ui_variable++;
if (ui_variable>maxwert)
{ui_variable=maxwert;};
};
};

Ich hab den Code nur kurz mal aus dem Kopf erstellt, ohne Anspruch auf Richtigkeit, aber das Prinzip funktioniert so.

Ich hatte aber auch für die beiden Interrupts in meiner Anwendung keine andere Aufgabe, somit waren die frei.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wkrug« (23. Oktober 2008, 08:10)


Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

5

Donnerstag, 23. Oktober 2008, 19:30

Hallo

@Torsten Gietenbruch:,Klar! Bin mit Bascom auch zufrieden. Kann ich dann sehr gut als Beispiel nehmen und dran üben ;) Kannst du mir den Code geben?

@Thomas Radetzki; Ich meine einen Drehimpulsgeber, die heutzutage sehr häufig vorkommen. Man dreht einen Knopf und zwei Lichtschranken geben dann Impulse (um 90° verschobene Signale) aus. dadurch kann man z.B. die Lautstärke erhöhen oder verngern...

Du hast es sehr schön beschrieben, aber so ein Amateur wie ich es bin kann damit nicht viel anfangen :( Für einen Profi wäre es sicher simple. Er wüsste sofort wie man Interrupts programmiert, wie was auszusehen hat etc.
Ich bin da noch nicht so erfahren :(

@Wilhelm Krug: Ja aber das ist ja was ich nicht habe. Ich will ja die Signale des Drehgebers nicht einlesen, sondern möchte so ein Drehgeber nachahmen (simulieren). ;)

Hoffe es ist nun klar was ich meine (möchte)? Ansonsten nochmal nachhacken :)

P.S. finde euer Forum super. seid ich EC-Motoren benutze, ist es eine super hilfe.
Hello

6

Donnerstag, 23. Oktober 2008, 19:36

Nun definiere mal simulieren bitte.

Willst du das auf Tastendruck rauf oder runtergeschaltet wird? Dann wuerde das Beispiel von Wilhelm auch passen. Die Impulsquelle ist dann halt eine andere.

Oder was genau meinst du?
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

7

Donnerstag, 23. Oktober 2008, 19:51

Hallo Thomas,

Ja genau! Ich möchte folgendes aufbauen:

Zwei einfache Schalter. Switch1 und Switch2

Wenn Switch1 = 0 und Switch2 = 1 dann soll ein "Linksdrehen" des Drehgebers simuliert werden.

Wenn Switch1 = 1 und Switch2 = 1 dann soll ein "Rechtsdrehen" des Drehgebers simuliert werden.

Ich habe ein radio an dem mal ein Drehgeber dran war. Der ist aber jetzt kaputt ud ich möchte einfach mal als Übung diesen Drehgeber simulieren, sprich ich verbinde meine Atmel-Output Ports (Zwei Outputs sind glaube ich notwendig) mit der Platine und lasse die Lautstärke (z.B.) über meine Schalter rauf und runterdrehen. :)

So meine ich es.

Hoffe du hast es jetzt verstanden.
Den Code von Wilhelm hab ich mir angesehen, aber aus dem werde ich nicht ganz sclau da ich mch mit Interrupts nicht ganz gut auskenne :(
Und ich muss ja irgendwie die 90° zwischen den beiden Rechtecksignalen, die die Drehgeber erzegen herstellen, aber wie? Wilhelm hat das glaube ich nicht da drinnen?
Ich möche schon, dass die Rechtecksignale je nach Drehrichtung sich ändern, also vorrauseilen oder nacheilen...wie bei einem richtigen drehgeber ;)
Hello

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Encoder« (23. Oktober 2008, 19:54)


8

Donnerstag, 23. Oktober 2008, 20:02

Ach so... Du möchtest mit dem Atmel die Signale des Drehgebers nachahmen! Nicht genau genug gelesen - tut mir leid.

Dafür habe ich leider keinen Code, und die Drehgeber funzen zwar alle nach einem ähnlichen Prinzip, aber 100% gleich sind sie nicht.
Beispiele findest Du bei Pollin, gib dort mal in der Suche "Encoder" ein und schau Dir die Datenblätter an.

Hinzu kommt, dass Du höchstwahrscheinlich den Encoder Deines Autos nicht kennst und daher etwas Probleme haben dürftest, die Anschlüsse zu identifizieren. Und dann bleibt noch die Frage der Schaltspannung, der Atmel liefert ja nur TTL-Pegel.

Grüße

Torsten
[SIZE=4]www.zuendapp.net - die grösste Zündapp-Community im Internet! :ok:[/SIZE]

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

9

Donnerstag, 23. Oktober 2008, 20:40

Ja, aber mir gehts erstmal ums prinzip. das mit den richtigen anschlüssen kriege ich ja raus, kein problem ;) TTL Pegel in einen höheren ist glaube cauch kein problem...kriegt man sicher über Opptokopler gut hin ;) geht bestimmt..

aber auch das ist erstmal nebensache..darum kümmere ich mich, wenn ich weiss wie man sowas programmiert...erst dann kommen die feinheiten ;)
Hello

10

Donnerstag, 23. Oktober 2008, 21:51

Da waere es doch erstmal wichtig zu wissen was denn der Drehgeber eigentlich fuer Signale geliefert hat. Die dann nachzubilden ist nicht das Problem.
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

11

Donnerstag, 23. Oktober 2008, 21:56

OK, werde herausfinden, wie die Signale aussehen :) aber ich vermute die sehen genauso aus -> http://upload.wikimedia.org/wikipedia/en…Diagram.svg.png
Hello

12

Donnerstag, 23. Oktober 2008, 22:03

mag sein. Versuch mal was ueber das Timing rauszukriegen. Also Impulse pro Grad Drehung.
Gruss
Thomas
🖖

Vielleicht ist Wissen doch nicht die Antwort auf alles

13

Freitag, 24. Oktober 2008, 08:52

So ein Drehimpulsgeber generiert zwei um 90° verschobene Rechtecksignale.
Bei einer Drehrichtung eilt Kanal 1 vor.
Bei der Anderen Drehrichtung eilt Kanal 1 nach.
Das sollte mit einem Controller nicht schwer zu simulieren sein.

void rechts(void)
{
PORTx.0=1; // Beliebiger Port z.B. PORTB.0
delay_ms(5);
PORTx.1=1; // Beliebiger Port z.B. PORTB.1
delay_ms(5);
PORTx.0=0;
delay_ms(5);
PORTx.1=0;
}

void links(void)
{
PORTx.1=1;
delay_ms(5);
PORTx.0=1;
delay_ms(5);
PORTx.1=0;
delay_ms(5);
PORTx.0=0;
}

Mit den Delays kann man noch ein wenig spielen, je nachdem was der Empfänger so packt können die noch drastisch verkürzt werden.
Die Funktionen dürften je nach Auswerteschaltung einen oder 2 Schritte machen.
Die Funktion braucht ca 15ms, die Hauptsächlich auf Lasten der delay_ms Befehle geht.

Die entsprechende Funktion brauchst Du dann nur je nach Tastendruck einmal ausführen.
Probiers mal aus und gib uns dann ein Feedback.

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

14

Donnerstag, 30. Oktober 2008, 19:03

Hallo

hab es mal ausprobiert. Klappt zurzeit super. Ich kann die Lautstärke gut regeln.

Danke für die zahlreichen Tipps :)
Hello

15

Donnerstag, 30. Oktober 2008, 20:35

Verschone uns bitte nicht mit Hinweisen zur Hardware und Deinem Programmcode... :w

Grüße

Torsten
[SIZE=4]www.zuendapp.net - die grösste Zündapp-Community im Internet! :ok:[/SIZE]

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

16

Sonntag, 9. November 2008, 13:55

Klaro. mache ich ;)
Hello

Encoder

RCLine Neu User

  • »Encoder« ist der Autor dieses Themas

Wohnort: France

Beruf: Student

  • Nachricht senden

17

Mittwoch, 12. November 2008, 20:07

Hallo

Hier ist der fertige Code:


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
#include <avr/io.h>
#include <util/delay.h> 

uint8_t a=0, b=0;
uint8_t c=0;


//Lautstärkenregelung des Radios

int main()
{

DDRB |= (1 << PB3) | (1 << PB4);
                  				
while(1)
{
	

//Rechtsdrehung//////////////////////////////////////////////////////////////////////////////
	
	if ( PINB & (1<<PINB0) )   				
	{



		if (!(PINB & (1<<PINB1) ))			
		{

				a=1;
			
				if (a && (PINB & (1<<PINB1)))		
				{

				b=1;
				}
		}
		else ;



					if(a && b)
					{
					
						if(c)
						{
						PORTB &= ~(1<<PB3);		
						_delay_ms(5);
						PORTB &= ~(1<<PB4);		
						c=0;
						}
						else if(!c)
						{

						PORTB |= (1<<PB3); 		
						_delay_ms(5); 
						PORTB |= (1<<PB4);		

						c=1;
					  }
					a=b=0;
					}
	}
	

//Linksdrehung//////////////////////////////////////////////////////////////////////////////////////

	 if ( !(PINB & (1<<PINB0)) )   				
	{
		

		if ( (PINB & (1<<PINB1)) ) 			
		{

				a=1;
			
				if (a && !(PINB & (1<<PINB1)))		
				{

				b=1;
				}
		}
		
		
					if(a && b)
					{


					if(c)
						{
						PORTB &= ~(1<<PB4);		
						_delay_ms(5);
						PORTB &= ~(1<<PB3);		
						c=0;
						}
						else if(!c)
						{

						PORTB |= (1<<PB4); 		
						_delay_ms(5); 
						PORTB |= (1<<PB3);		

						c=1;
					  }
					a=b=0;

					}
					
	}
}


Und hier die Zeichnung
»Encoder« hat folgende Datei angehängt:
  • Radio.zip (38,71 kB - 14 mal heruntergeladen - zuletzt: 16. Januar 2017, 17:52)
Hello

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Encoder« (12. November 2008, 20:08)