5693|19

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

三路信号比较 [复制链接]

现在有三路输入信号需要相互比较,这三路信号都是频率相同方波,比较分两个状态:
状态一:三路信号相同
状态二:两路相同,另外一路相反
程序如下:
  1. if(cyc_count==8)
  2.                 {       
  3.                         GIE=0;        //关全局中断                       
  4.                         for(i=0;i<16;i++)//三路信号比较16次
  5.                         {
  6.                                 if(RB0 ^ RA2)
  7.                                 {
  8.                                         if(!(RB0 ^ RA5))
  9.                                         {
  10.                                                 flashup_count++;       
  11.                                         }
  12.                                 }
  13.                                 else
  14.                                 {
  15.                                         if(RB0 ^ RA5)
  16.                                         {
  17.                                                 flashdown_count++;
  18.                                         }
  19.                                         else
  20.                                         {
  21.                                                 flash_count++;
  22.                                         }
  23.                                 }
  24.                         }
  25.                           //根据信号的不同亮不同的灯
  26.                         if(flash_count > flashup_count)
  27.                         {
  28.                                 if(flash_count > flashdown_count)
  29.                                 {
  30.                                         RB2=1;
  31.                                         RB3=0;
  32.                                         RB4=1;       
  33.                                 }
  34.                                 else
  35.                                 {
  36.                                         RB2=1;
  37.                                         RB3=1;
  38.                                         RB4=0;
  39.                                 }
  40.                         }
  41.                         else
  42.                         {
  43.                                 if(flashup_count > flashdown_count)
  44.                                 {
  45.                                         RB2=0;
  46.                                         RB3=1;
  47.                                         RB4=1;
  48.                                 }
  49.                                 else
  50.                                 {       
  51.                                         RB2=1;
  52.                                         RB3=1;
  53.                                         RB4=0;
  54.                                 }
  55.                         }
  56.                
  57.                         flash_count=0;
  58.                         flashup_count=0;
  59.                         flashdown_count=0;

  60.                         cyc_count=0;

  61.                         delay(200);
  62.                         GIE=1;//开全局
  63.                 }
复制代码

我用的是PIC16F72,其中PB0、PA2、PA5是三路信号的输入口
现在比较的结果总是不对,我用示波器测试过信号是正常的
大侠们帮我看看代码有没有问题,是不是效率不够

最新回复

没有汇编基础,能说说为什么用汇编好吗? 是不是汇编比其他高级语言效率高?  详情 回复 发表于 2010-3-6 08:38
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
方波频率是多少?你的灯闪的效果能看出来吗?是否在比较代码执行过程中发生了方波的电平切换?
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
频率是8KHz
我用的硅光电池接收激光线,硅光电池分两块,打到一边的时候其中一路与另外两路相反
打到中间的时候三路信号相同

现在只有状态一的情况下是正常的,就是当激光线打到中间的时候
比较的时候这三路还是在接收信号的
信号周期是125ms,我用的4M晶振,指令周期是1us
也就是说比较的间隙应该不会有明显的电平切换
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
更正一下
信号周期是125us
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
for(i=0;i<16;i++)//三路信号比较16次

楼主的信号比较的频率?这16次,每一次比较的周期是多长? 楼主有测试过吗?

楼主想通过几个周期还判断还是?也就是说16次比较会在方波的几个周期内完成?楼主测试吗?

另外频率相同三个方波,你严格测试了吗?他们起始相位差多少时间?是ms级别 还是uS?

感觉楼主这样做,很有点不妥。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
信号周期是125us,而指令周期是1us,也就是同一个数量级。楼主这样分段测量,可能会有错误。建议是一次性读取(最小指令内读取完毕会比较好。如果一个指令能全部读出更好。)

比如建立3个16位的数将这16次的值保存起来,后面再进行比较。或者用数组也行。
int L1,L2,L3;
L1=L2=L3=0;
for(i=0;i<16;i++)//三路信号比较16次
{
L1 <<= 1;
L2 <<= 1;
L3 <<= 1;

L1 |= RB0;
L2 |= RA2;
L3 |= RA5;  
}

然后再对L1,L2,L3进行比较试试
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

7
 
关键楼主的比较 无法保证你的比较不是存于方波变化的上升沿或下降沿  上。

最佳方案:
在你的判断加上入口条件,即当上升沿或者下降沿 或者电平变化 作为中断触发,
当一个IO 出现沿 或者电平变化,则触发中断,并进入中断处理函数,
延时10us(或者长点,但不要超过50us),再运行你上面的判断函数,

每一次中断,就只判断一次,一共执行8次中断(4个或8个周期),
如果再判断下,就OK

 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼上二位的意思是我在做判断的过程中会出现错误吗?
6楼的方案可以尝试一下
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 kyzf 的回复:
关键楼主的比较 无法保证你的比较不是存于方波变化的上升沿或下降沿? 上。

最佳方案:
在你的判断加上入口条件,即当上升沿或者下降沿 或者电平变化 作为中断触发,
当一个IO 出现沿 或者电平变化,则触发中断,并进入中断处理函数,
延时10us(或者长点,但不要超过50us),再运行你上面的判断函数,

每一次中断,就只判断一次,一共执行8次中断(4个或8个周期),
如果再判断下,就OK



