[51单片机] 请教PCF8591电压采集问题

[复制链接]
2554|14
 楼主| hyseyic 发表于 2015-10-19 10:58 | 显示全部楼层 |阅读模式
我希望用PCF8591的四个模拟通道去采集四路电压,然后送LCD1602显示。我的开发板提供的程序是这样的:/*********************** PCF8591专用变量定义 ***********************/#define        PCF8591_WRITE        0x90
#define        PCF8591_READ         0x91
#define  NUM  4                     //接收和发送缓存区的深度
uchar idata receivebuf[NUM];    //数据接收缓冲区
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
void ADC_PCF8591(uchar controlbyte)
{
    uchar idata receive_da,i=0;
        iic_start();
        IICSendByte(PCF8591_WRITE);        //控制字
        check_ACK();
        if(askflag == 1)
        {
                SystemError = 1;
                return;
        }
        IICSendByte(controlbyte);        //控制字
        check_ACK();
        if(askflag == 1)
        {
                SystemError = 1;
                return;
        }
    iic_start();                //重新发送开始命令
           IICSendByte(PCF8591_READ);        //控制字
        check_ACK();
        if(askflag == 1)
        {
                SystemError = 1;
                return;
        }         
    IICreceiveByte();   //空读一次,调整读顺序
    slave_ACK();        //收到一个字节后发送一个应答位
        while(i<4)
        {  
          receive_da=IICreceiveByte();
          receivebuf[i++]=receive_da;
          slave_ACK();       //收到一个字节后发送一个应答位
        }
        slave_NOACK();       //收到最后一个字节后发送一个非应答位
        iic_stop();
}
然后主程序是这样处理:while(1)
  {
          EA = 0;
        iicInit();                      //I2C总线初始化
    ADC_PCF8591(0x04);
        if(SystemError == 1)          //有错误,重新来
        {
                  iicInit();                                  //I2C总线初始化
            ADC_PCF8591(0x04);
         }
         EA = 1;   


        delay(200);                                   //刷新速率 延迟
        show_value(receivebuf[0]);//显示AD值。

其中 ADC_PCF8591(0x04);是获取通道0的值,然后送显示。我如果想继续获取其他三个通道的AD值,是不是只需修改控制命令就可以了?

 楼主| hyseyic 发表于 2015-10-19 11:00 | 显示全部楼层
比如我改成: ADC_PCF8591(0x05);获取通道1的值,show_value(receivebuf[1]);//显示通道1的AD值。我用开发板验证,结果并不是预期的。问题出在哪呢?
qazq123 发表于 2015-10-19 11:55 | 显示全部楼层
hyseyic 发表于 2015-10-19 11:00
比如我改成: ADC_PCF8591(0x05);获取通道1的值,show_value(receivebuf[1]);//显示通道1的AD值。我用开发 ...

转换通道跟ADC采集应该是有冲突的,你看看芯片手册,ADC那章,什么情况下才可以转换通道,比如说要先关闭什么寄存器等。
ningling_21 发表于 2015-10-19 14:51 | 显示全部楼层
IIC读写时序没问题吧?
 楼主| hyseyic 发表于 2015-10-19 21:13 | 显示全部楼层
ningling_21 发表于 2015-10-19 14:51
IIC读写时序没问题吧?

读写时序没问题,因为我获取通道0的值是正常的。
 楼主| hyseyic 发表于 2015-10-19 21:46 | 显示全部楼层
qazq123 发表于 2015-10-19 11:55
转换通道跟ADC采集应该是有冲突的,你看看芯片手册,ADC那章,什么情况下才可以转换通道,比如说要先关闭 ...

我看了没有需要关闭寄存器的啊
ningling_21 发表于 2015-10-20 08:58 | 显示全部楼层
hyseyic 发表于 2015-10-19 21:13
读写时序没问题,因为我获取通道0的值是正常的。

看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/
明眸 发表于 2015-10-20 16:59 | 显示全部楼层
控制字应该是ADC_PCF8591(0x40);ADC_PCF8591(0x41);ADC_PCF8591(0x42);ADC_PCF8591(0x43);分别对应通道AIN0,AIN1.AIN2,AIN3
 楼主| hyseyic 发表于 2015-10-20 22:27 | 显示全部楼层
ningling_21 发表于 2015-10-20 08:58
看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/ ...

好的
 楼主| hyseyic 发表于 2015-10-21 23:06 | 显示全部楼层
明眸 发表于 2015-10-20 16:59
控制字应该是ADC_PCF8591(0x40);ADC_PCF8591(0x41);ADC_PCF8591(0x42);ADC_PCF8591(0x43);分别对应通道 ...

我看手册上,加上4是置位DA转换标志了。单纯AD转换的话,0X00;0X01;0X02;0X03就可以了
 楼主| hyseyic 发表于 2015-11-12 21:27 | 显示全部楼层
ningling_21 发表于 2015-10-20 08:58
看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/ ...

你好。你有QQ吗?有些问题想探讨一下。
ayb_ice 发表于 2015-11-13 08:13 | 显示全部楼层
hyseyic 发表于 2015-10-19 11:00
比如我改成: ADC_PCF8591(0x05);获取通道1的值,show_value(receivebuf[1]);//显示通道1的AD值。我用开发 ...

非应答信号处理错误

其它地方没有仔细看
 楼主| hyseyic 发表于 2015-11-13 23:08 | 显示全部楼层
ayb_ice 发表于 2015-11-13 08:13
非应答信号处理错误

其它地方没有仔细看

你好,有QQ或者邮箱吗?我有问题请教。
ayb_ice 发表于 2015-11-16 07:58 | 显示全部楼层
hyseyic 发表于 2015-11-13 23:08
你好,有QQ或者邮箱吗?我有问题请教。

1109706098
qazq123 发表于 2015-11-16 09:17 | 显示全部楼层
看下要不要设置多通道模式,转换通道要等ADC采样完了才能转换的好像,之间会有冲突的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

166

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部