Ok. So I will leave 0 ... UINT16_MAX to be returned by the driver and will
handle rollover on the application side.

Thanks!

Petro

On Thu, Jan 13, 2022, 5:15 PM Nathan Hartman <hartman.nat...@gmail.com>
wrote:

> On Thu, Jan 13, 2022 at 9:50 AM Petro Karashchenko
> <petro.karashche...@gmail.com> wrote:
> >
> > Thank you. I would appreciate that, but I think that will work only if
> > there is no complete cycle between two reads, so it is potentially a
> > possibility to get wrong position.
>
> Yes, that is correct. If you know what the application will be, you
> know the maximum speed at which pulses can be counted, then you can
> calculate the sample rate that guarantees this will not happen. For
> example a 1000 RPM motor with a 1000 line encoder x 4 (quadrature)
> sampled at 1 KHz will count approximately 66-67 counts per sample, so
> will never come close to losing complete cycles. Of course, if you
> don't know the application, then you cannot control this. The same is
> true, though, if you attempt to trigger on 0->0xffff / 0xffff->0. If
> you miss this single pulse, the count will be corrupted. So maybe it
> is better to risk missing a full cycle than to risk missing a single
> pulse.
>
> The code I mentioned is basically as follows (indentation is getting
> messed up in the email):
>
> static uint16_t Prev = 0;
> static uint16_t Curr = 0;
> static uint16_t Delta = 0;
> static int32_t Position = 0;
>
> .
> .
> .
>
> Prev = Curr;
>
> Curr = READ_QENCODER_COUNTER_HERE();
>
> Delta = Curr - Prev;
> if (Delta > 0x7fff) {
> Delta = (0 - Delta);
> Position -= (int32_t)(Delta);
> }
> else {
> Position += (int32_t)(Delta);
> }
>
> return Position;
>
> Cheers,
> Nathan
>

Reply via email to