久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5703|回復: 8
收起左側

求增量式正交旋轉編碼器的Verilog HDL鑒相代碼

[復制鏈接]
ID:199427 發表于 2018-12-28 13:22 | 顯示全部樓層 |閱讀模式
30黑幣
求增量式正交旋轉編碼器的Verilog HDL鑒相代碼

      需要使用大約13個增量式正交旋轉編碼器設定值,stm32的定時器不夠用,用中斷需要13個中斷,不太方便,stm32的引腳也不太好分配。想用EPM1270(LQFP-144)讀取13個旋轉編碼器的值,再串行傳送給stm32進行處理。
      CSDN.NET上有代碼,沒有帳號,且需要購買。請問哪位前輩能提供?先感謝了!



回復

使用道具 舉報

ID:199427 發表于 2018-12-29 13:38 | 顯示全部樓層
本帖最后由 wxyz 于 2018-12-29 15:04 編輯

旋轉編碼器的A和B分別用5.1K電阻上拉到3.3V,再用0.1uF電容對地濾波消除抖動和干擾。
借助單片機中斷模式的思路:

在上升邊沿觸發模式下,A和B進行電平比較:
對A觸發的中斷:同加異減
對B觸發的中斷:同減異加

采用對A觸發的上升沿中斷模式,簡單的Verilog HDL如下:

  1. always @(posedge RotaryEncoder01Aphase)  // A的上升沿
復制代碼

根據以前單片機中斷模式的調試經驗,編碼器有漏計數情況,計數不連續遞增或遞減,編碼器的抖動干擾會造成漏計數情況。單片機可以采用延時消除抖動干擾,但Verilog HDL中不知道如何解決?




回復

使用道具 舉報

ID:439075 發表于 2018-12-30 11:18 | 顯示全部樓層
簡單的代碼比較好做,可能對于抖動濾波做的不好,真正的消抖效果需要靠實際環境考核才能驗證。
說個簡單方法,先設法獲取A、B相的上升沿和下降沿,每個沿都觸發同一個移位寄存器,取本次(D1、D0)及上次(D3、D2)的鎖存值共四位,即D3、D2、D1、D0。判斷方式為D3和D0相同(D2和D1不同)則正向,相反則為反向。這個方法你通過波形圖分析就可以推導出來。
回復

使用道具 舉報

ID:199427 發表于 2018-12-30 15:37 | 顯示全部樓層
謝謝 bucker 答復!沒有完全理解您的思路。簡單寫了如下代碼:


復制代碼
沒有測試。不知道對不對?



回復

使用道具 舉報

ID:199427 發表于 2018-12-30 19:18 | 顯示全部樓層
添加代碼后,排版格式亂了。再發一次。
wire A, B;
reg [1:0] ABtimes;
reg period;
reg [3:0] shift_register,  [3:0] buffer0,   [3:0] buffer1;
reg [15:0] Counter;


always @(posedge A or posedge B or negedge A or negedge B)     
begin
   ABtimes = ABtimes +1;
   shift_register[3:0] = {shift_register[2:0], 1};   //  拼接1到最低位


   if(ABtimes == 3)  //  00-01-10-11  編碼器經過了 A上升、B上升、A下降和B下降四步
   begin
           if(period == 0)
           begin
                  period = 1;    // 第二個周期
                  buffer1 =  shift_register;     //  暫存第二個周期的移位寄存器值
           end
           else
           begin
                 period = 0;     // 第一個周期
                 buffer0 =  shift_register;     //  暫存第一個周期的移位寄存器值
           end
   end
     
   if((ABtimes == 3)&& (period == 1))  //  編碼器經過四步和第二個周期
   begin
       if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]==buffer1[1:1])) // D3和D0相同(D2和D1不同)
            Counter <= Counter + 1;
      else
            Counter <= Counter - 1;


      shift_register <=  0;   //  清零
   end  


end



回復

使用道具 舉報

ID:199427 發表于 2018-12-31 08:56 | 顯示全部樓層
      if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]==buffer1[1:1])) // D3和D0相同(D2和D1不同)
修改為

      if ((buffer0[3:3]==buffer1[0:0])&& (buffer0[2:2]!=buffer1[1:1])) // D3和D0相同(D2和D1不同)
