OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5320|回复: 3

如何用FPGA 实现增量式编码器?想做一个电机的闭环控制

[复制链接]

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-10-18
在线时间
15 小时
发表于 2019-3-20 14:04:24 | 显示全部楼层 |阅读模式
8金钱
整了很多天,求教一个增量式编码器的程序,谢谢谢。

最佳答案

查看完整内容[请看2#楼]

// ******************************************************************** // CS47202 // ******************************************************************** // 文件名称 : abcont.v // 模块名称 : abcont // 功能 : // 版本号 :V1.0 // 日期 : // ******************************************************************** // // ****************************************************************** ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2012-6-20
在线时间
100 小时
发表于 2019-3-20 14:04:25 | 显示全部楼层
// ********************************************************************
// CS47202
// ********************************************************************
// 文件名称 : abcont.v
// 模块名称 : abcont
// 功能     :
// 版本号   :V1.0
// 日期                :
// ********************************************************************
//
// ********************************************************************

module   abcont(
                                input clk22m,                                                        //边沿采集时钟
                                input rst_n,
                                input A_in,                                                                //编码器输入A信号
                                input B_in,                                                                //编码器输入B信号                       
                                output reg signed[15:0] AB_count               
                                );
                               
//输入输出端口-----------------------------------------------------------

                                input clk22m;                                                //边沿采集时钟
                                input rst_n;
                                input A_in;                                                        //编码器输入A信号
                                input B_in;                                                        //编码器输入B信号                       
                                output[15:0] AB_count;       
                               
//端口类型---------------------------------------------------------------

reg signed[15:0] AB_count;       

//中间常量,变量----------------------------------------------------------       

reg[1:0]A_sync,B_sync;               
                                       
//-----------------------------------------------------------------------

always@(posedge clk22m)A_sync<={A_sync[0],A_in};
always@(posedge clk22m)B_sync<={B_sync[0],B_in};

//-----------------------------------------------------------------------
reg[1:0]A_cnt,B_cnt;
always@(posedge clk22m)
begin
        if(A_sync[1]&& A_cnt!=2'b11)
        A_cnt<=A_cnt+2'd1;
        else
        if(~A_sync[1]&& A_cnt!=2'b00)
        A_cnt<=A_cnt-2'd1;
end
//--------------------------------------------------------------------

always@(posedge clk22m)
begin
        if(B_sync[1]&& B_cnt!=2'b11)        `
        B_cnt<=B_cnt+2'd1;
        else
        if(~B_sync[1]&& B_cnt!=2'b00)
        B_cnt<=B_cnt-2'd1;
end

//--------------------------------------------------------------------

reg A,B;
always@(posedge clk22m)
begin
        if(A_cnt==2'b11)
        A<=1'b1;
        else
        if(A_cnt==2'b00)
        A<=1'b0;
end
//--------------------------------------------------------------------
always@(posedge clk22m)
begin
        if(B_cnt==2'b11)
        B<=1'b1;
        else
        if(B_cnt==2'b00)
        B<=1'b0;
end       
                                       
//四倍频--------------------------------------------------------------------       
                                               
reg A_d,B_d;
always@(posedge clk22m)A_d<=A;
always@(posedge clk22m)B_d<=B;
wire Encode_count_enable=A^A_d^B^B_d;
wire dir=A^B_d;                                                       
always@(posedge clk22m )
begin
        if (!rst_n)
                begin                       
                AB_count <= 16'd0;
                end
        else
                begin                       
                if (Encode_count_enable)begin       
                        if(dir)
                                AB_count<=AB_count-16'd1;       
                        else               
                                AB_count<=AB_count+16'd1;       
                        end       
                end
end

endmodule
// ****************************END*************************************


回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2019-3-21 02:05:59 | 显示全部楼层
帮顶
回复

使用道具 举报

11

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-10-18
在线时间
15 小时
 楼主| 发表于 2019-3-25 11:45:17 | 显示全部楼层
MY40130064 发表于 2019-3-21 09:11
// ********************************************************************
// CS47202
// ************ ...

非常感谢大侠
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 05:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表