找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2305|回复: 0
收起左侧

STM32F407读取ADS1115双通道电压值程序与数据手册

[复制链接]
ID:312652 发表于 2021-12-8 10:32 | 显示全部楼层 |阅读模式
    ADS1115,是一款高精度16位ADC芯片
    测试平台STM32F407VET6
    读取双通道电压,通道1是IN0脚对地电压    ,通道2是IN2脚对地电压

  1. #include "iic_2.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////         


  4. //初始化IIC
  5. void IIC_2_Init(void)
  6. {                       
  7.   GPIO_InitTypeDef  GPIO_InitStructure;

  8.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

  9.    
  10.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  12.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  14.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  16.         IIC_2_SCL=1;
  17.         IIC_2_SDA=1;
  18. }
  19. //产生IIC起始信号
  20. void IIC_2_Start(void)
  21. {
  22.         IIC_2_SDA_OUT();      
  23.         IIC_2_SDA=1;                    
  24.         IIC_2_SCL=1;
  25.         delay_us(4);
  26.         IIC_2_SDA=0;  
  27.         delay_us(4);
  28.         IIC_2_SCL=0;
  29. }          
  30. //产生IIC停止信号
  31. void IIC_2_Stop(void)
  32. {
  33.         IIC_2_SDA_OUT();
  34.         IIC_2_SCL=0;
  35.         IIC_2_SDA=0;
  36.         delay_us(4);
  37.         IIC_2_SCL=1;
  38.         IIC_2_SDA=1;
  39.         delay_us(4);                                                                  
  40. }
  41. //等待应答信号到来
  42. //返回值:1,接收应答失败
  43. //        0,接收应答成功
  44. u8 IIC_2_Wait_Ack(void)
  45. {
  46.         u8 ucErrTime=0;
  47.         IIC_2_SDA_IN();      
  48.         IIC_2_SDA=1;delay_us(1);          
  49.         IIC_2_SCL=1;delay_us(1);         
  50.         while(IIC_2_READ_SDA)
  51.         {
  52.                 ucErrTime++;
  53.                 if(ucErrTime>250)
  54.                 {
  55.                         IIC_2_Stop();
  56.                         return 1;
  57.                 }
  58.         }
  59.         IIC_2_SCL=0;   
  60.         return 0;  
  61. }
  62. //产生ACK应答
  63. void IIC_2_Ack(void)
  64. {
  65.         IIC_2_SCL=0;
  66.         IIC_2_SDA_OUT();
  67.         IIC_2_SDA=0;
  68.         delay_us(2);
  69.         IIC_2_SCL=1;
  70.         delay_us(2);
  71.         IIC_2_SCL=0;
  72. }
  73. //不产生ACK应答                    
  74. void IIC_2_NAck(void)
  75. {
  76.         IIC_2_SCL=0;
  77.         IIC_2_SDA_OUT();
  78.         IIC_2_SDA=1;
  79.         delay_us(2);
  80.         IIC_2_SCL=1;
  81.         delay_us(2);
  82.         IIC_2_SCL=0;
  83. }                                                                              
  84. //IIC发送一个字节
  85. //返回从机有无应答
  86. //1,有应答
  87. //0,无应答                          
  88. void IIC_2_Send_Byte(u8 txd)
  89. {                        
  90.     u8 t;   
  91.          IIC_2_SDA_OUT();             
  92.    IIC_2_SCL=0;
  93.     for(t=0;t<8;t++)
  94.     {              
  95.         IIC_2_SDA=(txd&0x80)>>7;
  96.         txd<<=1;           
  97.                 delay_us(2);   
  98.                 IIC_2_SCL=1;
  99.                 delay_us(2);
  100.                 IIC_2_SCL=0;       
  101.                 delay_us(2);
  102.     }         
  103. }             
  104. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
  105. u8 IIC_2_Read_Byte(unsigned char ack)
  106. {
  107.         unsigned char i,receive=0;
  108.         IIC_2_SDA_IN();
  109.     for(i=0;i<8;i++ )
  110.         {
  111.         IIC_2_SCL=0;
  112.         delay_us(2);
  113.                 IIC_2_SCL=1;
  114.         receive<<=1;
  115.         if(IIC_2_READ_SDA)receive++;   
  116.                 delay_us(1);
  117.     }                                         
  118.     if (!ack)
  119.         IIC_2_NAck();
  120.     else
  121.         IIC_2_Ack();  
  122.     return receive;
  123. }




  124. /*
  125.         ADS1115
  126.         测试平台是STM32F407VET6
  127.         读取双通道电压,通道1是IN0脚对地电压        ,通道2是IN2脚对地电压
  128.         读取范围为±6.144 V,注意是正负,所以变量不要定义为uint,                               
  129.         base计算方式:6.144*2/65535≈0.00018750,放大100000000倍为18750整数比较好计算
  130.         注意delay_ms(10)不能删除,读取双通道的时候不加这个延迟,会出现读取通道1 却读到的是通道2的值,读通道2又读的是通道1的值
  131. */
  132. u16 base=18750;                 
  133. int v1,v2;
  134. void ADS_Read(void)                 
  135. {
  136.         u8 t;
  137.         short  int sensor1=0;
  138.         short  int sensor2=0;
  139.         u8  data1=0;                       
  140.         u8  data2=0;       
  141.         u8  data3=0;                       
  142.         u8  data4=0;
  143.        

  144.         IIC_2_Start();
  145.         IIC_2_Send_Byte(0X90);
  146.         IIC_2_Wait_Ack();
  147.         IIC_2_Send_Byte(0X01);
  148.         IIC_2_Wait_Ack();
  149.         IIC_2_Send_Byte(0xc0);
  150.         IIC_2_Wait_Ack();
  151.         IIC_2_Send_Byte(0X83);
  152.         IIC_2_Wait_Ack();
  153.         IIC_2_Stop();          
  154.         delay_ms(10);

  155.         IIC_2_Start();
  156.         IIC_2_Send_Byte(0X90);
  157.         IIC_2_Wait_Ack();
  158.         IIC_2_Send_Byte(0X00);
  159.         IIC_2_Wait_Ack();
  160.         IIC_2_Stop();         
  161.         delay_ms(10);

  162.         IIC_2_Start();
  163.         IIC_2_Send_Byte(0X91);
  164.         IIC_2_Wait_Ack();       
  165.         data1=IIC_2_Read_Byte(1);
  166.         data2=IIC_2_Read_Byte(1);       
  167.         IIC_2_Stop();       

  168.         sensor1=data1;
  169.         sensor1=sensor1<<8;
  170.         sensor1=sensor1+data2;                                               
  171.         //v1=sensor1*base ;                 自己算吧,这个值是放大后的值,要自己缩回去比如3.3V


  172.         IIC_2_Start();
  173.         IIC_2_Send_Byte(0X90);
  174.         IIC_2_Wait_Ack();
  175.         IIC_2_Send_Byte(0X01);
  176.         IIC_2_Wait_Ack();
  177.         IIC_2_Send_Byte(0xe0);
  178.         IIC_2_Wait_Ack();
  179.         IIC_2_Send_Byte(0X83);
  180.         IIC_2_Wait_Ack();
  181.         IIC_2_Stop();                 
  182.         delay_ms(10);


  183.         IIC_2_Start();
  184.         IIC_2_Send_Byte(0X90);
  185.         IIC_2_Wait_Ack();
  186.         IIC_2_Send_Byte(0X00);
  187.         IIC_2_Wait_Ack();
  188.         IIC_2_Stop();                 
  189.         delay_ms(10);

  190.         IIC_2_Start();
  191.         IIC_2_Send_Byte(0X91);
  192.         IIC_2_Wait_Ack();       
  193.         data3=IIC_2_Read_Byte(1);
  194.         data4=IIC_2_Read_Byte(1);       
  195.         IIC_2_Stop();       

  196.         sensor2=data3;
  197.         sensor2<<=8;
  198.         sensor2=sensor2+data4;                                               
  199.         //v2=sensor2*base ;

  200. }       
