打印

[求助] 一个数据采集的问题?请帮我出个思路!

[复制链接]
1891|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请问工程师,怎样用单片机采集SSI数据,这个数据是24位的串行数据。
它的时许如图

我现在用以下方法试过
1.用IO口模拟他的时许
void signal()
{
RA5=0;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
RA5=1;
}
/******信号采集********/
void Rec_data()
{
unsigned char i;
di();
RA5=1;
for(i=5;i>0;i--);
signal();      //----------1--------------//
data1=Rev;
signal();    //----------2--------------//
data2=Rev;
signal();      //----------3--------------//
data3=Rev;
signal();      //----------4--------------//
data4=Rev;
signal();      //----------5--------------//
data5=Rev;
signal();      //----------6--------------//
data6=Rev;
signal();      //----------7--------------//
data7=Rev;
signal();    //----------8--------------//
data8=Rev;
signal();    //----------9--------------//
data9=Rev;
signal();       //----------10--------------//
data10=Rev;
signal();    //----------11--------------//
data11=Rev;
signal();    //----------12--------------//
data12=Rev;
signal();              //----------13--------------//
data13=Rev;
signal();     //----------14--------------//
data14=Rev;
signal();      //----------15--------------//
data15=Rev;
signal();      //----------16--------------//
data16=Rev;
signal();    //----------17--------------//
data17=Rev;
signal();    //----------18--------------//
data18=Rev;
signal();    //----------19--------------//
data19=Rev;
signal();    //----------20--------------//
data20=Rev;
signal();    //----------21--------------//
data21=Rev;
signal();    //----------22--------------//
data22=Rev;
signal();    //----------23--------------//
data23=Rev;
signal();    //----------24--------------//
data24=Rev;
RA5=0;
// data_H=(data1<<7)+(data2<<6)+(data3<<5)+(data4<<4)+(data5<<3)+(data6<<2)+(data7<<1)+data8;
data_M=(data9<<7)+(data10<<6)+(data11<<5)+(data12<<4)+(data13<<3)+(data14<<2)+(data15<<1)+data16;
data_L=(data17<<7)+(data18<<6)+(data19<<5)+(data20<<4)+(data21<<3)+(data22<<2)+(data23<<1)+data24;
data=((unsigned int)data_M<<8)+data_L;
ei();
}
这样可以采集数据,但是有点不稳定,有时会采集到错误数据。
2、我用单片机SPI,收三次。
收到的全是0xFF,所以我怀疑是不是不能中断,要连续接收才对。
3、还有试,只是一个想法
我准备用6个74LS194级联一个串转并的电路,6个正好转出来是24位的
但是IO又不够用。
其他工程师有没有做过,给我点建议!
第一种方法太麻烦,因为他的速率至少70k,所以用for不行的!我时钟是4MHz

相关帖子

沙发
wh6ic| | 2009-9-7 10:22 | 只看该作者
你首先需要知道它的起始时序。如果时钟不可控,误差不大时用方法一基本就行了,否则比较麻烦。

使用特权

评论回复
板凳
alamo2009|  楼主 | 2009-9-7 10:43 | 只看该作者
开始时许就是时序图上的tm,至少16us的高电平

使用特权

评论回复
地板
古道热肠| | 2009-9-7 10:56 | 只看该作者
时钟由谁提供的?如果是设备提供的,从图上看您要捕捉它的下降沿进行采样较合适.如果信号时钟相当快,MCU软件采样来不及的话,就只能用硬件了,外部时钟作为数据锁存触发信号,再由MCU来读取.

使用特权

评论回复
5
alamo2009|  楼主 | 2009-9-7 11:01 | 只看该作者
设备相当于从机,时钟是单片机提供的!
我第一种方法那24条语句就是模拟24个脉冲

使用特权

评论回复
6
xwj| | 2009-9-7 11:14 | 只看该作者
把signal()中的一堆nop换成等待下降沿,

注意:
要另外用定时器做个超时,防止意外情况下死机。

使用特权

评论回复
7
xwj| | 2009-9-7 11:14 | 只看该作者
而且要快的话不要用子程序,改用宏或者inline

使用特权

评论回复
8
mbutterfly| | 2009-9-7 12:48 | 只看该作者
编译器的优化会自动将一些简单函数变成内联函数的,好像

使用特权

评论回复
9
mbutterfly| | 2009-9-7 12:48 | 只看该作者
编译器的优化会自动将一些简单函数变成内联函数的,好像

使用特权

评论回复
10
xwj| | 2009-9-7 14:04 | 只看该作者
LS想得美!

编译器可不会做那样的优化。

使用特权

评论回复
11
LLLLWWWW| | 2009-9-7 16:28 | 只看该作者
建议用示波器看看MCU模拟的脉冲占空比是否合适,计算好间隔时间,另外,程序最好也不要写的那么重复,
24位可以写在一个接收主程序中,接收进来的数据用数组存放,比如用for(i=0;i<24;i++){RA5=0;Delay_n_uS(47);RA5=1;DATA[i]=Rev;}还要加个固定延时的程序,开始采样的时候前面可能还要加个判断!这样调试起来也方便!

使用特权

评论回复
12
alamo2009|  楼主 | 2009-9-8 08:58 | 只看该作者
for(i=0;i<24;i++){RA5=0;Delay_n_uS(47);RA5=1;DATA[i]=Rev
这样不行,频率不够,我都这样做了。所以才不用循环,直接写出24条单独的语句。

使用特权

评论回复
13
alamo2009|  楼主 | 2009-9-8 09:00 | 只看该作者
而且要快的话不要用子程序,改用宏或者inline
xwj 发表于 2009-9-7 11:14


谢谢你的解答,去掉子程序后频率可以满足了!
但是能否硬件实现?写24条语句太麻烦了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

137

帖子

1

粉丝