|
發(fā)布時間: 2025-6-5 00:07
正文摘要:本帖最后由 七彩的夢想 于 2025-6-5 23:44 編輯 最近心血來潮買了幾個ADS1115模塊,想找個時間測試驗(yàn)證一下。發(fā)現(xiàn)模塊配送的資料是Arduino平臺,手頭沒有Arduino硬件,只有STC8G1K08單片機(jī),于是在本論壇找了個現(xiàn) ... |
|
從波形圖上看,讀回來的數(shù)據(jù)就有問題,是滿量程的時候?qū)?yīng)數(shù)據(jù) 7F F0 |
angmall 發(fā)表于 2025-6-5 16:42 感謝你的解答與幫助,我抽個時間好好檢查一下 |
|
AI的回復(fù)。 根據(jù)你的描述(“15位數(shù)據(jù)的低4位無法正常讀取,一直為0”),結(jié)合你提供的ADS1115驅(qū)動代碼,這里分析可能的原因和解決方案: --- ## 1. **ADS1115數(shù)據(jù)格式分析** ADS1115是16位ADC,但實(shí)際有效數(shù)據(jù)為15位(最高位為符號位,單端輸入時符號位為0)。數(shù)據(jù)寄存器為2字節(jié),結(jié)構(gòu)如下: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 S D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 其中,S為符號位(單端輸入時為0),D14~D0為數(shù)據(jù)位。 你代碼中的讀取方式為: D_ADS = Result[0] * 256 + Result[1]; 這里`Result`和`Result[1]`分別對應(yīng)高字節(jié)和低字節(jié)。 --- ## 2. **低4位為0的可能原因** ### **(1)數(shù)據(jù)拼接問題** - **Result和Result[1]的類型是否正確?** - 如果`Result`數(shù)組定義為`unsigned int`,而你用`Read_N_Byte(Result, 2);`讀取數(shù)據(jù),那么`Result`和`Result[1]`應(yīng)該分別對應(yīng)高字節(jié)和低字節(jié)。 - 但`Read_N_Byte`函數(shù)原型為`void Read_N_Byte(unsigned int*readbuff,unsigned char n)`,而`Read_1_Byte`返回的是`unsigned char`,所以`readbuff[i] = Read_1_Byte();`會把每個字節(jié)存到`unsigned int`數(shù)組的一個單元里,而不是連續(xù)存兩個字節(jié)。 - **正確做法**:`Result`應(yīng)該定義為`unsigned char Result[2];`,然后`Read_N_Byte(Result, 2);`(此時函數(shù)參數(shù)類型也要改為`unsigned char*`)。 - **你目前的實(shí)現(xiàn)**:`Result`和`Result[1]`都是`unsigned int`,每個單元只存了一個字節(jié),但拼接時直接相加,低字節(jié)可能被高位覆蓋或未正確賦值。 ### **(2)I2C讀取時序問題** - **I2C讀取時,是否完整讀取了兩個字節(jié)?** - 確保`Read_N_Byte`函數(shù)正確讀取了兩個字節(jié),且低字節(jié)(Result[1])的數(shù)據(jù)沒有被丟棄或覆蓋。 - 檢查`Read_1_Byte`函數(shù)是否正確返回每個字節(jié)。 ### **(3)ADS1115配置問題** - **是否配置為單端輸入、正確通道、正確PGA?** - 你的代碼中配置為單端輸入(MUX_A0~A3),PGA為4.096V,基本沒問題。 - **是否配置為連續(xù)轉(zhuǎn)換模式?** - 你的代碼中`MODE = MODE_1`(連續(xù)轉(zhuǎn)換),建議改為單次轉(zhuǎn)換(MODE_0),并在每次讀取前啟動轉(zhuǎn)換。 ### **(4)數(shù)據(jù)對齊問題** - **如果Result和Result[1]都是unsigned int,且每個單元只存了一個字節(jié),那么低字節(jié)的低4位可能被高位覆蓋。** - 例如,如果`Result = 0x12`,`Result[1] = 0x34`,拼接時`Result * 256 + Result[1]`理論上沒問題,但如果`Result[1]`的值不正確(比如被覆蓋或未賦值),那么低4位會為0。 --- ## 3. **解決方案** ### **(1)修改Result數(shù)組類型** unsigned char Result[2]; // 改為unsigned char ### **(2)修改Read_N_Byte函數(shù)** void Read_N_Byte(unsigned char *readbuff, unsigned char n) { unsigned char i; for(i = 0; i < n; i++) { readbuff[i] = Read_1_Byte(); if(i == n - 1) NACK(); // 不連續(xù)讀字節(jié) else ACK(); // 連續(xù)讀字節(jié) } Stop(); } ### **(3)修改數(shù)據(jù)拼接方式** D_ADS = ((unsigned int)Result[0] << 8) | Result[1]; ### **(4)檢查I2C時序和硬件連接** - **確保SCL和SDA引腳配置正確,無干擾。** - **確保ADS1115供電和參考電壓正常。** ### **(5)建議改為單次轉(zhuǎn)換模式** #define MODE MODE_0 // 單次轉(zhuǎn)換 并在每次讀取前寫入配置寄存器啟動轉(zhuǎn)換。 --- ## 4. **總結(jié)** - **低4位為0的根本原因很可能是Result數(shù)組類型和Read_N_Byte函數(shù)實(shí)現(xiàn)不匹配,導(dǎo)致低字節(jié)數(shù)據(jù)未正確保存。** - **建議將Result改為unsigned char數(shù)組,并修改Read_N_Byte函數(shù)為unsigned char*類型。** - **數(shù)據(jù)拼接時使用位操作,確保低字節(jié)不被覆蓋。** --- ## 5. **示例修正代碼片段** unsigned char Result[2]; // 改為unsigned char void Read_N_Byte(unsigned char *readbuff, unsigned char n) { unsigned char i; for(i = 0; i < n; i++) { readbuff[i] = Read_1_Byte(); if(i == n - 1) NACK(); else ACK(); } Stop(); } // 讀取數(shù)據(jù) Read_N_Byte(Result, 2); D_ADS = ((unsigned int)Result[0] << 8) | Result[1]; 這樣修改后,低4位數(shù)據(jù)應(yīng)該能正常讀取[1]。 |
感覺很復(fù)雜,我進(jìn)來是標(biāo)記一下等著學(xué)習(xí)的,大神快出來![]() |
Powered by 單片機(jī)教程網(wǎng)