久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3578|回復: 1
打印 上一主題 下一主題
收起左側

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, 下載次數: 16)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:1116403 發表于 2024-10-30 18:57 | 只看該作者
太感謝博主你了,被這個問題困擾了很久,一直以為是因為ADS模塊的讀取的數值是上一次的數值的問題,改成單讀取模式也沒用,后來以為是數據緩存數組的問題,改了之后也沒用。博主你就是我的再生父母!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品久久 | 欧美精品99 | 久久精品国产久精国产 | 欧美精品久久久 | 国产精品射 | 国产99久久精品一区二区永久免费 | 成人做爰69片免费观看 | 97国产精品视频人人做人人爱 | 国产成人精品一区二区三区网站观看 | 亚洲精品国产偷自在线观看 | 亚洲成人精品免费 | 欧美精品一二三 | 婷婷久 | 一区二区精品 | 亚洲在线观看视频 | 免费国产一区二区视频 | 视频在线一区二区 | 久草综合在线视频 | 男女午夜免费视频 | 欧美久久免费观看 | www.性色 | 久久久精品一区二区三区四季av | 国产精品爱久久久久久久 | 久久久久久久久中文字幕 | 在线视频 亚洲 | 看av网址| 日韩不卡一区二区 | 黄色在线免费播放 | 国产精品久久久久久一区二区三区 | 亚洲国产成人精品女人久久久野战 | 久久久久国产一区二区三区四区 | 一级毛片免费完整视频 | 国产色婷婷精品综合在线手机播放 | 久久亚洲国产精品 | 久久精品国产99国产精品 | 国产中的精品av涩差av | 久久久久国产 | 欧美一区二区久久 | 亚洲国产欧美在线人成 | 亚洲免费人成在线视频观看 | 欧美国产视频 |