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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4998|回復: 6
打印 上一主題 下一主題
收起左側(cè)

stm32驅(qū)動ads1115讀數(shù)不準問題

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:377519 發(fā)表于 2019-8-3 14:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這幾天嘗試用stm32驅(qū)動ads1115,是直接從淘寶買的模塊,驅(qū)起來讀數(shù)時而看起來準(和手持萬用表測出來的差不多),時而不準,誤差非常大,不知道是為什么。個人感覺程序沒什么問題,會不會是硬件問題?因為我是用杜邦線接到開發(fā)板上的(正點原子的精英板),供電也用的是開發(fā)板上的3.3v,會不會是開發(fā)板3.3不穩(wěn)定導致內(nèi)部基準不穩(wěn)導致的?下面貼上程序,希望有大神可以幫忙看看。

STM32單片機源程序如下:
  1. #include "ads1115.h"
  2. #include "delay.h"


  3. u16 Ads1115_Config;                                                        //存放ADS1115配置寄存器的配置
  4. u8 Ads1115_Result[2];                                         //存放ADS1115轉(zhuǎn)換寄存器的數(shù)據(jù)
  5. u8 Writebuff[4],Readbuff[3];                //寫數(shù)據(jù)的命令和讀數(shù)據(jù)的命令緩存數(shù)組

  6. u16 ads1115_average_data[4];                //獲取到的4個通道的經(jīng)過濾波的后的值
  7. u16 filter_ave_buf[4][201];                        //濾波的數(shù)據(jù)
  8. u32 filter_sum_buf[4];                                        //數(shù)據(jù)總和
  9. u8 ch_count;                                                                                //通道數(shù)


  10. //初始化ADS1115的IO
  11. void ADS1115_Init(void)
  12. {                                             
  13.         GPIO_InitTypeDef GPIO_InitStructure;
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );                //使能PB端口時鐘
  15.           
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_15;                //PB13 PB15
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;                           //推挽輸出
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                        //輸出最大速度50MHz
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                                //初始化GPIOB

  20.         ADS1115_SCL=1;
  21.         ADS1115_SDA=1;
  22. }

  23. //********************************************
  24. //函數(shù)名稱:ADS1115_Start
  25. //功    能:完成IIC的起始條件操作
  26. //參    數(shù):無
  27. //返回值  :無
  28. //********************************************/
  29. void ADS1115_Start(void)
  30. {
  31.         ADS1115_SDA_OUT();                //sda線輸出
  32.   ADS1115_SDA=1;
  33.   ADS1115_SCL=1;
  34.   delay_us(2);
  35.         ADS1115_SDA=0;                                //START:when CLK is high,DATA change form high to low
  36.   delay_us(2);
  37.         ADS1115_SCL=0;                                //鉗住I2C總線,準備發(fā)送或接收數(shù)據(jù)
  38.         delay_us(2);
  39. }

  40. //********************************************
  41. //函數(shù)名稱:ADS1115_Stop
  42. //功    能:完成IIC的終止條件操作
  43. //參    數(shù):無
  44. //返回值  :無
  45. //********************************************/
  46. void ADS1115_Stop(void)
  47. {
  48.         ADS1115_SDA_OUT();                //sda線輸出
  49.         ADS1115_SCL=0;
  50.   ADS1115_SDA=0;                                //STOP:when CLK is high,DATA change form low to high
  51.   delay_us(2);
  52.   ADS1115_SCL=1;
  53.   delay_us(2);
  54.         ADS1115_SDA=1;                                //發(fā)送I2C總線結(jié)束信號
  55.         delay_us(2);
  56. }

  57. //********************************************
  58. //函數(shù)名稱:ADS1115_ACK
  59. //功    能:完成IIC的主機應答操作
  60. //參    數(shù):無
  61. //返回值  :無
  62. //********************************************/
  63. void ADS1115_ACK(void)
  64. {
  65.         ADS1115_SCL=0;
  66.         ADS1115_SDA_OUT();                //sda線輸出
  67.   ADS1115_SDA=0;
  68.   delay_us(2);
  69.   ADS1115_SCL=1;
  70.   delay_us(2);
  71.   ADS1115_SCL=0;
  72. }

  73. //********************************************
  74. //函數(shù)名稱:ADS1115_NACK
  75. //功    能:完成IIC的主機無應答操作
  76. //參    數(shù):無
  77. //返回值  :無
  78. //********************************************/
  79. void ADS1115_NACK(void)
  80. {
  81.         ADS1115_SCL=0;
  82.         ADS1115_SDA_OUT();                //sda線輸出
  83.         ADS1115_SDA=1;
  84.         delay_us(2);
  85.         ADS1115_SCL=1;
  86.   delay_us(2);
  87.   ADS1115_SCL=0;      
  88. }

  89. //**********檢查應答信號函數(shù)******************/
  90. ///*如果返回值為1則證明有應答信號,反之沒有*/
  91. ///*******************************************
  92. //函數(shù)名稱:ADS1115_Check
  93. //功    能:檢查從機的應答操作
  94. //參    數(shù):無
  95. //返回值  :從機是否有應答:1--有,0--無
  96. //********************************************/
  97. u8 ADS1115_Check(void)
  98. {
  99.         u8 slave_ack;
  100.   ADS1115_SDA_IN();
  101.   ADS1115_SDA=1;
  102.   delay_us(1);
  103.   ADS1115_SCL=1;
  104.   delay_us(1);
  105.   slave_ack = ADS1115_READ_SDA;   //讀入SDA數(shù)值
  106.   ADS1115_SCL=0;
  107.   delay_us(3);
  108.         if(slave_ack)return FALSE;
  109.         else         return TRUE;
  110. }

  111. /***************Write a Byte****************/
  112. void Write_1_Byte(u8 DataByte)
  113. {
  114.         u8 i;
  115.         ADS1115_SDA_OUT();                //sda線輸出
  116.         for(i=0;i<8;i++)
  117.         {
  118.                 if(DataByte&0x80)  
  119.                         ADS1115_SDA=1;
  120.                 else
  121.                         ADS1115_SDA=0;
  122.                 delay_us(3);
  123.                 ADS1115_SCL=1;
  124.                 delay_us(3);
  125.                 ADS1115_SCL=0;
  126.                 delay_us(2);
  127.                 DataByte <<= 1;
  128.         }
  129.         ADS1115_SDA=1;
  130.         delay_us(2);
  131. }

  132. /***************Write N Byte****************/
  133. u8 Write_N_Byte(u8 *writebuffer,u8 n)
  134. {
  135.         u8 i;
  136.         ADS1115_SDA_OUT();                //sda線輸出
  137.         for(i=0;i<n;i++)
  138.         {
  139.                 Write_1_Byte(*writebuffer);
  140.                 if(ADS1115_Check())
  141.                         writebuffer++;
  142.                 else
  143.                 {
  144.                         ADS1115_Stop();
  145.                   return FALSE;
  146.                 }
  147.         }
  148.         ADS1115_Stop();
  149.         return TRUE;
  150. }

  151. //***************Read a Byte****************/
  152. u8 Read_1_Byte(void)
  153. {
  154.         u8 data_Value=0,i;
  155.         for(i=0;i<8;i++)
  156.         {
  157.                 ADS1115_SDA_OUT();                //sda線輸出
  158.                 ADS1115_SDA=1;
  159.                 delay_us(3);
  160.                 ADS1115_SCL=1;
  161.                 delay_us(3);
  162.                 ADS1115_SDA_IN();
  163.                 data_Value<<= 1;
  164.                 if(ADS1115_READ_SDA)
  165.                         data_Value++;
  166.                 ADS1115_SCL=0;
  167.                 delay_us(2);
  168.         }
  169.         return data_Value;
  170. }

  171. //***************Read N Byte****************/
  172. void Read_N_Byte(u8*readbuff, u8 n)
  173. {
  174.         u8 i;       
  175.         for(i=0;i<n;i++)
  176.         {
  177.                 readbuff[i]=Read_1_Byte();
  178.                 if(i==n-1)
  179.                         ADS1115_NACK();  //不連續(xù)讀字節(jié)
  180.                 else
  181.                         ADS1115_ACK();         //連續(xù)讀字節(jié)
  182.         }
  183.         ADS1115_Stop();
  184. }

  185. //***************Write a Word***********************/
  186. void WriteWord(void)
  187. {
  188.         u8 t;
  189.         ADS1115_Start();   //寫入4個字節(jié)
  190.         do
  191.         {
  192.                 t=Write_N_Byte(Writebuff,4);
  193.         }while(t==0);
  194. }

  195. //***************Read Word***********************/
  196. void ReadWord(void)
  197. {
  198.         u8 t;
  199.         ADS1115_Start();          //寫入2個字節(jié)
  200.         do
  201.         {
  202.                 t=Write_N_Byte(Readbuff,2);
  203.         }while(t==0);
  204.         ADS1115_Start();   //寫入1個字節(jié)
  205.         do
  206.         {
  207.                 t=Write_N_Byte(&Readbuff[2],1);
  208.         }while(t==0);
  209.         Read_N_Byte(Ads1115_Result,2);  //讀出2個字節(jié)
  210. }

  211. //***************ADS1115********************/
  212. u16 ADS1115_Get_Data(u8 ch)
  213. {
  214.         u16 result;
  215.         if(ch==0)
  216.                 Ads1115_Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
  217.         else if(ch==1)
  218.                 Ads1115_Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
  219.         else if(ch==2)
  220.                 Ads1115_Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
  221.         else if(ch==3)
  222.                 Ads1115_Config = OS+MUX_A3+PGA+DR+COMP_QUE+MODE;   
  223.         Writebuff[0]=ADDRESS_W;                                                        //寫地址
  224.         Writebuff[1]=Pointer_1;                                                        //寫配置寄存器
  225.         Writebuff[2]=Ads1115_Config/256;                //寫配置
  226.         Writebuff[3]=Ads1115_Config%256;
  227.                        
  228.         Readbuff[0]=ADDRESS_W;                                                        //寫地址
  229.         Readbuff[1]=Pointer_0;                                                        //讀轉(zhuǎn)換寄存器                       
  230.         Readbuff[2]=ADDRESS_R;                                                        //讀地址

  231.         WriteWord();
  232.         delay_ms(1);
  233.         ReadWord();
  234.        
  235.   result=Ads1115_Result[0]*256+Ads1115_Result[1];  //轉(zhuǎn)換的數(shù)字量
  236.   return result;
  237. }

  238. /*-----------------------------------------------------------------------------------------------
  239.         名稱:中位值濾波法       
  240.         方法:連續(xù)采樣N次(N取奇數(shù)),把N次采樣值按大小排列,取中間值為本次有效值。
  241.         優(yōu)點:能有效克服因偶然因素引起的波動干擾,對溫度、液體的變化緩慢的被測參數(shù)有良好的濾波效果。
  242.         缺點:對流量、速度等快速變化的參數(shù)不宜。
  243.         出口參數(shù):filter_buf[50]
  244. ------------------------------------------------------------------------------------------------*/
  245. //void ADS1115_Process(void)                                               
  246. //{       
  247. //        u16 filter_buf[101];
  248. //  u16 i, j;
  249. //  u16 filter_temp;       
  250. //        for(i = 0; i < 101; i++)
  251. //        {
  252. //    filter_buf[i] = ADS1115_Get_Data(1);
  253. //  }
  254. //        for(j = 0; j < 100; j++)
  255. //        {
  256. //    for(i = 0; i < 100 - j; i++)                                 //將 100-j 個數(shù)中取最大的放在數(shù)組的最后(100-j)
  257. //                {
  258. //      if(filter_buf[i] > filter_buf[i + 1]) //數(shù)組右邊的小于左邊的
  259. //                        {
  260. //        filter_temp = filter_buf[i];
  261. //        filter_buf[i] = filter_buf[i + 1];        //將小的放在左邊
  262. //        filter_buf[i + 1] = filter_temp;                //將大的放在右邊
  263. //      }
  264. //    }
  265. //  }
  266. //        ads1115_average_data[1] = filter_buf[50];
  267. //}
  268.        
  269. /*-----------------------------------------------------------------------------------------------
  270.         名稱:遞推平均濾波法(又稱滑動平均濾波法)       
  271.         方法:把連續(xù)取得的N個采樣值看成一個隊列,隊列的長度固定為N,
  272.                                 每次采樣到一個新數(shù)據(jù)放入隊尾,并扔掉原來隊首的一次數(shù)據(jù)(先進先出原則),
  273.                                 把隊列中的N個數(shù)據(jù)進行算術(shù)平均運算,獲得新的濾波結(jié)果。
  274.         優(yōu)點:對周期性干擾有良好的抑制作用,平滑度高,適用于高頻震蕩的系統(tǒng)。
  275.         缺點:靈敏度低,對偶然出現(xiàn)的脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引起的采樣值偏差,
  276.                                 不適用于脈沖干擾比較嚴重的場合,比較浪費RAM。
  277.         出口參數(shù):filter_sum_buf/200
  278. ------------------------------------------------------------------------------------------------*/
  279. void ADS1115_Process(void)       
  280. {
  281.         u8 i;
  282.         filter_ave_buf[ch_count][200]=ADS1115_Get_Data(ch_count);                                                //讀出一個數(shù)據(jù)放在數(shù)組最右邊
  283.         for(i = 0; i < 200; i++)                                                                                                                                                                                 //200個數(shù)據(jù)取平均
  284.         {
  285.                 filter_ave_buf[ch_count][i] = filter_ave_buf[ch_count][i + 1];                 //所有數(shù)據(jù)左移,低位扔掉
  286.                 filter_sum_buf[ch_count] += filter_ave_buf[ch_count][i];                                        //求出200個數(shù)據(jù)總和
  287.         }       
  288.         ads1115_average_data[ch_count]=filter_sum_buf[ch_count]/200;                                //得到平均值
  289.         filter_sum_buf[ch_count]=0;                //清總和
  290.         ch_count++;                                                                                //切換下個通道,共4通道
  291.         if(ch_count>=4)
  292.                 ch_count=0;
  293. }


  294. void read(u8 ch)
  295. {
  296.        
  297. }
