TI论坛
直播中

新疆切糕

13年用户 1266经验值
私信 关注
[问答]

tlc4545读出来显示一直是0.00,为什么?


  • 读出来显示一直是0.00
    #include
    #include
    #include<51_12864.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit AD_CS=P1^3;
    sbit AD_SCLK=P1^1;
    sbit AD_SDO=P1^2;
    uchar table[]="0123456789jk";
    uchar str[3];
    //************初始化tlc4545****************************************
    void init_tlc4545()
    {
    AD_CS=0;
    AD_SCLK=1;

    AD_SCLK=0;

    AD_SCLK=1;

    AD_SCLK=0;

    AD_SCLK=1;

    AD_SCLK=0;

    AD_CS=1;//拉高复位初始化结束
    _nop_();
    _nop_();
    }
    //***********读取AD转化结果*********************************************************
    unsigned int read_tlc4545()
    {
    uint i,temp,j;
    AD_SCLK=1;
    AD_CS=1;
    _nop_();
    AD_CS=0;
    for(i=0;i<16;i++) //16个时钟周期
    {
    AD_SCLK=0;
    if(AD_SDO)
    {
    temp=(temp<<1)|0x0001;
    }
    else
    temp=temp<<1;
    AD_SCLK=1;


    }

    AD_SCLK=0; //8个时钟周期
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;
    AD_SCLK=0;
    AD_SCLK=1;

    //总共24个时钟周期


    AD_CS=1;
    Delay_ms(10); //延时保证转换时间足够
    return temp;
    }
    void main()
    {
    unsigned int temp;
    unsigned int value;
    lcdinit(); //12864初始化
    init_tlc4545();// tlc4545初始化
    disply_string(0x80,"电压采集测试");//液晶显示默认字符
    while(1)
    {

    value=read_tlc4545(); //读取AD转换值
    temp=(value*5/65535)*100; //AD值处理
    str[0]=temp/100+0x30;
    str[1]=(temp/10)%10+0x30;
    str[2]=temp%10+0x30;


    disply_string(0x90,str);
    }
    }

回帖(1)

李静

2025-1-17 16:51:21
根据您提供的代码片段,您正在尝试使用TLC4545(一个16位逐次逼近型ADC)来读取模拟信号并将其转换为数字值。然而,您提到读出来的值一直是0.00。这可能是由以下几个原因导致的:

1. 硬件连接问题:请检查您的TLC4545模块与单片机之间的连接是否正确。确保AD_CS、AD_SCLK和AD_SDO引脚正确连接,并且没有短路或断路。

2. 电源问题:确保TLC4545模块和单片机都已正确供电。如果电源不稳定或电压不足,可能会导致模块无法正常工作。

3. 初始化代码问题:您的初始化代码可能存在问题。请确保您已经正确地将TLC4545模块复位。以下是修改后的初始化代码:

```c
void init_tlc4545() {
    AD_CS = 0;
    AD_SCLK = 1;
    AD_SCLK = 0;
    _nop_(); // 延时,确保复位信号稳定
    AD_SCLK = 1;
    _nop_();
    AD_SCLK = 0;
    _nop_();
    AD_CS = 1; // 拉高复位初始化结束
}
```

4. 读取ADC值的代码问题:您没有提供完整的读取ADC值的代码。请确保您正确地实现了读取ADC值的函数。以下是一个示例:

```c
uchar read_tlc4545() {
    uchar i;
    uchar result = 0;

    AD_CS = 0; // 选中TLC4545
    for (i = 0; i < 16; i++) { // 读取16位ADC值
        AD_SCLK = 1;
        _nop_();
        if (AD_SDO) {
            result |= (1 << (15 - i)); // 将高位的位设置为1
        }
        AD_SCLK = 0;
    }
    AD_CS = 1; // 取消选中TLC4545

    return result;
}
```

5. 代码逻辑问题:请检查您的代码逻辑,确保在读取ADC值后正确地处理和显示结果。例如,您可以将读取到的ADC值转换为电压值,并将其显示在LCD或串口上。

请尝试以上建议,检查硬件连接、电源和代码实现,以解决读出来的值一直是0.00的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分