打印
[应用方案]

PCF8591实时采集的例程

[复制链接]
1439|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenci2013|  楼主 | 2023-11-18 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



/*******************************************************************
                     起动总线函数               
函数原型: void  IIcStart();  
功能:     启动I2C总线,即发送I2C起始条件.  
********************************************************************/
void IIcStart()
{
  SCL=1;
        SDA=1;         /*发送起始条件的数据信号*/
      delay5us();
  SDA=0;                     /*发送起始信号*/
           delay5us();   
}

/*******************************************************************
                      结束总线函数               
函数原型: void  IIcStop();  
功能:     结束I2C总线,即发送I2C结束条件.  
********************************************************************/
void IIcStop()
{
        SCL=1 ;
  SDA=0;      /*发送结束条件的数据信号*/
           delay5us();
  SDA=1;      /*发送I2C总线结束信号*/
           delay5us();
}

/********************************************************************
                   发送应答
函数原型:  IIc_ACK(bit a);
功能:      主控器进行应答信号(注意:0表示发送应答,1表示发送非应答)
********************************************************************/
void IIc_Ack(bit ack)
{
    SCL=1;
        delay5us();
    SDA=ack;                           /*清时钟线,钳住I2C总线以便继续接收*/
                            delay5us();
          SCL=0;
}

/********************************************************************
                   等待应答
函数原型:  IIc_WaitACK(void);
功能:      主控器进行应答信号(0是就帮答)
********************************************************************/
bit IIc_WaitAck(void)
{
          SCL=0;
              delay5us();         
          SCL=1;
              delay5us();
    if(SDA==1)
                {
                SCL=0;
                return 0;        
          }
          else
                {
                 SCL=0;
                 return 1;
                }        
}



/*******************************************************************
                 字节数据发送函数               
函数原型: void  SendByte(UCHAR c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
          此状态位进行操作.(不应答或非应答都使ack=0)     
           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void SendByte(unsigned char date)
{
    unsigned char temp,i;                   //用于探测字节内某一位值的掩码变量
            temp=date;
    for (i=0; i<8; i++)           //从高位到低位依次进行
    {
                          temp=temp<<1;
                          SCL=0 ;
                             delay5us();
                                SDA = CY;
           delay5us();
        SCL = 1;              //拉高SCL
          delay5us();
    }
                SCL = 0;
    SDA = 1;                 //8位数据发送完后,主机释放SDA,以检测从机应答
}

/*******************************************************************
                 字节数据接收函数               
函数原型: UCHAR  RcvByte();
功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
          发完后请用应答函数应答从机。  
********************************************************************/   
unsigned char RcvByte(void)
{
    unsigned char  i,j,k;
           SCL=0;
                  delay5us();
  for(i=0;i<8;i++)
      {
        SCL=1;
                                    delay5us();
         j=SDA;  
                                 k=(k<<1)|j;
                                 SCL=0;
                                    delay5us();
      }
                        return k;
}


/*******************************************************************
D/A 变换, 转化函数               
*******************************************************************/
void DAC(unsigned char dat)
{
   IIcStart();              //启动总线
   SendByte(0x90);            //发送器件地址0x90是写,0x91是读
    IIc_WaitAck();
   SendByte(0x41);                //发送控制字节//允许DA输出
          IIc_WaitAck();
   SendByte(dat);            //发送DAC的数值  
    IIc_WaitAck();
   IIcStop();               //结束总线
}


/*******************************************************************
ADC读字节数据函数               
*******************************************************************/
unsigned char ADC(unsigned char addr)
{  
         unsigned char temp;

   IIcStart();          //启动总线
   SendByte(0x90);      //发送器件地址0x90是写,0x91是读
    IIc_WaitAck();
         SendByte(addr);                //控制字节:选择光敏电阻(0x41)还是滑动变阻器(0x43
    IIc_WaitAck();
   IIcStart();         
   SendByte(0x91);                                
          IIc_WaitAck();
         temp=RcvByte();
          IIc_Ack(1);            //0表示发送应答,1表示发送非应答
         IIcStop();
         return temp;         
}