復制代碼

所有資料51hei提供下載:
F1-ADS1115例程.7z (231.58 KB, 下載次數(shù): 83)


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

使用道具 舉報

沙發(fā)
ID:388197 發(fā)表于 2019-8-4 02:07 | 只看該作者
沒記錯的話,ADS1115的基準電壓好像是內(nèi)部的.并不是以電源電壓為基準電壓的.好像有4.096V 2.048V之類的可選,具體怎么設置不太記得了,你找個例程對照手冊看看就知道了.
回復

使用道具 舉報

板凳
ID:377519 發(fā)表于 2019-8-4 10:18 | 只看該作者
cjm82 發(fā)表于 2019-8-4 02:07
沒記錯的話,ADS1115的基準電壓好像是內(nèi)部的.并不是以電源電壓為基準電壓的.好像有4.096V 2.048V之類的可選, ...

我找了很久都沒找到好使的例程,要么數(shù)都讀不到,要么也是和我一樣的問題,我換了一個模塊還這樣
回復

使用道具 舉報

地板
ID:388197 發(fā)表于 2019-8-4 12:31 | 只看該作者
基佬霍夫 發(fā)表于 2019-8-4 10:18
我找了很久都沒找到好使的例程,要么數(shù)都讀不到,要么也是和我一樣的問題,我換了一個模塊還這樣

