[应用方案] PCF8591实时采集的例程

[复制链接]
3182|25
 楼主| chenci2013 发表于 2023-11-18 20:19 | 显示全部楼层 |阅读模式



  1. /*******************************************************************
  2.                      起动总线函数               
  3. 函数原型: void  IIcStart();  
  4. 功能:     启动I2C总线,即发送I2C起始条件.  
  5. ********************************************************************/
  6. void IIcStart()
  7. {
  8.   SCL=1;
  9.         SDA=1;         /*发送起始条件的数据信号*/
  10.       delay5us();
  11.   SDA=0;                     /*发送起始信号*/
  12.            delay5us();   
  13. }

  14. /*******************************************************************
  15.                       结束总线函数               
  16. 函数原型: void  IIcStop();  
  17. 功能:     结束I2C总线,即发送I2C结束条件.  
  18. ********************************************************************/
  19. void IIcStop()
  20. {
  21.         SCL=1 ;
  22.   SDA=0;      /*发送结束条件的数据信号*/
  23.            delay5us();
  24.   SDA=1;      /*发送I2C总线结束信号*/
  25.            delay5us();
  26. }

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

  40. /********************************************************************
  41.                    等待应答
  42. 函数原型:  IIc_WaitACK(void);
  43. 功能:      主控器进行应答信号(0是就帮答)
  44. ********************************************************************/
  45. bit IIc_WaitAck(void)
  46. {
  47.           SCL=0;
  48.               delay5us();         
  49.           SCL=1;
  50.               delay5us();
  51.     if(SDA==1)
  52.                 {
  53.                 SCL=0;
  54.                 return 0;        
  55.           }
  56.           else
  57.                 {
  58.                  SCL=0;
  59.                  return 1;
  60.                 }        
  61. }



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

  86. /*******************************************************************
  87.                  字节数据接收函数               
  88. 函数原型: UCHAR  RcvByte();
  89. 功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  90.           发完后请用应答函数应答从机。  
  91. ********************************************************************/   
  92. unsigned char RcvByte(void)
  93. {
  94.     unsigned char  i,j,k;
  95.            SCL=0;
  96.                   delay5us();
  97.   for(i=0;i<8;i++)
  98.       {
  99.         SCL=1;
  100.                                     delay5us();
  101.          j=SDA;  
  102.                                  k=(k<<1)|j;
  103.                                  SCL=0;
  104.                                     delay5us();
  105.       }
  106.                         return k;
  107. }


  108. /*******************************************************************
  109. D/A 变换, 转化函数               
  110. *******************************************************************/
  111. void DAC(unsigned char dat)
  112. {
  113.    IIcStart();              //启动总线
  114.    SendByte(0x90);            //发送器件地址0x90是写,0x91是读
  115.     IIc_WaitAck();
  116.    SendByte(0x41);                //发送控制字节//允许DA输出
  117.           IIc_WaitAck();
  118.    SendByte(dat);            //发送DAC的数值  
  119.     IIc_WaitAck();
  120.    IIcStop();               //结束总线
  121. }


  122. /*******************************************************************
  123. ADC读字节数据函数               
  124. *******************************************************************/
  125. unsigned char ADC(unsigned char addr)
  126. {  
  127.          unsigned char temp;

  128.    IIcStart();          //启动总线
  129.    SendByte(0x90);      //发送器件地址0x90是写,0x91是读
  130.     IIc_WaitAck();
  131.          SendByte(addr);                //控制字节:选择光敏电阻(0x41)还是滑动变阻器(0x43
  132.     IIc_WaitAck();
  133.    IIcStart();         
  134.    SendByte(0x91);                                
  135.           IIc_WaitAck();
  136.          temp=RcvByte();
  137.           IIc_Ack(1);            //0表示发送应答,1表示发送非应答
  138.          IIcStop();
  139.          return temp;         
  140. }


ccook11 发表于 2024-4-6 21:11 | 显示全部楼层
PCF8591有多个地址,可以通过焊接不同的引脚来选择不同的地址。
wengh2016 发表于 2024-4-6 21:23 | 显示全部楼层
PCF8591的数据采集速率可能受到多种因素的影响,如采样频率、通信带宽等。
jackcat 发表于 2024-4-6 22:07 | 显示全部楼层
PCF8591的转换时间大约为100ms。如果你的应用需要更快的采样率,需要考虑这一点,或者使用更高分辨率的ADC。
i1mcu 发表于 2024-4-7 14:58 | 显示全部楼层
需要正确实现PCF8591的初始化、数据读取等功能。例如,可以使用查询方式读取PCF8591的数据,以提高实时性。
updownq 发表于 2024-4-7 18:23 | 显示全部楼层
对于A/D转换,发送一个有效的模式地址给PCF8591后,所选通道的采样电压将被转换成相应的8位二进制码。
olivem55arlowe 发表于 2024-4-7 20:24 | 显示全部楼层
PCF8591通过I2C通信协议与单片机进行通信。
albertaabbot 发表于 2024-4-9 13:09 | 显示全部楼层
在实时采集过程中,PCF8591可能会消耗一定的电力,并产生一定的热量。
bartonalfred 发表于 2024-4-9 18:15 | 显示全部楼层
实现错误检测和处理机制,如I2C通信错误、转换超时等。
phoenixwhite 发表于 2024-4-11 22:46 | 显示全部楼层
:PCF8591输出的数据是12位,但在很多例程中,可能只使用8位来进行简化处理
youtome 发表于 2024-4-12 05:14 | 显示全部楼层
采集到的模拟量数据可能需要经过滤波、线性化等处理才能用于后续的计算或显示。
cemaj 发表于 2024-4-14 20:20 | 显示全部楼层
电源噪声和接地问题可能会影响数据采集的准确性和稳定性。
dspmana 发表于 2024-4-15 08:22 | 显示全部楼层
PCF8591的地址包含固定部分和可编程部分。可编程部分通过地址引脚A0、A1和A2来设置。在I2C总线协议中,地址必须在起始条件后作为第一个字节发送。
fengm 发表于 2024-4-15 13:03 | 显示全部楼层
在实际应用中,可能会遇到通信错误、数据溢出等异常情况。
qiufengsd 发表于 2024-4-15 13:16 | 显示全部楼层
PCF8591具有可编程地址引脚,可以通过这些引脚设置设备的地址。
uptown 发表于 2024-4-15 15:28 | 显示全部楼层
需要考虑到数据处理和存储的效率,以及可能存在的数据溢出等问题。
bestwell 发表于 2024-4-16 10:24 | 显示全部楼层
PCF8591的采样速率受到时钟频率和通信速率的限制。
youtome 发表于 2024-4-16 15:54 | 显示全部楼层
发送到PCF8591的控制字节用于控制器件的功能。确保控制字节的格式正确,特别是BIT7和BIT3必须设置为0,BIT6是模拟输出允许位,BIT4和BIT5用于定义模拟输入的方式(单端或差分输入),最后三位用于选择模拟输入的通道。
kkzz 发表于 2024-4-16 21:19 | 显示全部楼层
PCF8591有两个地址,分别为0x48和0x4C。
minzisc 发表于 2024-4-16 22:52 | 显示全部楼层
PCF8591的ADC转换需要一定的时间,因此在程序中需要等待转换完成后再读取转换结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

6690

帖子

4

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