wyb4993 发表于 2008-7-25 17:30:47

用TLC2543,LV程序修改了第二版资料中的例子7,看不到采集的0--5V电压?

大家好!
我用12位AD芯片TLC2543采集0--5V电压数据,单片机程序是没有问题的,因为我用串口调试工具可以看到PC机收到正确的数据:


其中,“09”是TLC2543采集结果的高8位,“86"是TLC2543采集结果的低8位,所以12位数据是:0x986,转成十进制是:2438,对应的电压是:2438/4096 * 5 = 2.976V,和实际电压相符。
但我修改了第二版资料中的例子7的LV程序,却不能正常显示电压波形。修改后的LV程序如下:


我的单片机波特率是:115200,而且每次单片机只发两个字节的数据。不知为什么,修改后的LV程序不能显示0--5V电压。

请帮忙看一下,非常感谢!

cpubbs 发表于 2008-7-25 21:03:20

兄弟,那个OFFSET不对!您这个如果是二字节的话,应该是0和1

cpubbs 发表于 2008-7-25 21:04:28

因为您的CPU程序和我们的有所不同,所以造成这个OFFSET也不同!

cpubbs 发表于 2008-7-25 21:06:12

兄弟再试试这个,就改了二个数字,一个原来是1现在改为0,一个原来是2现在改为1,因为跟您的CPU程序有关的原因!

wyb4993 发表于 2008-7-25 22:17:19

初学labview,困难重重.还是不行啊
我的MCU主程序如下:
void main(void)
{
EA = 1;               //开总中断
ES = 1;               //开串口中断
CS = 1;               //设置TLC2543片选为高      

SCON = 0x50;            //串口方式1工作,8位数据位,1位停止位,无奇偶校验,允许接收
TMOD = 0x21;            //定时器1定时方式2(8位自动重装计数器);定时器0工作于定时方式1(TH0+TL0共16位全部参加计数)
PCON = 0x80;                 //波特率加倍控制,SMOD位
TH1 = 0xff;             //定时器/计数器T1置初值   波特率115200
    TL1 = 0xff;             //定时器/计数器T1置重装数
TR1 = 1;                //启动定时器T1        
       
    pc_command = 0;
       
    while(1)
   {
   while(pc_command != 0x11);                                //等待PC发送开始传送指令
   pc_command = 0;
    read2543(0x30);   //第一次读A/D无效
    delay_10us();
    read2543(0x30);    //
    delay_10us();        //A/D转换时间
ES = 0;                                                                                                    
    SBUF = ah;            //        转换结果的高4位                                                       
    while(TI == 0);
    TI = 0;
    SBUF = al;            //转换结果的低8位                                               
    while(TI == 0);
    TI = 0;
    ES = 1;
}
}

wyb4993 发表于 2008-7-25 22:19:38

VISA是装了的,因为我运行其他LV串口程序,是可以看到接收的数据的

wyb4993 发表于 2008-7-26 11:01:06

把MCU程序修改成和例子7差不多的,主要程序如下:

/*******************************************************************/
/*                                                               */
/* 单片机在串口接收1字节                                           */
/* 说明:串口接收中断                                              */
/*                                                               */
/*******************************************************************/
void serial_int(void) interrupt 4
{
   if (RI)
{
   ES = 0;         
   pc_command = SBUF;
   RI = 0;
   ES = 1;   
}
}

void data_convert(uint data_to_convert)               //把数据折开成四字节,为了方便发送
{
data_conver = 0;
data_conver = (uchar)((data_to_convert & 0x0f00) >> 8);
data_conver = (uchar)((data_to_convert & 0x00f0) >> 4);
data_conver = (uchar)(data_to_convert & 0x000f);      
}
      
void main(void)
{
    uchar i;
EA = 1;               //开总中断
ES = 1;               //开串口中断

    SCON = 0x50;            //串口方式1工作,8位数据位,1位停止位,无奇偶校验,允许接收
TMOD = 0x20;            //定时器1定时方式2(8位自动重装计数器
PCON = 0x80;                   //波特率加倍控制,SMOD位
TH1 = 0xff;             //定时器/计数器T1置初值   波特率115200
    TL1 = 0xff;             //定时器/计数器T1置重装数
TR1 = 1;                //启动定时器T1         
      
while(1)
{
    while(pc_command != 0x11);                //等待PC发送开始传送指令
pc_command = 0;
    read2543(0x30);
    delay_10us();
    read2543(0x30);
    data_convert(ad);               //ad是uint类型,
    for(i = 0;i < 4;i++)          //循环4次,即是发送四次,每次发送一个字节
{
       SBUF = data_conver;            //发送变换后的4字节数据
    while(TI==0);                      //等待发送完毕
    TI = 0;                                                      //发送完毕以后清除发送完标志位
}
}
}



还是不行,前面板显示如下:


用其它串口工具却可以看到4个字节的数据:


实在是太郁闷了.

cpubbs 发表于 2008-7-26 11:04:15

不用改CPU的程序,按上面的我传的,我试过将您第一个图中的数据进行转换,得到的值确实是您所说的那个2.9几伏的!

您看一下那个COM的下拉能下拉下来吗?

cpubbs 发表于 2008-7-26 11:04:53

是不是串口被占用了呢?有没有关闭其他串口部分,兄弟高亮后面板程序试试看有没有错误码!

cpubbs 发表于 2008-7-26 11:05:17

先选好串口再运行它!

cpubbs 发表于 2008-7-26 11:05:34

如果需要自由度高点的,可以看例8会更方便些的!

cpubbs 发表于 2008-7-26 11:07:52

刚发现问题了,兄弟您的单片机波特率是115200的话,上位机LABVIEW程序默认是9600,改一下波特率,应该就可以了!

wyb4993 发表于 2008-7-26 11:33:28

高亮后如下:

wyb4993 发表于 2008-7-26 11:37:46

波特率我修改如下,运行后还是不行:

wyb4993 发表于 2008-7-26 11:44:08

还有一个问题一直想不清楚:

在MCU程序中,单片机发送给PC机的数据是实际的TLC2543采集的数据,不是对应的ASCII码.但串口上跑的却是ASCII码,难道RS232协议会自动把准备发到串口线路上的数据,自动转换成对应的ASCII码吗?

因为看了PC机这边的LV程序,要对从串口来的ASCII码转成16进制数据,所以对这个问题还是想不通.
页: [1] 2
查看完整版本: 用TLC2543,LV程序修改了第二版资料中的例子7,看不到采集的0--5V电压?