怎么會呢,本論壇應該就有ADS1115的例程了
回復

使用道具 舉報

5#
ID:273656 發(fā)表于 2019-9-26 16:51 | 只看該作者
請問樓主最后怎么解決的?我也遇到了類似問題,時鐘采不到數(shù),謝謝啦
回復

使用道具 舉報

6#
ID:273656 發(fā)表于 2019-9-26 17:01 | 只看該作者
請問解決了嗎
回復

使用道具 舉報

7#
ID:273656 發(fā)表于 2019-10-11 17:42 | 只看該作者
采樣3.3V電壓誤差約0.07V,若AD輸入接地,誤差最大有0.16V,樓主問題解決了嗎。謝謝
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re6在线 | 一区二区三区四区毛片 | 亚洲精品一区二区三区四区高清 | 欧美一a一片一级一片 | 成人免费视频观看视频 | 成人h动漫精品一区二区器材 | 国产第二页 | 一区二区免费 | 久久久久久久国产精品影院 | www.日韩高清| 国内自拍真实伦在线观看 | 亚洲瑟瑟 | 日本一区二区三区精品视频 | 国产九一精品 | 国产精品久久性 | 国产精品乱码一区二区三区 | 毛片入口 | 国产不卡一区 | 久久精品网 | 久久尤物免费一区二区三区 | 欧美精品一区二区三区四区五区 | 国产精品自产拍在线观看蜜 | 中文字幕一区二区三区四区 | 欧美日韩精品一区二区天天拍 | 一区精品在线观看 | 欧美一区在线视频 | 综合五月 | 欧美11一13sex性hd | 91大神在线看 | 人人人人干 | 97精品久久 | 日韩欧美国产电影 | 日韩视频在线一区 | 天天射天天干 | 色精品视频 | 久久久一二三区 | 国产精品视频网 | 国产视频久久久 | 精品久久99 | 91网站在线看| 成人在线精品视频 |