搜索
bottom↓
回复: 14

求助 差分曼码解码

[复制链接]

出0入0汤圆

发表于 2020-4-11 11:28:59 | 显示全部楼层 |阅读模式
本帖最后由 yongjia 于 2020-4-11 12:24 编辑



示波器抓的波形,
  
自己写的AVR差分曼彻斯特解码程序,差分曼码一个周期约240uS,半个周期约120uS
按协议,一个周期内电平没有变化为1,有变化为0
使用AVR单片机的ICP捕获电平跳变脉冲中断,Timer计时判断是半个周期还是一个周期。
仿真看bit_array数组的值,也反复调时间范围,结果都不对,
用示波器看截取到的波形数据又是对的,求助高手指点迷津.

#pragma vector=TIMER1_CAPT_vect       //定时器T1输入捕捉中断服务程序
__interrupt void timer1(void)         
{  
  ICR1L = TCNT2;  
  if(test_end == 0)                    //未完成接收255Bit数组         
       {   
            if(Flag)
              {
               Flag = 0;
               TCNT2 = 0;
               ICR1L = 0;  
              }     
            if( (ICR1L >= 37) && (ICR1L <= 43) )     // ICR1L= 40 是 240US 1个周期,1个周期无变化为1
              {               
                bit_array[bit_no] = 1;                    
                bit_no++;
                TCNT2 = 0;
                Flag = 0;
              }   
            if( (ICR1L >= 16) && (ICR1L <= 22)  )    // ICR1L= 19是120us  半个周期,一个周期有变化为0
              {               
                bit_array[bit_no] = 0;                  
                Flag = 1;
                TCNT2 = 0;
                bit_no++;
              }
        }         
      if(bit_no >= 255)               //接收完255个数
         {
           bit_no = 0;
           test_end = 1;              //设置完成标志=1  
         }
      TCCR1B ^= (1<<ICES1);           //反相下次沿触发   
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

 楼主| 发表于 2020-4-11 11:30:09 | 显示全部楼层
本帖最后由 yongjia 于 2020-4-11 11:53 编辑

if(bit_no134 >= 255)   
         {
           bit_no134 = 0;
           test_end134 = 1;             // 设置完成标志=1   大于0.75T 小于1.25T
         }
接收够255个数组后,观察数组值,始终不对, 不知道哪里糊涂了

出0入0汤圆

发表于 2020-4-11 12:01:55 | 显示全部楼层
编码没问题,解码有问题,解码算法上多想想有没有其他方式,这个对实时性要求蛮高的。
思路很重要。

出0入0汤圆

发表于 2020-4-11 12:40:01 | 显示全部楼层
一次发255Bit?有没有累积误差?每个周期重新调整计时周期的起点吗?

出0入0汤圆

发表于 2020-4-11 12:44:25 | 显示全部楼层
把脉冲时间缓冲起来,然后对应着波形一个个比对,看看误差有多少。

出0入14汤圆

发表于 2020-4-11 13:05:30 | 显示全部楼层
你可以试下,你用另一个端口同步输出,看看两个波形差别有多大

出0入54汤圆

发表于 2020-4-11 13:45:46 | 显示全部楼层
你这个跟红外解码的原理差不多,应该只用下降沿就可以了。
另外为什么不设置双边沿触发,而要在后面去动态的改变?

还有你把你当前解出来是什么样给出来啊,看一下是卡在哪个环节。

出0入0汤圆

 楼主| 发表于 2020-4-11 15:17:27 | 显示全部楼层
用的MEGA64单片机, 现在仿真结果,能找到数据头,但是后面数据多了就错乱了,而且几次错的还不一样  

出0入0汤圆

 楼主| 发表于 2020-4-11 15:39:48 | 显示全部楼层
chengyang79 发表于 2020-4-11 12:40
一次发255Bit?有没有累积误差?每个周期重新调整计时周期的起点吗?

一次采集满255Bit,然后在数组里面找数据头, 每个周期都是重新计时的

出110入170汤圆

发表于 2020-4-11 16:08:34 | 显示全部楼层
如果知道时间周期就好办

T/2的时间采样电平即可,就怕时间误差累计以及变化....

出0入0汤圆

发表于 2020-4-11 16:55:19 来自手机 | 显示全部楼层
可以考虑直接用串口收,一次4bit

出0入0汤圆

发表于 2020-4-12 08:32:44 | 显示全部楼层
如果用ICP捕获容易被干扰,加一个小电容滤波应该会好些。
如果用电平采样,那么采样不要在1/2T处,这个点正是可能产生跳变的位置。
最好一个周期内均匀采样多个点进行加权判断是否发生有效跳变。

出0入0汤圆

发表于 2020-4-20 15:39:33 | 显示全部楼层
// **********************************************************************
// Routine to decode a Manchester bit
// Pass in the previous bit logic value
// *********************************************************************/
unsigned char Coding_ManchesterDecode(unsigned char cBit)
{
unsigned char cOutput = BitErr;
unsigned int tmp;
tmp = Coding_Timer_Poll(); // Catch next edge time
if(tmp < UPPERTIMINGLMT) // Check if edge time is useable
{
// Check edge time and determine next Logic value //
if((tmp > DecodeReadTime.LongL) && (tmp < DecodeReadTime.LongH))
{cOutput = cBit ^ 0x01;} // invert cBit for logical change
else if(tmp > DecodeReadTime.ShortL && tmp < DecodeReadTime.ShortH)
// Next edge time is short
{
tmp = Coding_Timer_Poll();
if(tmp > DecodeReadTime.ShortL &&
tmp < DecodeReadTime.ShortH)
{cOutput = cBit;} // bit stays the same
else{cOutput = BitErr;} // Un-paired short time
}
else {cOutput = BitErr;} // Edge time outside limits
}
return cOutput;
}

出0入0汤圆

发表于 2020-4-20 15:49:34 | 显示全部楼层
看看这个可能有用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-9-15 16:08:08 | 显示全部楼层
有缘人我才说一句,你这种一个周期约240uS,半个周期约120uS的差分曼码用上面的各种答案是无法答题的,要换思路。这不是啥曼彻斯特码,是两相(Biphase)码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 20:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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