0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

格雷码编码器功能实现

PoisonApple 来源:网络整理 2018-03-02 16:13 次阅读

编码器

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。

格雷码

格雷码属于可靠性编码,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,因而在用于方向的转角位移量-数字量的转换中,当方向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

格雷码编码器功能实现

格雷码的实现

格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同。

例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 。

如果要产生n位元的格雷码,那么格雷码的个数为2^n.

假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值;第二步,改变右起第一个为1的位元的左边位元;第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已经走了(2^n) - 1 步)。

用一个例子来说明:

假设产生3位元的格雷码,原始值位 000

第一步:改变最右边的位元值: 001

第二步:改变右起第一个为1的位元的左边位元: 011

第三步:改变最右边的位元值: 010

第四步:改变右起第一个为1的位元的左边位元: 110

第五步:改变最右边的位元值: 111

第六步:改变右起第一个为1的位元的左边位元: 101

第七步:改变最右边的位元值: 100

如果按照这个规则来生成格雷码,是没有问题的,但是这样做太复杂了。如果仔细观察格雷码的结构,我们会有以下发现:

1、除了最高位(左边第一位),格雷码的位元完全上下对称(看下面列表)。比如第一个格雷码与最后一个格雷码对称(除了第一位),第二个格雷码与倒数第二个对称,以此类推。

2、最小的重复单元是 0 , 1。

000

001

011

010

110

111

101

100

所以,在实现的时候,我们完全可以利用递归,在每一层前面加上0或者1,然后就可以列出所有的格雷码。

比如:

第一步:产生 0, 1 两个字符串。

第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。

第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。

好了,这样就把3位元格雷码生成好了。

如果要生成4位元格雷码,我们只需要在3位元格雷码上再加一层0,1就可以了: 0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.

也就是说,n位元格雷码是基于n-1位元格雷码产生的。

如果能够理解上面的部分,下面部分的代码实现就很容易理解了。

java] view plain copypublic String[] GrayCode(int n) {

// produce 2^n grade codes

String[] graycode = new String[(int) Math.pow(2, n)];

if (n == 1) {

graycode[0] = “0”;

graycode[1] = “1”;

return graycode;

}

String[] last = GrayCode(n - 1);

for (int i = 0; i 《 last.length; i++) {

graycode[i] = “0” + last[i];

graycode[graycode.length - 1 - i] = “1” + last[i];

}

return graycode;

}

格雷码还有一种实现方式是根据这个公式来的 G(n) = B(n) XOR B(n+1), 这也是格雷码和二进制码的转换公式。代码如下:

[java] view plain copypublic void getGrayCode(int bitNum){

for(int i = 0; i 《 (int)Math.pow(2, bitNum); i++){

int grayCode = (i 》》 1) ^ i;

System.out.println(num2Binary(grayCode, bitNum));

}

}

public String num2Binary(int num, int bitNum){

String ret = “”;

for(int i = bitNum-1; i 》= 0; i--){

ret += (num 》》 i) & 1;

}

return ret;

}

这是一道google 的面试题,以上代码均是网友peking2 和 SEwind520写成。原题还要求把二进制码转成十进制数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    41

    文章

    3360

    浏览量

    131509
  • 格雷码
    +关注

    关注

    2

    文章

    34

    浏览量

    13092
收藏 人收藏

    评论

    相关推荐

    绝对式多极磁电轴角编码器的设计

    为了实现多对极磁电式轴角编码器的高分辨率绝对式检测并降低其成本,基于改进构建了一种新型多极磁电轴角
    发表于 06-02 10:04

    二进制与自然二进制的互换

    。而绝对式编码器是直接输出数字量的传感,它是利用自然二进制或循环二进制()方式进行光电转换的,
    发表于 03-08 14:16

    常用编码(BCD编码、余3反射、奇偶校验)

    反射(循环)十进制数 二进制数 十进制数 二进制数
    发表于 04-11 10:00

    简介及格与二进制的转换程序

    ] 。  属于可靠性编码,是一种错误最小化的编码,因为它大大地减少了由一个状态到下一个状态时电路中的混淆。由于这种
    发表于 04-22 09:00

    什么是BCD、8421、余三

    的是8421BCD,无权用得较多的是余三,我们通常所说的BCD
    发表于 11-03 17:36

    编码器工作原理

    均匀分布的刻线。由于其给出的位置信息是增量式的,当应用于伺服领域时需要初始定位。绝对式编码器一般都做成循环二进制代码,道道数与二进制
    发表于 02-24 22:03

    介绍

    介绍
    发表于 08-14 09:44

    【STM32源代码分享】STM32F10xxx 正交编码器接口应用笔记 及...

    代码,道道数与二进制位数相同。绝对式编码器可直接输出转子的绝对位置,不需要测定初始位置。但其工艺复杂、成本高,
    发表于 03-18 10:03

    的规则和应用问题?

    今天看到一个计数的程序,搜了下定义,觉得还是云里雾里,定义写的是若任意两个相邻的代码只有一位二进制数不同,则这种编码
    发表于 08-20 14:41

    基于RU算法的编码器是如何设计并实现的?

    编码器实现指标分析LDPC编码器实现编码器方案验证与优缺点分析
    发表于 04-30 06:08

    【原创分享】编码器的分类及增量式光电编码器的工作原理

    和循环,所以很安全。每步只有一位变化。数据处理时,必须转换成二进制。8、转速改速度指示编码器
    发表于 05-17 13:20

    编码器和译码(数电实验报告)精选资料分享

    组合逻辑电路设计二、 实验原理1. 编码器把二进制按一定的规律编排,例如 8421
    发表于 07-30 07:41

    正交编码器原理

    1. 正交编码器原理盘:正交编码器有两个光电传感,另一头有一个光源,当黑白相间的盘转到白色对准光电传感
    发表于 08-12 07:10

    编码器的定义

    编码器  编码器的定义:在数字系统里,常常需要将某一信息(输入)变换为某一特定的代码(输出)。把二进制按一定的规律编排,例如8421
    发表于 09-03 06:35

    ros驱动-架构及电机驱动和编码器功能实现

    :在hello_driver的文件夹下,pip install pyser 在电机驱动编码中,ros驱动功能包含了两个部分:①与下位机通讯(串口),②订阅主题消息 电机驱动程序: #!/usr/bin/en
    发表于 03-17 14:08 1次下载
    ros驱动-架构及电机驱动和<b class='flag-5'>编码器</b><b class='flag-5'>功能</b>的<b class='flag-5'>实现</b>