复制代码

iic_2.h
  1. #ifndef __IIC_2_H
  2. #define __IIC_2_H
  3. #include "sys.h"
  4.        
  5.                                 
  6. //IO方向设置
  7. #define IIC_2_SDA_IN()  {GPIOC->MODER&=~(3<<(1*2));GPIOC->MODER|=0<<1*2;}        //
  8. #define IIC_2_SDA_OUT() {GPIOC->MODER&=~(3<<(1*2));GPIOC->MODER|=1<<1*2;} //
  9. //IO操作函数         
  10. #define IIC_2_SCL    PCout(0) //SCL
  11. #define IIC_2_SDA    PCout(1) //SDA         
  12. #define IIC_2_READ_SDA   PCin(1)  //输入SDA


  13. //IIC所有操作函数
  14. void IIC_2_Init(void);                //初始化IIC的IO口                                 
  15. void IIC_2_Start(void);                                //发送IIC开始信号
  16. void IIC_2_Stop(void);                                  //发送IIC停止信号
  17. void IIC_2_Send_Byte(u8 txd);                        //IIC发送一个字节
  18. u8 IIC_2_Read_Byte(unsigned char ack);//IIC读取一个字节
  19. u8 IIC_2_Wait_Ack(void);                                 //IIC等待ACK信号
  20. void IIC_2_Ack(void);                                        //IIC发送ACK信号
  21. void IIC_2_NAck(void);                                //IIC不发送ACK信号


  22. #endif
复制代码

英文数据手册PDF下载: ads1115.pdf (1.95 MB, 下载次数: 15)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表