Forum: FPGA, VHDL & Co. Drehgeber-Auswertung: Frage zu Syntheseergebnis


von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe folgenden Code für die Auswertung eines Drehgebers (2 Bit 
Gray-Code) geschrieben.
1
-- Eingangssignal vom Drehgeber
2
signal input: std_logic_vector(1 downto 0);
3
...
4
signal state: std_logic_vector(1 downto 0) := (others => '0');
5
...
6
if rising_edge(clk) then
7
  if ce = '1' then
8
    state <= input;
9
10
    case state & input is
11
      when "0001" => up <= '1';
12
      when "0010" => down <= '1';
13
      
14
      when "0100" => down <= '1';
15
      when "0111" => up <= '1';
16
      
17
      when "1000" => up <= '1';
18
      when "1011" => down <= '1';
19
      
20
      when "1101" => down <= '1';
21
      when "1110" => up <= '1';
22
23
      when others => null;
24
    end case;
25
  end if;
26
  
27
  -- up und down sollen nur einen Takt lang aktiv sein,
28
  -- deshalb werden sie hier wieder zurückgesetzt
29
  if up = '1' then
30
    up <= '0';
31
  end if;
32
  
33
  if down = '1' then
34
    down <= '0';
35
  end if;
36
end if;

Daraus baut XST die angehängte Schaltung. Meine Fragen dazu:
- Ist es nötig "input" ganz am Anfang noch mal in ein Register zu lesen 
(vermutlich ja), oder ist es ausreichend dass das Signal erst nach der 
LUT registriert wird?
- Wozu sind die Multiplexer vor den Ausgangs-FF gut? Sollte es nicht 
reichen, dass der Reset-Eingang der FF beschaltet ist?

Danke
Andreas

von ---- (Gast)


Lesenswert?

Hallo

Das erste Register muss schon am Anfang sein, denn die case soll ja die 
Folge von input zu state erkennen.
Was XST genau aus deiner Schaltung macht ist mir auch nicht klar. Auf 
jeden Fall ist das Zurücksetzten von up unnötig (und falsch). Es reicht 
up unterhalb von rising_edge(clk) auf 0 zu setzten, denn state zu input 
ist nur für eine Periode unterschiedlich (siehe case).
1
if rising_edge(clk) then
2
  up   <= '0';
3
  down <= '0';
4
  if ce = '1' then
5
    state <= input;
6
7
    case state & input is
8
      when "0001" => up <= '1';
9
      when "0010" => down <= '1';
10
      
11
      when "0100" => down <= '1';
12
      when "0111" => up <= '1';
13
      
14
      when "1000" => up <= '1';
15
      when "1011" => down <= '1';
16
      
17
      when "1101" => down <= '1';
18
      when "1110" => up <= '1';
19
20
      when others => null; -- up <= '0' könnte auch hier stehen.
21
    end case;
22
  end if;
23
end if;

Gruss ----

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

---- wrote:
> Das erste Register muss schon am Anfang sein, denn die case soll ja die
> Folge von input zu state erkennen.

Das funktioniert schon so, die Frage ist nur ob es korrekt bzw. guter 
Stil ist, ein externes asynchrones Signal kombinatorisch zu verarbeiten, 
oder ob man es grundsätzlich vorher registrieren sollte.

> Was XST genau aus deiner Schaltung macht ist mir auch nicht klar. Auf
> jeden Fall ist das Zurücksetzten von up unnötig (und falsch).

Ist unnötig umständlich, aber nicht falsch.

Jetzt fällt mir gerade der subtile Unterschied zwischen den beiden 
Varianten auf: wenn CE für zwei Taktperioden high wäre könnte up/down 
mit meiner Variante nicht zweimal hintereinander '1' werden. Bei der 
Default-'0'-Variante legt die Synthese deshalb CE über Inverter an R, 
bei der if-Variante den Ausgang des FF. Den Multiplexer kann ich mir 
aber immer noch nicht erklären.

Gruß
Andreas

von ---- (Gast)


Lesenswert?

So meinst du das. Das Input Signal muss synchronisiert werden, da es in 
zwei unabhängige Register gespeichert wird (state und up).

