path: root/digital/asserv/doc/asserv.txt
diff options
Diffstat (limited to 'digital/asserv/doc/asserv.txt')
1 files changed, 126 insertions, 0 deletions
diff --git a/digital/asserv/doc/asserv.txt b/digital/asserv/doc/asserv.txt
new file mode 100644
index 00000000..fdf9ad5f
--- /dev/null
+++ b/digital/asserv/doc/asserv.txt
@@ -0,0 +1,126 @@
+ Asserv: Microcontroller based motor control
+:Author: Ni
+To control a motor using a PID, a feedback is needed. Its role is to measure
+the position of the rotor shaft. One commonly used solution is the
+optical incremental encoder. This encoder has a determined number of
+positions. It will output an impulsion each time its position change, with a
+second output which make it possible to determine the rotation direction.
+Some encoders also output an index signal used to know the exact shaft
+position after initialisation.
+Encoders signals
+The two output channels are usually named A and B. The encoder wheel will
+generate two square waveforms, with a 90 degrees phase shift. The B channel
+will generate counting impulsions, the A channel will be used to determine the
+direction (actually, A and B can be swapped). Here is a example waveform for
+an encoder turning smoothly in a given direction::
+ A: _____------______------______----
+ B: --______------______------______-
+ Pos: ^0 ^1 ^2
+The ``^`` symbol show the transition between positions. Here is a more
+chaotic movement::
+ A: _____--------------------______-------______----
+ B: --______--------------------______---______-----
+ Pos: ^0 ^1 ^0
+After the transition to the position 0, the rotor stayed steady, then
+continued to the position 1. Finally, it continued in the same direction for
+less than a position and returned to position 0.
+If this does not seems clear to you, wait, there is a simpler view below.
+Encoders which are sold for 500 positions will generate 500 positive edges per
+turn on each channel.
+Actually, the resolution of the encoder can be improved, and moreover, with a
+simpler view of the signal. The A and B channels can be seen as a Grey coding
+of four sub-positions (the Grey code defines a sequence of binary number where
+each number differ from the previous or the following one by one and only one
+= = ========
+B A Position
+= = ========
+0 0 0
+0 1 1
+1 1 2
+1 0 3
+= = ========
+With this system, it is easy to know what is the rotation direction. Just
+look at the sub-positions and determine if the new one is before or after the
+old one.
+Here is the same waveform with this new way of thinking::
+ A: _____------______------______-----
+ B: --______------______------______--
+ SPos: ^0 ^1 ^2 ^3 ^0 ^1 ^2 ^3 ^0 ^1 ^2
+ Pos: 0 1 2 3 4 5 6 7 8 9 10
+``SPos`` is the sub-position.
+Decoding, the D flip-flop schematic
+One commonly used schematic to decode this kind of signal uses a single D
+flip-flop. This kind of flip-flop copies its D input to its Q output on each
+clock rising edge. Here is this schematic:
+TODO: insert the schematic
+On each B rising edge, A is copied to the flip-flop output. If the rotor is
+going forward, Q will be low. If the rotor is going backward, Q will be high.
+The B signal is also connected to the clock input of a counter and Q to its
+direction input.
+This schematic has one major drawback. Look at this waveform::
+ A: ______------__________------______
+ B: ___------______----______------___
+ SPos: 0 ^3 ^2 ^1 ^0 ^3 ^0 ^1 ^2 ^3 ^0
+ Pos: 0 -1 -2 -3 -4 -5 -4 -3 -2 -1 0
+ Q: _________________________---------
+ Count: ^- ^- ^+
+ Pos: 0 -1 -2 -1
+TODO: to better show the problem, the counter should be defined. If it count
+on the rising edge, does it take the old or the new value of Q (new for a
+software counter, old for a programmable logic one for example).
+Decoding, the four states automaton
+This decoding use the observation done before about the Grey encoding of the
+four sub-positions.
+At a given time, the automaton is in one of the four states defined by the A
+and B signals. When one of the signals changes, the automaton switches to the
+new state, incrementing or decrementing the position counter:
+.. image:: decoder_states.png
+ :alt: Automaton states
+Decoding, less resolution without losing steps
+In the D flip-flop solution, the problem is that the increment is done on a
+different edge from the decrement. This solution address this problem.
+When A is low, count up if B goes from 1 to 0, and count down if B goes from 1
+to 1. Do nothing if A is high.
+This solution give more accuracy than the single D flip-flop (i.e. does not
+lose steps) without the extra needed bits of the full automaton solution.