回復

使用道具 舉報

ID:199427 發表于 2019-1-2 09:49 | 顯示全部樓層
又看了其他的資料,大概理解了鑒相的思路,如下圖所示:
旋轉編碼器波形.png
通過光時,A或B為低電平。遮擋光時,A或B為高電平。A的讀出值序列為1-0-0-1,B的值序列為1-1-0-0,旋轉編碼器為順時針旋轉。A的讀出值序列為1-1-0-0,B的值序列為1-0-0-1,與順時針值相反,旋轉編碼器為逆時針旋轉。

回復

使用道具 舉報

ID:199427 發表于 2019-1-6 11:28 | 顯示全部樓層
在《阿莫電子論壇》上找到了代碼,鏈接如下:
www點amobbs點com/thread-840211-1-1.html


CPLD應用:光柵旋轉編碼器的4倍頻解碼

發表于 2007-10-27 10:22:55 | 只看該作者 回帖獎勵
CPLD應用:增量式光柵旋轉編碼器的4倍頻解碼

剛學了幾天的CPLD,上傳我的第一個應用,不知道實際工作情況如何,希望高手指點指點,謝謝

如果CLK時鐘頻率為25Mhz,則至少可以對輸出頻率2.5Mhz以下增量式光柵旋轉編碼器的進行4倍頻解碼

概念如下:

增量式光柵旋轉編碼器分辨率:2500p/r (常用伺服系統的編碼器)
按工作時最大的輸出頻率為2.5Mhz計算,編碼器可以工作到60000r/m,當然這樣的旋轉速度實際上是很難達到的,實際上的常用的伺服電機最大工作到5000r/m

CLK:倍頻用時鐘頻率
A:編碼器A相
B:編碼器B相

CP:解碼后的脈沖
DIR:旋轉方向

仿真圖片如下:

仿真圖片

仿真圖片




Verilog hdl代碼:

module decoder(CLK, A, B, CP, DIR);
        input CLK;
        input A;
        input B;
        output CP;
        output DIR;

        reg CP;
        reg DIR;

        wire a_xor_b;
        reg a_xor_b_temp;
        reg[3:0] a_xor_b_counter;


        xor (a_xor_b, A, B);        

        always @(posedge CLK)
                begin               
                if(a_xor_b_temp != a_xor_b)
                        begin
                        CP = 1'b1;
                        a_xor_b_temp = a_xor_b;                        
                        a_xor_b_counter = 4'b0000;
                        end
                else
                        begin
                        a_xor_b_counter = a_xor_b_counter + 4'b0001;
                        if(a_xor_b_counter >= 4'b0010)                 // 根據實際應用,可以改變a_xor_b_counter上限值來改變輸出脈寬
                                begin
                                CP = 1'b0;
                                end                                
                        end
                end

        always @(posedge A) begin
                DIR = ~B;
        end

endmodule

不明白,為什么編碼器還要外接時鐘?





回復

使用道具 舉報

ID:328014 發表于 2019-1-10 00:29 | 顯示全部樓層
mark幫頂下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频观看 | 久久精品中文 | 欧美日韩高清 | av电影手机版 | 99热.com | 妖精视频一区二区三区 | 天天艹日日干 | 一级黄色片一级黄色片 | 久久精品中文 | 国产三区四区 | 日韩在线精品 | 久久人爽| 欧美综合久久久 | 亚州综合在线 | 日韩在线视频观看 | 色婷婷国产精品 | 久久久一二三 | www.青青草| 国产精品久久久久aaaa樱花 | 最新中文字幕在线 | 日韩国产欧美视频 | 成人福利 | 国产高清精品一区二区三区 | 国产精品成人一区二区 | 久久不射网 | 日本h片在线观看 | 亚洲一区二区三区免费视频 | 欧美一区二区在线观看 | 久久久日韩精品一区二区三区 | 精品国产乱码久久久久久闺蜜 | 精品视频一区二区 | 日本黄色大片免费 | 一区二区三区播放 | 自拍视频在线观看 | 男人天堂久久 | 免费看国产片在线观看 | 波多野结衣一区二区 | 色站综合| 久久综合一区 | 日本又色又爽又黄又高潮 | 日韩成人精品在线 |