因为周期是一样的,这三个通道中2号通道时基准信号
1号和3号都是与2号作比较的
当1,2,3一样时就是我说的状态一,激光线打到中间的位置
当激光线打到左边时,1号通道的信号与2号相反,2号与3号还是相同的
当激光线打到右边时,1号通道的信号与3号相反,1号与2号还是相同的
我现在的思路是不需要判断他们的高低电平
我做判断的时候用的异或,这三路两两异或,打到左右边的时候肯定会有一路是不同的
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 xmrforever 的回复:
引用 6 楼 kyzf 的回复:关键楼主的比较 无法保证你的比较不是存于方波变化的上升沿或下降沿? 上。 最佳方案:在你的判断加上入口条件,即当上升沿或者下降沿 或者电平变化 作为中断触发,当一个IO 出现沿 或者电平变化,则触发中断,并进入中断处理函数,延时10us(或者长点,但不要超过50us),再运行你上面的判断函数, 每一次中断,就只判断一次,一共执行8次中断(4个或8个周期),如果再判断下,就OK
因为周期是一样的,这三个通道中2号通道时基准信号
1号和3号都是与2号作比较的
当1,2,3一样时就是我说的状态一,激光线打到中间的位置
当激光线打到左边时,1号通道的信号与2号相反,2号与3号还是相同的
当激光线打到右边时,1号通道的信号与3号相反,1号与2号还是相同的
我现在的思路是不需要判断他们的高低电平
我做判断的时候用的异或,这三路两两异或,打到左右边的时候肯定会有一路是不同的


完全可以,这样更简洁,实用!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 
学习。。。。。。。。。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
感觉是不是由那一路基准信号过来,捕获一下两路信号的时间,然后在一定的差异下就能知道是状态1或是状态2
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 9 楼 kyzf 的回复:
引用 8 楼 xmrforever 的回复:引用 6 楼 kyzf 的回复:关键楼主的比较 无法保证你的比较不是存于方波变化的上升沿或下降沿? 上。 最佳方案:在你的判断加上入口条件,即当上升沿或者下降沿 或者电平变化 作为中断触发,当一个IO 出现沿 或者电平变化,则触发中断,并进入中断处理函数,延时10us(或者长点,但不要超过50us),再运行你上面的判断函数, 每一次中断,就只判断一次,一共执行8次中断(4个或8个周期),如果再判断下,就OK 因为周期是一样的,这三个通道中2号通道时基准信号 1号和3号都是与2号作比较的当1,2,3一样时就是我说的状态一,激光线打到中间的位置当激光线打到左边时,1号通道的信号与2号相反,2号与3号还是相同的当激光线打到右边时,1号通道的信号与3号相反,1号与2号还是相同的我现在的思路是不需要判断他们的高低电平我做判断的时候用的异或,这三路两两异或,打到左右边的时候肯定会有一路是不同的

完全可以,这样更简洁,实用!

问题就出在这里,激光线打到中间的时候状态一是正常的
但打到两边的时候都不是很明显,三盏灯不停的闪烁
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 lbing7 的回复:
感觉是不是由那一路基准信号过来,捕获一下两路信号的时间,然后在一定的差异下就能知道是状态1或是状态2

捕获两路信号的时间是什么意思?

这三路信号的周期是一样的
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
根据您的要求:
可以每40us判断一次
判断信号1不等于信号2则是左边
否则『
  信号2等于信号3 则是中间
  否则 是右边

不用异或操作!
只是建议,没有试验过!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 13 楼 xmrforever 的回复:
引用 11 楼 lbing7 的回复:感觉是不是由那一路基准信号过来,捕获一下两路信号的时间,然后在一定的差异下就能知道是状态1或是状态2
捕获两路信号的时间是什么意思?

这三路信号的周期是一样的


你现在不是相当于在测相位嘛

频率是已知的

在基准信号来的时候,开始捕获被测信号1,这就能知道是否是同相位的

如果不同,则是状态2

如果同,再切换下一路来测

如果不同,则是状态2,如果同则是状态1
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 lbing7 的回复:
引用 13 楼 xmrforever 的回复:引用 11 楼 lbing7 的回复:感觉是不是由那一路基准信号过来,捕获一下两路信号的时间,然后在一定的差异下就能知道是状态1或是状态2 捕获两路信号的时间是什么意思? 这三路信号的周期是一样的

你现在不是相当于在测相位嘛

频率是已知的

在基准信号来的时候,开始捕获被测信号1,这就能知道是否是同相位的

如果不同,则是状态2

如果同,再切换下一路来测

如果不同,则是状态2,如果同则是状态1

我就是这么做的,测试信号的时候发现通道1与通道2有时会有10us的相位差
在基准信号到来的时候我做了个20us的延迟,可以比较出来的结果还是不对
现在用的PIC16F72这个片子没法用ICD2在线仿真,不然就能看到电平变化了
马上打算用PIC16F723在线仿真一下试试看
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

18
 
  希望看到圆满的解决方案。
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

19
 
用一个信号做基准,比较另外两个。最好用汇编。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 splendid08 的回复:
用一个信号做基准,比较另外两个。最好用汇编。

没有汇编基础,能说说为什么用汇编好吗?
是不是汇编比其他高级语言效率高?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表