热购彩票登录

全國服務熱線

18219276011

2850818308

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

        數字旋轉編碼開關在現在的工控領域運用廣泛,跑步機的旋鈕,控制器的旋鈕,音響的音量控制旋鈕,都是編碼開關的典型應用。

       5腳的數字旋轉編碼器長這個樣子,大家應該都見過的吧!


EC122.jpg

                                       圖 1 5腳編碼開關的實物圖

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

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

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

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

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

    參考程序:

    #include "reg51.h"

    #define uint unsigned int

    #define uchar unsigned char

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

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

    uint CodingsWitchPolling()//

    {

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

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

       uint tmp = 0;

       if(Rotation_Key_A&&Rotation_Key_B)

       High_Last_State = 1;  //

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

       {

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

          {

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

             {

                High_Last_State = 0;      

                tmp++;      //

             }

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

             {

                High_Last_State = 0;

                tmp--;      //設返回值

             }

          }

       }

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

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

       return tmp;            //

    }

    //編碼器計數程序

    void encoder_cnt(void)

    {

            uchar Reade_Io_Data;

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

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

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

            {

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

            }

            else

            {

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

                    {

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

                    }

                    else

                    {

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

                            if(pr_couch_ba == 0x00)

                            {

                                    if(couch_ba == 0x01)

                                    {

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

                                    }

                                    else if(couch_ba == 0x10)

                                    {

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

                                    }

                            }

                            else if(pr_couch_ba == 0x01)

                            {

                                    if(couch_ba == 0x11)

                                    {

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

                                    }

                                    else if(couch_ba == 0x00)

                                    {

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

                                    }

                            }

                            else if(pr_couch_ba == 0x10)

                            {

                                    if(couch_ba == 0x00)

                                    {

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

                                    }

                                    else if(couch_ba == 0x11)

                                    {

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

                                    }

                            }

                            else if(pr_couch_ba == 0x11)

                            {

                                    if(couch_ba == 0x10)

                                    {

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

                                    }

                                    else if(couch_ba == 0x01)

                                    {

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

                                    }

                            }

                    }

                    pr_couch_ba = couch_ba;

            }

    }

     編碼開關及其計數模塊原理

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

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

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

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

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

    //寫信號消抖程序。

    #include <at89x51.h>

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

    main()

    {

            EA=1; //總中斷允許

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

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

            while(1);;

    }

    /*********************

    編碼器中斷函數

    入口:無

    出口:無

    *********************/

    void encoder(void) interrupt 0

    { //外部中斷0

            if (INT1)

            {

                    led=1;

            }

            else

            {

                    led=0;

            }

    }

    whimsy 的AVR程序

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

    //A -|

    //   |   -----|__________|----------|____________

    //C -|

    //

    //B -|

    //   |   ----------|__________|----------|____________

    //C -|  

    //             CW  ===>>> ROTATION

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

    #pragma interrupt_handler int0_isr:2

    void int0_isr(void)

    {

            //external interupt on INT0

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

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

            {

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

                    {

                            keycounter--;      

                            keydirection=0;

                    }  

                    else

                    {

                            keycounter++;

                            keydirection=1;

                    }          

            else

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

                    {

                            keycounter++;  

                            keydirection=1;

                    }  

                else

                {

                            keycounter--;

                            keydirection=0;

                }

                            GICR=0x40;

            }

    }

復制代碼


SOUNDWELL編碼器始于1991年,出自28年老牌編碼器廠家-廣東升威電子制品有限公司-是編碼器國家行業標準制定單位,IATF16949 ISO9001/14001認證企業,專業生產旋轉編碼器,中空編碼器,編碼器開關,貼片編碼器,磁電編碼器,增量型編碼器,絕對值編碼器等。編碼器型號多且全,可完美替換國內外各品牌編碼器產品,聯系李小姐18219276011給替換方案,免費提供樣品!

SOUNDWELL編碼開關

最新案例

<object id="yb5fy"><font id="yb5fy"><mark id="yb5fy"></mark></font></object>

      <object id="yb5fy"></object><th id="yb5fy"><sup id="yb5fy"></sup></th><nav id="yb5fy"><video id="yb5fy"><progress id="yb5fy"></progress></video></nav>
      1. <object id="yb5fy"></object>
        <center id="yb5fy"><em id="yb5fy"></em></center>

          <output id="yb5fy"></output>

        1. <tr id="yb5fy"><sup id="yb5fy"></sup></tr><center id="yb5fy"></center>
          1. <del id="yb5fy"><small id="yb5fy"></small></del>

            <big id="yb5fy"><nobr id="yb5fy"></nobr></big>
            热购彩票登录 全民彩票登录 凤凰彩票app下载安卓 智胜彩票网址 东北彩票818 胜利彩票app 小米彩票下载 360彩票 360彩票大厅 天天彩票官网 kk彩票app 天吉彩票论坛手机版 58彩票app安卓版下载