全國服務熱線

18219276011

2850818308

您當前位置:首頁>>升威資訊
升威資訊
公司新聞
企業視頻
行業資訊
技術支持
廣東升威電子制品有限公司
地址:東莞市塘廈鎮鳳凰崗鳳清路39號升威工業園
電話:0769-38833333-881
銷售電話:18219276011
傳真:0769-87930111
E-mail:sw@soundwell-cn.com
編碼開關的實際應用案例
發布時間:2019-02-25
發布者:
瀏覽次數:206次

編碼開關在的工控領域運用廣泛,跑步機的旋鈕,控制器的旋鈕,音響的音量控制旋鈕,都是編碼開關的典型應用。小編發現了一個好東西,具體講解了編碼開關的具體應用,給大家分享一下,希望給正在設計的您們帶來一絲靈感.


帶開關編碼器的工作原理

當帶開關(增量式)編碼器軸旋轉時,會有相應的脈沖信號輸出,其對于編碼器的旋轉方向判別可與脈沖數量的增減來判斷,且需借助后部的判向電路以及計數器來實現。對于編碼器的計數起點可以隨便設定,而且同時還能可以實現多圈的無限累加和測量。把每轉發出一個脈沖的Z信號,就會輸出一個脈沖信號作為參考機械零位。因此當脈沖信號固定時,如要提高編碼器分辨率的精準度,其操作方法可以利用帶90度相位差的A和B的兩路信號來操作,就是對原脈沖數進行倍頻就行。


看一個數字編碼開關的視頻,加深一下理解。

5腳的編碼開關:

編碼開關圖片

圖 1編碼開關的實物圖

具有左轉,右轉,按下三個功能。4、5腳是中間按下去的開關接線 1 2 3腳 一般是中間2腳接地,1、3腳上拉電阻后,當左轉、右轉旋紐時,在1、3腳就有脈沖信號輸出了。

著這是標準資料:

編碼開關尺寸圖

圖2 編碼開關的結構圖

在單片機編程時,左轉和右轉的判別是難點,用示波器觀察這種開關左轉和右轉時兩個輸出腳的信號有個相位差,見下圖:

編碼開關信號圖

圖3 編碼開關在旋轉的時候的輸出波形

由此可見,如果輸出1為高電平時,輸出2出現一個高電平,這時開關就是向順時針旋轉; 當輸出1 為高電平,輸出2出現一個低電平,這時就一定是逆時針方向旋轉。

所以,在單片機編程時只需要判斷當輸出1為高電平時,輸出2當時的狀態就可以判斷出是左旋轉或是右旋轉了。

還有另外一種3腳的,除了不帶按鈕開關外,和上面是一樣的使用。

編碼開關圖片