Das Falsch habe ich in Klammern geschrieben, da es in deiner Schaltung 
nicht zu einem Fehler kommen kann. Mal Angenommen, up würde in der case 
über mehrer Perioden auf eins gesetzt, weiter unten wird es aber auf 0 
gesetzt, was dazu führen würde, dass es in der case wider auf 1 gesetzt 
würde. Das up würde "Toggeln". Vermutung, die Synthese erkennt nicht, 
dass up nur für eine Periode auf eins gesetzt wird, daher wird der 
Multiplexer für das Feedback von up implementiert (es soll "Toggeln").

Gruss ----

von Fpgakuechle K. (Gast)


Lesenswert?

IMHO liegt das Problem im Verständnis der Rangfolge (Prioritäten) in 
einem FF
und im einem Prozeß:

(1) In einem (Xilinx)-FF ist reset (if R = '1' then Q <= '0') 
höherwertige als set (if s = '1' then Q<= '1'),
und set höherwertig als Dataenable (if ce = '1' then Q <= D). Q ist der 
FF Ausgang, R|S|CE die synchronen FF-Eingänge.

(2) In einem Process ist die letzte Zuweisung die höchstwertige, also 
bei
1
 q <= '0';
2
 q <= '1';
3
 q <= '0';

wird die letzte Zuweisung q <= '0' ausgeführt (Synthetisiert).

(3) jede zuweisung in einem getakteten Prozess "wird zu einem FF".

Punkt (3) erklärt warum state zu einen FF mit Ausgang state wird.

Punkt (2) und (3) erklären die LUT vor dem Ausgangs-FF: Das Rücksetzten 
ist hochprior (wird also unabhängig von CE ausgeführt) und damit in das 
R Signal umgeformt, der CE-Zweig ist niedrig-prior wird also zum 
datenenable mit vorgeschalteten Multiplexer.

Mit folgender Beschreibung sollte nur R und S des FF genutzt werden:
1
--hilfsignale
2
tmp      <= state & input;
3
set_up   <= '1' when tmp = "0001" or tmp = "0111" or tmp = "1000" or tmp = "1110" else '0';
4
set_down <= '1' when tmp = "0010" or tmp = "0100" or tmp = "1011" or tmp = "1101" else '0';
5
6
process(clk)
7
begin
8
if rising_edge(clk) then
9
  if ce = '1' then
10
    state <= input;
11
 end if;
12
--
13
 if NOT ((set_up = '1') and (ce = '1')) then
14
    up <= '0';
15
 else
16
   up <= '1';
17
 end if;
18
--
19
 if NOT ((set_down = '1') and (ce = '1')) then
20
    down <= '0';
21
 else
22
   down <= '1';
23
 end if;
24
end if;
25
end process;

Ich habe dabei das beispiel von Gast ungeformt. Mehr zu "woher kommt der 
(blöde) Mux vor D findet sich in:
http://www.xilinx.com/xlnx/xweb/xil_tx_display.jsp?sTechX_ID=kc_priorities&iLanguageID=1&iCountryID=1

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

1, 2 und 3 sind mir klar, wie du auf deine Schlussfolgerung kommst aber 
nicht.

R hat höhere Priorität als D/CE. Q liegt auf R. Sobald also Q aus irgend 
einem Grund high wird (if up = '1') wird das FF resettet (up <= '0'), 
egal was an D/CE passiert (die if-Abfrage kommt nach dem case). Passt 
soweit zu meinem Code. Warum muss Q jetzt noch an den Multiplexer? Habe 
ich da einen Denkfehler, oder XST?

Danke für das Beispiel, ich werde es morgen mal ausprobieren.

Den Artikel von Xilinx kenne ich, hat mir aber nicht weitergeholfen.

von Falk B. (falk)


Lesenswert?

Was soll denn das? RS-FlipFlop? Wo leben wir denn?
Für die solide Auswertung eins Drehencoders braucht man 4 D-FlipFlops. 
Zwei um die Eingangssignale zu sampeln und zwei zum Verzögern. Aus 
diesen vier Signalen dekodiert man dann up/down.

Mfg
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falk Brunner wrote:
> Was soll denn das? RS-FlipFlop? Wo leben wir denn?
> Für die solide Auswertung eins Drehencoders braucht man 4 D-FlipFlops.

> Zwei um die Eingangssignale zu sampeln