使用特权

评论回复
沙发
ccook11| | 2024-4-6 21:11 | 只看该作者
PCF8591有多个地址,可以通过焊接不同的引脚来选择不同的地址。

使用特权

评论回复
板凳
wengh2016| | 2024-4-6 21:23 | 只看该作者
PCF8591的数据采集速率可能受到多种因素的影响,如采样频率、通信带宽等。

使用特权

评论回复
地板
jackcat| | 2024-4-6 22:07 | 只看该作者
PCF8591的转换时间大约为100ms。如果你的应用需要更快的采样率,需要考虑这一点,或者使用更高分辨率的ADC。

使用特权

评论回复
5
i1mcu| | 2024-4-7 14:58 | 只看该作者
需要正确实现PCF8591的初始化、数据读取等功能。例如,可以使用查询方式读取PCF8591的数据,以提高实时性。

使用特权

评论回复
6
updownq| | 2024-4-7 18:23 | 只看该作者
对于A/D转换,发送一个有效的模式地址给PCF8591后,所选通道的采样电压将被转换成相应的8位二进制码。

使用特权

评论回复
7
olivem55arlowe| | 2024-4-7 20:24 | 只看该作者
PCF8591通过I2C通信协议与单片机进行通信。

使用特权

评论回复
8
albertaabbot| | 2024-4-9 13:09 | 只看该作者
在实时采集过程中,PCF8591可能会消耗一定的电力,并产生一定的热量。

使用特权

评论回复
9
bartonalfred| | 2024-4-9 18:15 | 只看该作者
实现错误检测和处理机制,如I2C通信错误、转换超时等。

使用特权

评论回复
10
phoenixwhite| | 2024-4-11 22:46 | 只看该作者
:PCF8591输出的数据是12位,但在很多例程中,可能只使用8位来进行简化处理

使用特权

评论回复
11
youtome| | 2024-4-12 05:14 | 只看该作者
采集到的模拟量数据可能需要经过滤波、线性化等处理才能用于后续的计算或显示。

使用特权

评论回复
12
cemaj| | 2024-4-14 20:20 | 只看该作者
电源噪声和接地问题可能会影响数据采集的准确性和稳定性。

使用特权

评论回复
13
dspmana| | 2024-4-15 08:22 | 只看该作者
PCF8591的地址包含固定部分和可编程部分。可编程部分通过地址引脚A0、A1和A2来设置。在I2C总线协议中,地址必须在起始条件后作为第一个字节发送。

使用特权

评论回复
14
fengm| | 2024-4-15 13:03 | 只看该作者
在实际应用中,可能会遇到通信错误、数据溢出等异常情况。

使用特权

评论回复
15
qiufengsd| | 2024-4-15 13:16 | 只看该作者
PCF8591具有可编程地址引脚,可以通过这些引脚设置设备的地址。

使用特权

评论回复
16
uptown| | 2024-4-15 15:28 | 只看该作者
需要考虑到数据处理和存储的效率,以及可能存在的数据溢出等问题。

使用特权

评论回复
17
bestwell| | 2024-4-16 10:24 | 只看该作者
PCF8591的采样速率受到时钟频率和通信速率的限制。

使用特权

评论回复
18
youtome| | 2024-4-16 15:54 | 只看该作者
发送到PCF8591的控制字节用于控制器件的功能。确保控制字节的格式正确,特别是BIT7和BIT3必须设置为0,BIT6是模拟输出允许位,BIT4和BIT5用于定义模拟输入的方式(单端或差分输入),最后三位用于选择模拟输入的通道。

使用特权

评论回复
19
kkzz| | 2024-4-16 21:19 | 只看该作者
PCF8591有两个地址,分别为0x48和0x4C。

使用特权

评论回复
20
minzisc| | 2024-4-16 22:52 | 只看该作者
PCF8591的ADC转换需要一定的时间,因此在程序中需要等待转换完成后再读取转换结果。

使用特权

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

本版积分规则

100

主题

6207

帖子

4

粉丝