圖4 三個腳的編碼開關

  1. 參考程序:

  2. #include "reg51.h"

  3. #define uint unsigned int

  4. #define uchar unsigned char

  5. sbit Rotation_Key_A = P1_1; //定義旋轉編碼器的方向判斷A口

  6. sbit Rotation_Key_B = P1_2; //定義旋轉編碼器的方向判斷B口

  7. uint CodingsWitchPolling()//

  8. {

  9. static uchar A_Last_State,B_Last_State; //定義了兩個變量用來儲蓄上一次調用此方法是編碼開關兩引腳的電平

  10. static uchar High_Last_State;//定義了一個變量用來儲蓄以前是否出現了兩個引腳都為高電平的狀態

  11. uint tmp = 0;

  12. if(Rotation_Key_A&&Rotation_Key_B)

  13. High_Last_State = 1; //

  14. if(High_Last_State) //如果High_Last_State為1執行下面的步驟

  15. {

  16. if(Rotation_Key_A==0&&Rotation_Key_B==0) //如果當前編碼開關的兩個引腳都為底電平執行下面的步驟

  17. {

  18. if(B_Last_State) //為高說明編碼開關在向加大的方向轉

  19. {

  20. High_Last_State = 0;

  21. tmp++; //

  22. }

  23. if(A_Last_State) //為高說明編碼開關在向減小的方向轉

  24. {

  25. High_Last_State = 0;

  26. tmp--; //設返回值

  27. }

  28. }

  29. }

  30. A_Last_State = Rotation_Key_A; //儲存A口的當前狀態

  31. B_Last_State = Rotation_Key_B; //儲存B口的當前狀態

  32. return tmp; //

  33. }

  34. //編碼器計數程序

  35. void encoder_cnt(void)

  36. {

  37. uchar Reade_Io_Data;

  38. Reade_Io_Data = PIND; //取端口D管腳信號

  39. Reade_Clr_Signal = (Reade_Io_Data & 0x08); //讀取編碼器清零信號

  40. if(Reade_Clr_Signal != false) //有編碼器清零信號

  41. {

  42. couch_num = 0; //水平床碼清零

  43. }

  44. else

  45. {

  46. if(encoder_cnt_en == false) //編碼器計數模塊沒有啟動

  47. {

  48. pr_couch_ba = Reade_Io_Data & 0x03; //取編碼器A、B相電平信號

  49. }

  50. else

  51. {

  52. couch_ba = Reade_Io_Data & 0x03; //取編碼器A、B相電平信號

  53. if(pr_couch_ba == 0x00)

  54. {

  55. if(couch_ba == 0x01)

  56. {

  57. couch_num++; //水平床碼加1

  58. }

  59. else if(couch_ba == 0x10)

  60. {

  61. couch_num--; //水平床碼減1

  62. }

  63. }

  64. else if(pr_couch_ba == 0x01)

  65. {

  66. if(couch_ba == 0x11)

  67. {

  68. couch_num++; //水平床碼加1

  69. }

  70. else if(couch_ba == 0x00)

  71. {

  72. couch_num--; //水平床碼減1

  73. }

  74. }

  75. else if(pr_couch_ba == 0x10)

  76. {

  77. if(couch_ba == 0x00)

  78. {

  79. couch_num++; //水平床碼加1

  80. }

  81. else if(couch_ba == 0x11)

  82. {

  83. couch_num--; //水平床碼減1

  84. }

  85. }

  86. else if(pr_couch_ba == 0x11)

  87. {

  88. if(couch_ba == 0x10)

  89. {

  90. couch_num++; //水平床碼加1

  91. }

  92. else if(couch_ba == 0x01)

  93. {

  94. couch_num--; //水平床碼減1

  95. }

  96. }

  97. }

  98. pr_couch_ba = couch_ba;

  99. }

  100. }

  101. 編碼器及其計數模塊原理

  102. 旋轉編碼器的檢測程序(基于51單片機)

  103. //旋轉編碼器檢測程序,A/B信號分別接在了INT0和INT1上

  104. //2005年3月27用KEIL編譯、硬件測試通過

  105. //注意:編碼器的信號,程序未做消抖處理。測試中,A/B信號上各

  106. //接了一只104的瓷片電容,工作很正常。如果不接電容,請自行編

  107. //寫信號消抖程序。

  108. #include <at89x51.h>

  109. sbit led=0xB1;//有一只LED接在了RXD引腳上,用來指示正反轉;

  110. main()

  111. {

  112. EA=1; //總中斷允許

  113. EX0=1; //外部中斷0允許

  114. IT0=1; //外部中斷0為邊沿觸發方式

  115. while(1);;

  116. }

  117. /*********************

  118. 編碼器中斷函數

  119. 入口:無

  120. 出口:無

  121. *********************/

  122. void encoder(void) interrupt 0

  123. { //外部中斷0

  124. if (INT1)

  125. {

  126. led=1;

  127. }

  128. else

  129. {

  130. led=0;

  131. }

  132. }

  133. whimsy 的AVR程序

  134. //外部中斷0,用于編碼開關解碼,解碼圖: A接中斷腳(AVR的PD2),以此為基準,B用來判斷方向(連到AVR的PA1), C接地

  135. //A -|

  136. // | -----|__________|----------|____________

  137. //C -|

  138. //

  139. //B -|

  140. // | ----------|__________|----------|____________

  141. //C -|

  142. // CW ===>>> ROTATION

  143. //外部中斷設置(ISC01=0,ISC00=1): INT0 引腳上任意的邏輯電平變化都將引發中斷

  144. #pragma interrupt_handler int0_isr:2

  145. void int0_isr(void)

  146. {

  147. //external interupt on INT0

  148. GICR=0; //禁止外部中斷

  149. if ((PIND & 0x04)==0) //先判斷是高電平產生的中斷還是低點平的中斷

  150. {

  151. if ((PINA & 0x02)==0) //再判斷B線上的電平

  152. {

  153. keycounter--;

  154. keydirection=0;

  155. }

  156. else

  157. {

  158. keycounter++;

  159. keydirection=1;

  160. }

  161. else

  162. if ((PINA & 0x02)==0)

  163. {

  164. keycounter++;

  165. keydirection=1;

  166. }

  167. else

  168. {

  169. keycounter--;

  170. keydirection=0;

  171. }

  172. GICR=0x40;

  173. }

  174. }


帶開關編碼器的工作原理


當帶開關(增量式)編碼器軸旋轉時,會有相應的脈沖信號輸出,其對于編碼器的旋轉方向判別可與脈沖數量的增減來判斷,且需借助后部的判向電路以及計數器來實現。對于編碼器的計數起點可以隨便設定,而且同時還能可以實現多圈的無限累加和測量。把每轉發出一個脈沖的Z信號,就會輸出一個脈沖信號作為參考機械零位。因此當脈沖信號固定時,如要提高編碼器分辨率的精準度,其操作方法可以利用帶90度相位差的A和B的兩路信號來操作,就是對原脈沖數進行倍頻就行。


廣東升威電子專業生產編碼開關28年,老牌編碼器廠家,專業生產各類帶開關編碼器,旋轉編碼器型號全,可根據客戶需求定制尺寸,脈沖,定位,一省到家!廠內有先進的生產設備及檢測設備,品質大貨無憂!找帶開關編碼器廠家就找升威電子.



編碼開關廠家


最新案例
蚂蚁彩票|官网登录 聚星彩票|手机app下载 众彩彩票|官网登录 大兴彩票|官网登录 桔子彩票|手机app下载 众彩彩票|手机app下载 66彩票|官网登录 头头彩票|官网登录 盈发彩票|官网登录 聚彩彩票|手机app下载 248彩票|手机app下载 8828彩票|官网登录 天福彩票|官网登录