<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
p.ydpc6aa0a4byiv1809781033msoplaintext, li.ydpc6aa0a4byiv1809781033msoplaintext, div.ydpc6aa0a4byiv1809781033msoplaintext
        {mso-style-name:ydpc6aa0a4byiv1809781033msoplaintext;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Agreed – which is why I have a stock of the cheapest Chinese EC12 clones bought on eBay.  I’d never put them in a real product but great for proving the design
 will last over time.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Synth-diy [mailto:synth-diy-bounces@synth-diy.org]
<b>On Behalf Of </b>John Speth via Synth-diy<br>
<b>Sent:</b> 07 August 2021 14:21<br>
<b>To:</b> 'Brian Willoughby'; Jean-Pierre Desrochers<br>
<b>Cc:</b> 'SDIY'<br>
<b>Subject:</b> Re: [sdiy] Need goog working rotary encoder in C code..<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica","sans-serif"">Clean edges are expected with a new encoder. That's what makes debounced design and testing so difficult. If you had noisy switches, you can work on code that can address bounce. Without
 noisy switches, you can't. For starters, until your switches start to bounce, you have the benefit of working with a perfect model of switches (which means you should never miss edges that don't bounce).<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica","sans-serif""><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica","sans-serif"">JJS<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-family:"Helvetica","sans-serif""><o:p> </o:p></span></p>
</div>
<div id="ydpc6aa0a4byahoo_quoted_8360937105">
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">On Saturday, August 7, 2021, 04:17:04 AM PDT, Jean-Pierre Desrochers <<a href="mailto:jpdesroc@oricom.ca">jpdesroc@oricom.ca</a>> wrote:
<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p> </o:p></span></p>
</div>
<div>
<div id="ydpc6aa0a4byiv1809781033">
<div>
<div>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span lang="EN-CA" style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">Here is a screen shot of the encoder's pins A & B pulsing from idle state..</span><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span lang="EN-CA" style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">I know this is around 150RPM spinning (way too fast) but it is to show you the pulses are clean.<br>
I mostly turn the encoder around 60 RPM or slower for all my tests.</span><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span lang="EN-CA" style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> </span><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span lang="EN-CA" style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> </span><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><img border="0" width="888" height="666" id="ydpc6aa0a4byiv1809781033Image_x0020_1" src="cid:image001.jpg@01D78B99.55DD1B90"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<div id="ydpc6aa0a4byiv1809781033yqtfd52954">
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span lang="FR" style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">-----Message d'origine-----<br>
De : Brian Willoughby [mailto:brianw@audiobanshee.com] <br>
Envoyé : 7 août 2021 03:49<br>
À : Jean-Pierre Desrochers<br>
Cc : SDIY<br>
Objet : Re: [sdiy] Need goog working rotary encoder in C code..</span><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"><o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">The Bourns PEC11L is rated for 60 RPM, maximum. That's 1 rev/sec or 50 ms/pulse:detent.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">The contact bounce at 60 RPM is 10 ms, so that leaves only a small window in which to read the steady switch state before it changes
 again. A challenge here is that I would expect a pulse a.k.a. detent to involve all four transitions of the quadrature pattern. If that is correct, and each transition involves 10 ms of bounce, then you have a total of 40 ms of bounce during each 50 ms cycle,
 and that's only 2.5 ms of steady state in which to read each state.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">The Bourns data sheet says "Devices are tested using standard noise reduction filters. For optimum performance, designers should
 use noise reduction filters in their circuits." I assume that this means a simple RC filter, but one which would not interfere with the 2.5 ms window. In other words, the RC filter should smooth out the contact bounce that occurs during the first 10 ms, without
 holding the voltage so long that the 2.5 ms window is not still outside the logic threshold to detect the change. You probably want to confirm the signal integrity with a 'scope if you're having trouble.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">One technique that was mentioned in the thread is to use a counter. This allows the bounce to occur, with every high value adding
 1 to the count and every low value subtracting 1. Thus, even if you read unfiltered bounces, the final value should still be correct. The trick here is to only count the changes, not every polled value (if I recall correctly).<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">Given these time frames, you must consider the clock rate of your PIC16F as well as the operating speed of your particular firmware
 implementation. If your code cannot process an entire pulse:detent in 12.5 ms, then you're probably going to read very unreliable values.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">There are processors such as the TM4C ARM family from Texas Instrument that have quadrature encoder interface peripherals. With
 these, you can program the hardware for a maximum value and an minimum value, as well as control whether you want to allow the value to wrap around at the extents or stick at the extreme value. These peripherals handle the quadrature pins directly, and increment
 or decrement the current value based on the direction of rotation. There is even digital filtering available as an option. Unfortunately, these QEI peripherals still require proper pull-ups and filters, or they won't work reliably, either.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">One question I have is whether typical users might exceed the 60 RPM in short bursts. I don't think anyone could twist a full 360
 degrees at an excessive rate, but smaller rotation could actually be done faster than the rated maximum. I don't actually have any numbers here, but if I imagine what it would take to rotate an encoder a full turn at a constant speed during one second, I can
 easily imagine rotating it faster than that for a fraction of a full turn. In any case, if my estimate is correct, then you'll exceed to maximum rated speed of the hardware itself, regardless of your firmware.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">Brian<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">p.s. Note that cheaper encoders have so much contact bounce that no firmware could possibly read them reliably. The only solution
 for cheap encoders is to train the operator to rotate the encoder VERY slowly.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A"> <o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">On Aug 6, 2021, at 08:46, Jean-Pierre Desrochers <<a href="mailto:jpdesroc@oricom.ca" target="_blank"><span style="color:windowtext;text-decoration:none">jpdesroc@oricom.ca</span></a>>
 wrote:<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> Hi everybody.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> 
<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> I’m doing some tests on a rotary encoder and a PIC16F1783.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> A standard Bourns encoder like THIS .<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> Connected using 2 x 10k pullups with 0.01uf caps to ground to PORTB of
<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> the micro. Interrupt calls (falling edges) used on encoder pins A & B.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> I struggled so far to get clean increments/decrements out of it.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> Many missing counts occur..<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> I tried many source codes on the web with no luck..<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> Is there anybody who’d have worked on this in the past and have a
<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> working c code ?<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> No ARDIUNO please.<o:p></o:p></span></p>
<p class="ydpc6aa0a4byiv1809781033msoplaintext"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">> Thanks !<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
<div id="ydpc6aa0a4byqtfd99443">
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica","sans-serif";color:#26282A">_______________________________________________<br>
Synth-diy mailing list<br>
<a href="mailto:Synth-diy@synth-diy.org" target="_blank">Synth-diy@synth-diy.org</a><br>
<a href="http://synth-diy.org/mailman/listinfo/synth-diy" target="_blank">http://synth-diy.org/mailman/listinfo/synth-diy</a><br>
Selling or trading? Use <a href="mailto:marketplace@synth-diy.org" target="_blank">
marketplace@synth-diy.org</a><o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>