打印
[51单片机]

请教PCF8591电压采集问题

[复制链接]
2084|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读写时序没问题吧?

使用特权

评论回复
5
hyseyic|  楼主 | 2015-10-19 21:13 | 只看该作者
ningling_21 发表于 2015-10-19 14:51
IIC读写时序没问题吧?

读写时序没问题,因为我获取通道0的值是正常的。

使用特权

评论回复
6
hyseyic|  楼主 | 2015-10-19 21:46 | 只看该作者
qazq123 发表于 2015-10-19 11:55
转换通道跟ADC采集应该是有冲突的,你看看芯片手册,ADC那章,什么情况下才可以转换通道,比如说要先关闭 ...

我看了没有需要关闭寄存器的啊

使用特权

评论回复
7
ningling_21| | 2015-10-20 08:58 | 只看该作者
hyseyic 发表于 2015-10-19 21:13
读写时序没问题,因为我获取通道0的值是正常的。

看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/

使用特权

评论回复
8
明眸| | 2015-10-20 16:59 | 只看该作者
控制字应该是ADC_PCF8591(0x40);ADC_PCF8591(0x41);ADC_PCF8591(0x42);ADC_PCF8591(0x43);分别对应通道AIN0,AIN1.AIN2,AIN3

使用特权

评论回复
9
hyseyic|  楼主 | 2015-10-20 22:27 | 只看该作者
ningling_21 发表于 2015-10-20 08:58
看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/ ...

好的

使用特权

评论回复
10
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就可以了

使用特权

评论回复
11
hyseyic|  楼主 | 2015-11-12 21:27 | 只看该作者
ningling_21 发表于 2015-10-20 08:58
看一下这个**,对你肯定有帮助
http://masust.blog.163.com/blog/static/14695408420108921341512/ ...

你好。你有QQ吗?有些问题想探讨一下。

使用特权

评论回复
12
ayb_ice| | 2015-11-13 08:13 | 只看该作者
hyseyic 发表于 2015-10-19 11:00
比如我改成: ADC_PCF8591(0x05);获取通道1的值,show_value(receivebuf[1]);//显示通道1的AD值。我用开发 ...

非应答信号处理错误

其它地方没有仔细看

使用特权

评论回复
13
hyseyic|  楼主 | 2015-11-13 23:08 | 只看该作者
ayb_ice 发表于 2015-11-13 08:13
非应答信号处理错误

其它地方没有仔细看

你好,有QQ或者邮箱吗?我有问题请教。

使用特权

评论回复
14
ayb_ice| | 2015-11-16 07:58 | 只看该作者
hyseyic 发表于 2015-11-13 23:08
你好,有QQ或者邮箱吗?我有问题请教。

1109706098

使用特权

评论回复
15
qazq123| | 2015-11-16 09:17 | 只看该作者
看下要不要设置多通道模式,转换通道要等ADC采样完了才能转换的好像,之间会有冲突的。

使用特权

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

本版积分规则

42

主题

166

帖子

1

粉丝