...danke, das beantwortet endlich meine Frage #1.

> und zwei zum Verzögern. Aus
> diesen vier Signalen dekodiert man dann up/down.

Ich möchte dass up/down jeweils nur für einen Takt aktiv ist, auch wenn 
langsamer abgetastet wird, darum der Reset.

von Fpgakuechle K. (Gast)


Lesenswert?

OK jetzt verstehe ich besser, dich stört nicht der Mux vor D, sondern 
das der Muxer auch von Q abhängt.
Es liegt am XST, IMHO braucht der unbedingt ein elsif um den das 
resetsignal nicht an D zu legen. Das ist IMHO die Aussage der 
Application Note. "Wenn du einen reset willst, dann schreibe es 
unbedingt so (mit elsif)". Man kann dasselbe verhalten in VHDL auch 
anders beschreiben, aber dann "murkst er mit Multiplexer vor D herum. 
Das ist das übliche problem
mit VHDL Synthese, jeder Hersteller hat seine eigenen festlegungen wie 
der VHDL-code für ein "ordentliches" FF auszusehen hat. Da wird der VHDL 
code nicht groß analysiert, sondern stur nach der Struktur (hier elsif) 
gesucht

Und dann ist es nach meiner Erfahrung für den XST einfacher, wenn jedes 
Q extra geschrieben wird. Folgend eine Beschreibung nach deinem Beispiel
1
process(clk)
2
begin
3
4
if rising_edge(clk) then
5
 if ce = '1' then
6
    state <= input;
7
 end if;
8
--
9
 if up = '1' then
10
   up <= '0'; 
11
 elsif ce = '1' then
12
    case state & input is
13
      when "0001" => up <= '1';
14
      when "0111" => up <= '1';      
15
      when "1000" => up <= '1';
16
      when "1110" => up <= '1';
17
      when others => null;
18
    end case;
19
  end if;
20
  
21
   if down = '1' then
22
    down <= '0';
23
   elsif ce = '1'
24
    case state & input is
25
      when "0010" => down <= '1';
26
      when "0100" => down <= '1';
27
      when "1011" => down <= '1';
28
      when "1101" => down <= '1';
29
      when others => null;
30
    end case;
31
  end if;
32
33
end if;
34
end process;

Das ist wie gesagt eine codeumformung um die FF Beschaltung zu 
"optimieren". Eine drehgeberumformung schreibt man aber wie falk 
andeutet
anders. Wobei es schön wäre genau zu wissen welchen output der drehgeber 
für up und down erzeugt. Im folgenden Artikel rate ich mal ein bißchen.

von Fpgakuechle K. (Gast)


Lesenswert?

Also 2 bit Gray drehgeber. Im Up - Fall sieht die Folge so aus
..
00
01
11
10
..
Die zwei Bit kommen parallel asynchron in den FPGA. Wo kommt CE her?
wenn es vom geber kommt so ist dieses einzusynchronisieren. Un wie lang 
ist es aktiv? und wie oft wechseln die beiden bits?


Wenn wir nur die beiden bits vom geber haben, und diese wechseln sehr 
viel langsamer als unser takt, dann so (CE lasse ich weg, da nix 
bekannt):
1
Entity dreh_auswert is
2
 port(clk_i:        in std_logic, 
3
      count_bits_i: in std_logic_vector(1 downto 0),
4
       up_oq :      out std_logic := '0',
5
       down_oq:     out std_logic := '0');
6
end entity dreh_auswert;
7
8
architecture behave of dreh_auswert is
9
signal bit_sync_0_q : std_logic_vector(2 downto 0);
10
signal bit_sync_1_q : std_logic_vector(2 downto 0);
11
signal old_count_q: std_logic_vector(1 downto 0);
12
signal old_new_q : std_logic_vector(3 downto 0);
13
begin
14
15
old_new_q <=  old_count_q & bit_sync_1_q(1) & bit_sync_0_q(1);
16
process(clk)
17
begin
18
if rising_edg(clk)
19
20
--einsynchronisieren und delay für wechselerkennung
21
  bit_sync_0_q <= bit_sync_0_q(1 downto 0) & count_bits_i(0);
22
  bit_sync_1_q <= bit_sync_1_q(1 downto 0) & count_bits_i(1);
