打印

TLC2543的问题

[复制链接]
2405|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zydwh|  楼主 | 2008-8-5 17:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,本人最近使用TLC2543时发现,我程序设定为12位A/D转换结果,但最后程序运行
后,数据总是以8的倍数变化,有时候变化16,32,等,看不到一个数字的变化,感觉单片
机与TLC2543数据交换有问题。但也不是完全不对,比如选择通道等还是正确的,就是输出
数据感觉不是12位的,另外程序中CLK延时也会影响结果输出。程序我检查很长时间,看不
出问题,不知大家有无这方面的经验,望指教一下!

相关帖子

沙发
lifangying| | 2008-8-6 08:20 | 只看该作者

以前的一TLC2543实例

/***************************************
        一次转换的A/D转换子程序
功能:1.参数port是采样的通道号
       在第十一通道再扩展八路
     2.从TLC2543读取采样值
***************************************/
uint adbyte(uchar port)    
{
    uint idata addata;
    uchar idata i,al,ah;
    SCK=0;
    EA=0;    
    ADCS=0;                                        //片选有效
    port<<=4;
    port=port|0x0c;                             //选择16输出数据长度
    for(i=0;i<8;i++)                            //把通道号写入2543
    {
        SI=(bit)(port&0x80);
        ah<<=1;
        SCK=1;
        if(SO) ah|=1;                            //取D11--D4
        SCK=0;
        port<<=1;
    }
    for (i=0;i<8;i++)
    {
        al<<=1;
        SCK=1;
        if(SO) al|=1;                            //取D3--D0
        SCK=0;
    }
    ADCS=1;
    addata=ah;
    addata<<=4;
    al>>=4;
    addata|=al;                                    //得到AD转换的12位数据
    EA=1;
    return (addata);
}

使用特权

评论回复
板凳
TI_CPIC| | 2008-8-15 16:47 | 只看该作者

RE

电源是否供电正常?输入信号是否在要求的范围内,此外接地是否分开接地?避免出现模拟部分的大的返地电流干扰数字信号的输出.

使用特权

评论回复
地板
chinawei97| | 2008-8-26 09:20 | 只看该作者

给你一个能用得!

#include<reg52.h>
#include "adc.h"
#include<INTRINS.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ushort unsigned short

sbit EOC = P1^3;
sbit CLK = P1^4;
sbit DIN = P1^5;
sbit DOUT = P1^6;
sbit CS = P1^7;
sbit TURN_CLK=P1^0;
sbit TURN_UCLK=P1^1;

sbit adjust_20=P2^0;
sbit adjust_30=P2^1;
sbit adjust_40=P2^2;


unsigned long idata  sys_timer=0;
float idata voltage_con;
float idata voltage_moto;

uint idata voltage_con1;
uint idata voltage_moto1;
uchar idata voltage_adjust;


void adc_init(void);
float adc_voltage(int channel);
float adc_value(int channel);
float voltage_avrg(int channel);
void  delay(void);
void  adjust_init(void);


void  adjust_init(void)
{
    if(adjust_20==0)
        voltage_adjust=20;
    else
    if (adjust_30==0)
        voltage_adjust=30;
    else   
        voltage_adjust=40;
}





void adc_init(void)
{
    CS = 1;
    CLK = 0;
}

float  adc_voltage(int channel)
{    
    float r;
    switch(channel)
        {
        case 1:r = adc_value(channel); r= r;return r;// 测量的值放大10 倍
        case 0:r = adc_value(channel); r= r;return r;        
        default:return 0;
        }
}

float adc_value(int channel)
{
    int i;
    uchar d;
    ushort r;

    d = (((unsigned char)channel)<<4)+0x02;
    CS = 0;
    for(i=0;i<12;i++)
        {
        if(i<8)
            {
            if( d&(1<<(7-i))) DIN = 1;else DIN=0;
            }
        else
            DIN = 0;
        CLK = 1;
        CLK = 0;
        }
    DIN = 0;
    while(EOC==0);

    r = 0;
    for(i=0;i<12;i++)
        {
        CLK = 1;
        if(DOUT)r|=(1<<i);
        CLK = 0;
        }
    CS = 1;
    return (float)r*5/4095.0;
}

float voltage_avrg(int channel)
{
        
    static float  idata r_temp;
        char idata i;
        r_temp=0;
    for(i=0;i<10;i++)
        r_temp=r_temp+adc_voltage(channel);
        r_temp=r_temp/10;
    return    r_temp;
        
}

使用特权

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

本版积分规则

8

主题

58

帖子

0

粉丝