23
--erkennung Wechsel counterstand
24
 if (bit_sync_1_q(2) /= bit_sync_1_q(1)) or  
25
    (bit_sync_0_q(2) /= bit_sync_0_q(1)) then
26
  --
27
  -- sichern counter
28
   old_count_q <= bit_sync_1_q(1) & bit_sync_0_q(1);
29
  --Richtung bestimmen
30
    case old_new_q is
31
      when "0001" => up_q <= '1';
32
      when "0111" => up_q <= '1';      
33
      when "1000" => up_q <= '1';
34
      when "1110" => up_q <= '1';
35
      when others => null;
36
    end case;
37
  
38
    case old_new_q is
39
      when "0010" => down_q <= '1';
40
      when "0100" => down_q <= '1';
41
      when "1011" => down_q <= '1';
42
      when "1101" => down_q <= '1';
43
    end case;
44
  else
45
  --pulsen ausgangsignale 
46
   down_q <= '0';
47
   up_q <= '0';  
48
 end if; --ende wechsel erkennung
49
end if;
50
end process;
51
end architecture behave;

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Danke für den Code. Ich wollte erst mal die einfache Version 
implementieren, die nur zwei Zustände auswertet (C-Code von 
http://dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29), weil manche 
Drehgeber nur einen Zustandswechsel pro Schritt liefern.

Sorry dass ich das mit dem CE nicht genauer erklärt habe: das wird im 
FPGA erzeugt und sorgt nur dafür dass die Eingänge nicht mit der vollen 
Frequenz von xx MHz abgetastet werden. Das sollte die Auswertung 
störsicherer machen als wenn man jeden noch so winzigen Impuls 
auswertet.

von Falk B. (falk)


Lesenswert?

@   Andreas Schwarz (andreas)

>Ich möchte dass up/down jeweils nur für einen Takt aktiv ist, auch wenn
>langsamer abgetastet wird, darum der Reset.

Dazu braucht man keinen Reset, das ergibt sich automatisch!

Mfg
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn das Flipflop mit dem langsamen CE arbeitet ändert sich up/down nur 
beim CE, es soll aber nach jedem Setzen nur einen Systemtakt lang aktiv 
bleiben (damit man mit dem Ausgang z.B. direkt einen Zähler hochzählen 
kann).

von Falk B. (falk)


Lesenswert?

@  Andreas Schwarz (andreas)

>Wenn das Flipflop mit dem langsamen CE arbeitet ändert sich up/down nur
>beim CE,

Ja.

> es soll aber nach jedem Setzen nur einen Systemtakt lang aktiv
>bleiben (damit man mit dem Ausgang z.B. direkt einen Zähler hochzählen
>kann).

Gut, auch das ist kein Problem. Nimm einfach zwei FlipFlops die mittels 
CE die Daten abtasten. Der Dekoder läuft dann mit vollem Takt. Fertig.

Aber was soll das denn am Ende? So ein Dekoder besteht aus VIER 
popeligen FLipFlops und minimaler Logic. Denn kann man problemlos auf 
der vollen Geschwidigkeit laufen lassen, Stromverbrauchs ist da kein 
Thema. Und das Reagieren auf "Störimpulse" wird mit dem langsameren Takt 
auch nicht wirklich besser. Besser ist da eine Filterung per RC-Glied 
oder per "Software" über digitale Mittelwertbildung.

MfG
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falk Brunner wrote:
>> es soll aber nach jedem Setzen nur einen Systemtakt lang aktiv
>>bleiben (damit man mit dem Ausgang z.B. direkt einen Zähler hochzählen
>>kann).
>
> Gut, auch das ist kein Problem. Nimm einfach zwei FlipFlops die mittels
> CE die Daten abtasten. Der Dekoder läuft dann mit vollem Takt. Fertig.

Ja, wenn ich das Eingangssignal sowieso gleich registrieren muss ist das 
naheliegend.

> Aber was soll das denn am Ende? So ein Dekoder besteht aus VIER
> popeligen FLipFlops und minimaler Logic. Denn kann man problemlos auf
> der vollen Geschwidigkeit laufen lassen, Stromverbrauchs ist da kein
> Thema. Und das Reagieren auf "Störimpulse" wird mit dem langsameren Takt
> auch nicht wirklich besser.

Je schneller abgetastet wird, desto wahrscheinlicher ist es dass sich 
durch Preller/Störimpulse zufällig eine gültige Gray-Sequenz ergibt, 
also ein Schritt falsch gezählt wird. Und da ein CE nicht viel kostet 
(der 1 kHz-Takt wird sowieso für die Tastenentprellung erzeugt) gehe ich 
lieber auf Nummer sicher.

von Falk B. (falk)


Lesenswert?

@  Andreas Schwarz (andreas)

>Je schneller abgetastet wird, desto wahrscheinlicher ist es dass sich
>durch Preller/Störimpulse zufällig eine gültige Gray-Sequenz ergibt,

Ja, aber

>also ein Schritt falsch gezählt wird. Und da ein CE nicht viel kostet
>(der 1 kHz-Takt wird sowieso für die Tastenentprellung erzeugt) gehe ich
>lieber auf Nummer sicher.

Du gibst dich einer Illusion hin. Denn auch wenn die Wahrscheinlichkeit 
sinkt, ist sie immer noch relativ hoch, dass ein Abtastimpuls einen 
Störimpuls einfängt. Wenn schon, dann RICHTIG (tm). Etwa so.
1
-----------------------------------------------------------------------
2
--
3
-- Signale digital entprellen
4
--
5
-- Pulse kuerzer als debounce Takte sind werden ignoriert
6
--
7
-----------------------------------------------------------------------
8
9
library IEEE;
10
use IEEE.STD_LOGIC_1164.ALL;
11
use IEEE.STD_LOGIC_ARITH.ALL;
12
use IEEE.STD_LOGIC_UNSIGNED.ALL;
13
14
entity debounce is
15
    Generic (debounce : integer := 5);  -- Entprellzeit in Systemtasten
16
    Port ( clk   : in std_logic;        -- Systemtakt
17
           d_in  : in std_logic;        -- Dateneingang
18
           d_out : out std_logic);      -- entprellter Datenausgang
19
end debounce;
20
21
architecture Behavioral of debounce is
22
23
signal cnt : integer range 0 to debounce-1;
24
signal d_int, d_old: std_logic;
25
26
begin
27
28
d_out <= d_old;
29
30
process(clk)
31
begin
32
  if rising_edge(clk) then
33
34
    d_int <= d_in;              -- Signal abtasten
35
36
    if d_int /= d_old then
37
      cnt <= cnt-1;             -- count down
38
      if cnt=0 then
39
        cnt <= debounce -1;     -- Reset, neue Daten bernehmen
40
        d_old <= d_int;
41
      end if;
42
    else
43
      cnt <= debounce -1;       -- Reset, war nur ein kurzer Puls
44
    end if;
45
46
  end if;
47
end process;
48
49
end Behavioral;

Frisch aufgeräumt und erweitert

Drehgeber

MfG
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falk Brunner wrote:
> @  Andreas Schwarz (andreas)
>
>>Je schneller abgetastet wird, desto wahrscheinlicher ist es dass sich
>>durch Preller/Störimpulse zufällig eine gültige Gray-Sequenz ergibt,
>
> Ja, aber
>
>>also ein Schritt falsch gezählt wird. Und da ein CE nicht viel kostet
>>(der 1 kHz-Takt wird sowieso für die Tastenentprellung erzeugt) gehe ich
>>lieber auf Nummer sicher.
>
> Du gibst dich einer Illusion hin. Denn auch wenn die Wahrscheinlichkeit
> sinkt,

Genau darum geht es doch, die Wahrscheinlichkeit zu reduzieren.

> ist sie immer noch relativ hoch, dass ein Abtastimpuls einen
> Störimpuls einfängt.

Ein einziger Störimpuls den man zufällig bei der Abtastung erwischt 
ändert nichts am Ergebnis. Nach 10 -> 11 -> 10 ist der Zählerstand immer 
noch der selbe. Wenn ich dagegen mit 50 MHz abtaste werte ich GARANTIERT 
jeden Fehler in der Schleiferbahn des Drehgebers aus. Und die 
Wahrscheinlichkeit dass in 50 Millionen Abtastungen irgend eine Sequenz 
enthalten ist die einen Zählfehler ergibt ist höher als bei 1000 
Abtastungen.

> Wenn schon, dann RICHTIG (tm). Etwa so.

Es gibt kein "richtig" und "falsch", es ist alles ein Kompromiss 
zwischen Aufwand und Nutzen. Ein CE an ein FlipFlop zu legen kostet 
weder Zeit noch FPGA-Ressourcen.

von Falk B. (falk)


Lesenswert?

@ Andreas Schwarz (andreas)

>Genau darum geht es doch, die Wahrscheinlichkeit zu reduzieren.

Das reicht aber nicht! Statt 10 Fehler pro Sekunde hast du dann immer 
noch 1 Fehler pro Sekunde (als Beispiel).

>Ein einziger Störimpuls den man zufällig bei der Abtastung erwischt
>ändert nichts am Ergebnis.

Ohh doch. Damit kannst du genauso Schiffbruch erleiden, wenn gleich die 
Wahrscheinlichkeit geringer ist. Wasserdicht ist es denoch nicht, erst 
mit RC-Filter oder digitlem Filter.

>Nach 10 -> 11 -> 10 ist der Zählerstand immer
>noch der selbe.

Sicher, das ist er aber auch bei 50 MHz.

>Wenn ich dagegen mit 50 MHz abtaste werte ich GARANTIERT
>jeden Fehler in der Schleiferbahn des Drehgebers aus. Und die

Nein, das ist schlicht falsch.

>Wahrscheinlichkeit dass in 50 Millionen Abtastungen irgend eine Sequenz
>enthalten ist die einen Zählfehler ergibt ist höher als bei 1000
>Abtastungen.

Ja, aber ist dennoch nicht wasserdicht.

>Es gibt kein "richtig" und "falsch",

Oh doch!

> es ist alles ein Kompromiss
>zwischen Aufwand und Nutzen. Ein CE an ein FlipFlop zu legen kostet
>weder Zeit noch FPGA-Ressourcen.

In einem FPGA! sind immer ein paar FlipFlops noch frei, um die digitalen 
Filter einzubauen.

MfG
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falk Brunner wrote:
> @ Andreas Schwarz (andreas)
>
>>Genau darum geht es doch, die Wahrscheinlichkeit zu reduzieren.
>
> Das reicht aber nicht! Statt 10 Fehler pro Sekunde hast du dann immer
> noch 1 Fehler pro Sekunde (als Beispiel).

Und wenn das reicht um die Spezifikation zu erfüllen? Wenn ich einen 
Drehgeber zur Eingabe von Parametern verwende, dann darf es nicht 
passieren dass man einen Schritt dreht und der Drehgeber um 5 Schritte 
springt, aber ist es völlig egal wenn bei 100 Schritten mal nur 99 
erkannt werden.

>>Ein einziger Störimpuls den man zufällig bei der Abtastung erwischt
>>ändert nichts am Ergebnis.
>
> Ohh doch. Damit kannst du genauso Schiffbruch erleiden, wenn gleich die
> Wahrscheinlichkeit geringer ist. Wasserdicht ist es denoch nicht, erst
> mit RC-Filter oder digitlem Filter.

Es gibt keine wasserdichten Lösungen, nirgendwo und auch nicht bei der 
Drehgeberauswertung. Auch dein Filter kann Fehler nicht völlig 
ausschließen.

>>Nach 10 -> 11 -> 10 ist der Zählerstand immer
>>noch der selbe.
>
> Sicher, das ist er aber auch bei 50 MHz.

Bei 10 -> 11 -> 01 -> 00 -> 10 aber nicht. Und das kann bei 50 MHz eher 
passieren als bei 1 kHz.

>>Wenn ich dagegen mit 50 MHz abtaste werte ich GARANTIERT
>>jeden Fehler in der Schleiferbahn des Drehgebers aus. Und die
>
> Nein, das ist schlicht falsch.

Wieso ist das falsch?

von Falk B. (falk)


Lesenswert?

@  Andreas Schwarz (andreas)

>Und wenn das reicht um die Spezifikation zu erfüllen? Wenn ich einen

Dünnbrettbohrerei. Wenn ich wenig Aufwand ein Design wasserdicht machen 
kann, dann tu ich das. Egal was die Spezifikation fordert.

>Drehgeber zur Eingabe von Parametern verwende, dann darf es nicht
>passieren dass man einen Schritt dreht und der Drehgeber um 5 Schritte
>springt, aber ist es völlig egal wenn bei 100 Schritten mal nur 99
>erkannt werden.

OK.

>Es gibt keine wasserdichten Lösungen,

Aber sicher gibt es die. Und das nicht nur bei Uboot-bau ;-)

> nirgendwo und auch nicht bei der
>Drehgeberauswertung. Auch dein Filter kann Fehler nicht völlig
>ausschließen.

Aber er kann sie um Zehnerpotenzen verringern, mehr als eine niedrigere 
Abtastrate.

>Bei 10 -> 11 -> 01 -> 00 -> 10 aber nicht. Und das kann bei 50 MHz eher
>passieren als bei 1 kHz.

Ja EBEN. Du bist dir noch immer nicht über die Bedeutung der 
Wahrscheinlichkeit im Klaren.

>>>Wenn ich dagegen mit 50 MHz abtaste werte ich GARANTIERT
>>>jeden Fehler in der Schleiferbahn des Drehgebers aus. Und die

>> Nein, das ist schlicht falsch.

>Wieso ist das falsch?

Weil ich mit 50MHz Abtastung NICHT GARANTIERT JEDEN Fehler auswerte, 
allerdings ist die Wahrscheinlichkeit höher.

MfG
Falk

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Falk Brunner wrote:
> @  Andreas Schwarz (andreas)
>>Es gibt keine wasserdichten Lösungen,
>
> Aber sicher gibt es die. Und das nicht nur bei Uboot-bau ;-)

Und trotzdem hat das U-Boot Lenzpumpen...

>> nirgendwo und auch nicht bei der
>>Drehgeberauswertung. Auch dein Filter kann Fehler nicht völlig
>>ausschließen.
>
> Aber er kann sie um Zehnerpotenzen verringern, mehr als eine niedrigere
> Abtastrate.

Die "mehreren Zehnerpotenzen" klingen ziemlich aus der Luft gegriffen.

>>Bei 10 -> 11 -> 01 -> 00 -> 10 aber nicht. Und das kann bei 50 MHz eher
>>passieren als bei 1 kHz.
>
> Ja EBEN. Du bist dir noch immer nicht über die Bedeutung der
> Wahrscheinlichkeit im Klaren.

?

>>>>Wenn ich dagegen mit 50 MHz abtaste werte ich GARANTIERT
>>>>jeden Fehler in der Schleiferbahn des Drehgebers aus. Und die
>
>>> Nein, das ist schlicht falsch.
>
>>Wieso ist das falsch?
>
> Weil ich mit 50MHz Abtastung NICHT GARANTIERT JEDEN Fehler auswerte,
> allerdings ist die Wahrscheinlichkeit höher.

Das ist genauso "garantiert" wie deine Lösung "wasserdicht" ist.

Um das mal abzuschließen: in der Praxis scheint die Abtastung mit vollem 
Takt ausreichend zu sein, ich konnte zumindest mit meinem mechanischen 
Drehgeber keine Fehler feststellen. Aber mir war unwohl dabei, ein 
Signal das sich nur sehr langsam ändern darf so auszuwerten als würde es 
sich um einen Faktor 10^6 schneller ändern dürfen. Es ist einfach 
unnötig, es verbessert nicht die Auswertung des Nutzsignals, aber wertet 
potentiell mehr Störungen aus. Deshalb habe ich das CE eingebaut und 
damit die selbe Lösung implementiert wie sie bei Mikrocontrollern weit 
verbreitet und bewährt ist.

von Falk B. (falk)


Lesenswert?

@  Andreas Schwarz (andreas)

>Und trotzdem hat das U-Boot Lenzpumpen...

Feiglinge ;-)

>potentiell mehr Störungen aus. Deshalb habe ich das CE eingebaut und
>damit die selbe Lösung implementiert wie sie bei Mikrocontrollern weit
>verbreitet und bewährt ist.

Womit alles im grünen Bereich ist. Bei nen Drehknopf isses ja nun nicht 
wirklich superkritisch.

Amen!

MFG
Falk

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.