基於STM32和ADS1118的熱電偶設計筆記
最近做專案用到了ADS1118,用來做熱電偶溫度採集,主控為STM32F103。記錄一下在編寫驅動時遇到的問題和解決方法。
在編寫驅動前,要認真閱讀資料手冊,如果晶片廠商給出了相關解決方案,最好根據其方案進行設計。
《ADS1118資料手冊》,《簡單的熱電偶測量解決方案》,主要依據這兩個手冊完成硬體電路和驅動程式的編寫。
1 硬體設計
上圖就是TI給出的硬體設計。
2 驅動程式設計
2.1 ADS1118的SPI時序
ADS1118使用的SPI匯流排,因此驅動還是比較好寫的。
最開始寫的時候,因為沒有認真看資料手冊,採集到的資料一直不正確,最後仔細看了一下時序圖,發現是由於在
在
2.2 配置STM32的SPI引腳
STM32的SPI引腳配置時,可以使用8位幀資料格式,也可以使用16位幀資料格式,ADS1118資料為MSB優先,空閒時SCLK保持低電平,下降沿時對資料取樣。
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI _DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//SCLK空閒狀態低電平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二個跳變沿取樣
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI _CRCPolynomial = 7;//CRC值計算的多項式
SPI_Init(SPI1, &SPI_InitStructure);
2.3 資料採集
2.3.1 獲取ADC資料
由於低功耗的要求,ADS1118被配置為單次模式。以下說明均按照單次模式。
資料手冊上對資料傳輸的說明如下:
在單次轉換模式和連續轉換模式下, ADS1118 均以相同方式寫入或讀取資料, 無需發出任何命令。 ADS1118 的工作模式通過配置暫存器中的 MODE 位進行選擇。
將 MODE 位置為 0 可使器件在連續轉換模式下工作。 在連續轉換模式下, 器件連續啟動新的轉換, 即使 CS 處於高電平也是如此。
將 MODE 位置為 1 可啟動單次轉換模式。在單次轉換模式下, 只有向 SS 位寫入 1 時才會啟動新的轉換。
始終對轉換資料進行緩衝並在新轉換資料替換前始終保留當前資料。 因此, 可隨時讀取資料, 無需擔心資料損壞。當 DOUT/DRDY 置為低電平時, 指示新轉換資料已就緒, 可通過移出 DOUT/DRDY 中的資料進行讀取。
ADS1118 還可以在同一資料傳輸週期內直接回讀配置暫存器設定。 完整的資料傳輸週期由 32 位( 使用配置暫存器資料回讀) 或 16 位( 僅在 CS 線路受控且永久置為低電平時使用) 組成。
在編寫驅動的時候,參考了TI給出的MSP430的驅動程式,採用32位完整傳輸週期。
32 位資料傳輸週期中的資料由四個位元組組成:兩位元組用於轉換結果,另外兩位元組用於配置暫存器回讀。
我個人認為每個週期中的DATA是上一次的轉換結果,因此要獲取當前時刻的轉換結果需要寫入四次資料,頭兩次寫入有效的暫存器配置,啟動轉換,後兩次則隨意寫入無效資料讀取轉換結果。
在讀取轉換結果之前需要判斷是否完成了資料轉換。這裡就有兩種方式:
(1)根據DOUT/DRDY引腳是否變為低電平。
(2)根據設定的資料傳輸速率做合理延時,例如860SPS完成一次轉換需要最少1.2ms,因此在頭兩次暫存器配置寫入之後,再延時2ms就可以執行資料讀取。
這兩種方式的程式碼如下(註釋為方式1):
ADC1_CS_LOW();
delay_us(200);
//第一次寫入配置,返回值為上一次採集的資料
SPI_ReadWrite16Bit(SPI1,data);
//第二次寫入配置,返回值為暫存器回讀值
tmp = SPI_ReadWrite16Bit(SPI1,data);
delay_ms(2);
//ADS1118_SPI_MISO_PIN引腳低電平指示新資料可用
//GPIO_ResetBits(ADS1118_SPI_GPIO_PORT, ADS1118_SPI_MISO_PIN);
//GPIO_InitStructure.GPIO_Pin = ADS1118_SPI_MISO_PIN;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//GPIO_Init(ADS1118_SPI_GPIO_PORT, &GPIO_InitStructure);
//while(GPIO_ReadInputDataBit(ADS1118_SPI_GPIO_PORT, ADS1118_SPI_MISO_PIN) != 0) ;
//GPIO_InitStructure.GPIO_Pin = ADS1118_SPI_MISO_PIN;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_Init(ADS1118_SPI_GPIO_PORT, &GPIO_InitStructure);
//GPIO_SetBits(ADS1118_SPI_GPIO_PORT, ADS1118_SPI_MISO_PIN);
//讀取轉換資料
value = SPI_ReadWrite16Bit(SPI1,0x00FF);
tmp = SPI_ReadWrite16Bit(SPI1,0x00FF);
delay_us(200);
ADC1_CS_HIGH();
2.3.2 獲取溫度感測器資料
ADS1118內建14位的高精度溫度感測器,可直接讀取熱電偶冷端溫度,便於進行冷端溫度補償。對於溫度的資料格式,資料手冊有如下說明:
溫度資料以 14 位結果呈現, 與 16 位轉換結果左對齊。 資料從最高有效位元組 (MSB) 開始輸出。 當讀取這兩個資料位元組, 前 14 位用來指定溫度測量結果。 一個 14 位 LSB 等於 0.03125°C。 負數以二進位制補碼形式表示.
要將數字程式碼轉換為溫度,首先需要檢查 MSB 是0還是1。如果 MSB 為0,將十進位制程式碼乘以 0.03125°C即可獲得結果。如果 MSB = 1, 則將結果減“1”後對各位取補碼。之後將結果乘以 –0.03125°C。
剛開始由於沒有仔細看採用的是左對齊格式,對資料的處理就出了問題。最後實在TI的論壇上看到的才又仔細看了一下資料手冊。
也就是說,在採集回溫度資料之後:
(1)MSB為0,把資料右移兩位,乘以 0.03125°C。
(2)MSB為1,資料減1後取反,再右移兩位,乘以 -0.03125°C。
2.4 小結
至此,對於ADS1118驅動編寫的注意事項就說完了,總的來說都不是什麼大問題,但是需要詳細閱讀資料手冊,所以在編寫驅動前一定要熟讀資料手冊,特別是對時序和資料格式的說明,一定要弄明白。
3 熱電偶資料處理
這裡的資料處理就比較簡單了,按照《簡單的熱電偶測量解決方案》 給出的軟體方案來寫就可以了。
首先,讀取熱端的電壓值,然後在讀取冷端的溫度,這裡測得的片載溫度轉換為相應的所使用的熱電偶型別的電壓。我們使用的是K型熱電偶,因此就按照廠家提供的K型熱電偶分度表進行轉換。才用了32點插值,通過手冊給出的公式進行溫度電壓之間的轉換。
/*溫度(度)*/
const u16 TempList[2][33] = /*電壓(uV)*/
{//K型熱電偶分度表
{0,5, 10, 15, 20, 25, 30, 35, 40, 55, 70, 85, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 220, 240, 260, 280, 300, 400, 500, 600, 700, 800},
{0,198,397,597,789,1000,1203,1407,1611,2229,2850,3473,4095,4508,4919,5327,5733,6137,6539,6939,7338,7737,8137,8938,9745,10560,11381,12207,16395,20640,24902,29128,33277}
};
熱電偶溫度計算的程式碼如下:
//獲取熱端電壓uV
temp->HotVoltage = ADS1118_WriteReadData(0,START_ADC1_DP_CH0) * 7.8125;
//熱電偶最大量程1375度,54875uV
if(temp->HotVoltage >= TCMax) return 0xFFFF;
//ADC溫度感測器採集值轉換為度
tmp = (ADS1118_WriteReadData(0,START_ADC1_TS)) >> 2;
//ADC溫度1LSB為0.03125度
temp->ColdTemp = tmp * 0.03125;
//獲取冷端電壓(晶片溫度轉為分度表中的電壓)
temp->TInList = FindList(TinList,temp->ColdTemp);
temp->ColdVoltage = (TempList[1][temp->VInList-1]+(TempList[1][temp->VInList]-TempList[1][temp->VInList-1])*((temp->ColdTemp-TempList[0][temp->VInList-1])/(TempList[0][temp->VInList]-TempList[0][temp->VInList-1])));
//熱電偶冷端溫度補償
voltage = temp->HotVoltage + temp->ColdVoltage;
//轉換為熱端實際溫度
temp->VInList = FindList(VinList,voltage);
temp->Temperature =(TempList[0][temp->VInList-1]+(TempList[0][temp->VInList]-TempList[0][temp->VInList-1])*((voltage-TempList[1][temp->VInList-1])/(TempList[1][temp->VInList]-TempList[1][temp->VInList-1])));
溫度測量範圍為0~800度,所以就不考慮零下溫度的情況。
4 總結
經過實際測試,精度大概為
相關推薦
基於STM32和ADS1118的熱電偶設計筆記
最近做專案用到了ADS1118,用來做熱電偶溫度採集,主控為STM32F103。記錄一下在編寫驅動時遇到的問題和解決方法。 在編寫驅動前,要認真閱讀資料手冊,如果晶片廠商給出了相關解決方案,最好根據其方案進行設計。 《ADS1118資料手冊》,《簡單的熱電偶
基於STM32和EV1527的無線接收解碼程式
摘自: 一、1527的資料幀結構 無線遙控的編碼,從編碼型別上來說,分為2類,一類是固定碼,也就是編碼晶片的地址是不變的,晶片型號以 EV1527、PT2262 為代表。另一種是滾動碼,晶片的地址碼是變化的,晶片以HS300、HS301為代表。 1 EV1527
基於STM32和GPS-NEO-6M模組實現GPS導航定位的
0. 前言 主要參考正點原子 stm32 《第92講 GPS-NEO-6M全球定位模組講解》、 使用硬體: GPS-NEO-6M,stm32開發板 配套軟體:串列埠除錯助手、U-center 技術文件:《ATK-NEO-6M使用者手冊_V2.0》、《u-blox6_Rece
基於STM32的TFT_LCD&TOUCH設計選型
1、MCU選擇 要用到FSMC,選擇3系列的STM32F303VDT6 LQFP100 384K FLASH 80K RAM 作業系統採用 OS2,及STemWin LCD使用ILI9341驅動的2.8寸TFT 觸控式螢幕採用GT9
基於stm32和ov7725的智慧循跡車
基於stm32f103zet6的智慧循跡車。 1.L298n IN1IN2控制一個輪子,IN3IN4控制另外一個。這裡使用的是直流電機,控制如下: 為了使用pwm進行調速,一定要記得用跳帽使調速度端為高電平。這樣,輸入不同佔空比的pwm波就可以實現
在KEIL下搭建基於 STM32 和 rt-thread 的開發環境
RT_thread開發人員是用MDK(Keil)進行開發管理的,當然也提供了IAR等開發環境的配置。針對初學者都提供了相關的教程和案例,不過專案開發,還是得講究一下如何有效搭建開發環境和配置。 MDK(Keil)的安裝和配置(破解)就略過了。能進行開發移植系統
一種基於STM32的APP和BootLoader設計的方法
IAP(In Application Programming)即在應用程式設計, IAP 是使用者自己的程式在執行過程中對User Flash 的部分割槽域進行燒寫,目的是為了在產品釋出後可以方便地通過預留的通訊口對產品中的韌體程式進行更新升級。 通常實現 IAP 功能時,即使用者程式執
基於ARM和Linux的嵌入式Web Server設計與實現_愛學術——免費下載
重要 image 平臺 服務 linu amp 設計與實現 體系 www. 【摘要】介紹了嵌入式ARM處理器的特點和硬件平臺的設計、嵌入式操作系統的設計,構建了基於嵌入式Web Server的遠程監測系統結構,重點分析了嵌入式TCP/IP協議棧的體系結構、嵌入式Web服務器
opencv 視覺項目學習筆記(二): 基於 svm 和 knn 車牌識別
its ++ eas -a rect() repr poi obj std 車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測圖像中感興趣區域; 2)特征提取: 對字符圖像集中的每個部分進行提取; 3)分類: 判斷圖像快是不是車牌或者 每
第一章 程序設計和C語言(筆記)
deb 第一章 bug 總結 warn 標準 war 包含 基本 一、程序和程序語言 程序:完成某項事務所預設的活動方式和活動過程。 程序設計:人們描述計算機要做的工作。 對於工作過程的細節動作描述就是一個“程序”。 在一個程序描述中,總有一批預先假定的“基本動作”,是執行
基於STM32的TFT_LCD&TOUCH設計選型
1、MCU選擇 要用到FSMC,選擇3系列的STM32F303VDT6 LQFP100 384K FLASH 80K RAM 作業系統採用 OS2,及STem
基於STM32的半導體制冷片控制系統設計
一些醫療檢測儀器在檢測時需要模擬人體溫度環境以確保檢測的精確性,本文以STM32為主控制器,電機驅動晶片DRV8834 為驅動器,驅動半導體致冷器(帕爾貼)給散熱片加熱或者製冷。但由於常規的溫度控制存在慣性溫度誤差的問題,無法兼顧高精度和高速性的嚴格要求,所以採用模糊自適應PID控制方法線上實時調整
STM32畢業設計:基於STM32打造的兩輪直立自平衡小車
STM32畢業設計:基於STM32打造的兩輪直立自平衡小車 畢設的資料——STM32兩輪自平衡小車系統,完整資料分享出來,給需要的人,論壇上也新開通了智慧小車的下載版塊,所有硬體和軟體的資料都可以免費下載,現在分享部分內容,給即將畢業的小夥伴的小福利,有什麼不懂的可以加群詢問:813238832,或者到闖客
《嵌入式軟體設計基礎——基於ARM Cortex—M3》讀書筆記
此書有點深,記錄點自己能夠看懂的。 1、記憶體管理一章:講到變數的型別、生存週期、記憶體分配。 auto static register 區域性變數,全域性變數 malloc free 記憶體碎片,消除記憶體池的一個常見的策略是可以使用分配池 2、共享記憶體一章:講到如何編寫可重入函式,很多
[原創]基於OneNET雲實現STM32+K型熱電偶溫度HTTP實時上報
公司手頭有個專案,需要做溫控系統,溫度探頭引線長度至少10米,帶液晶顯示,還要無線上報,仔細研究下來,確定了 STM32+K型熱電偶+SIM800C方案 其實看著真的很簡單,完整做下來,真心。。。電路細節暫時不表,基本一路綠燈,軟體真心調的懷疑人生。記錄下來,以便有同仁指教 S
基於AT89C52和MQ-2的煙霧報警器設計
基於AT89C52和MQ-2的煙霧報警器設計 摘要:介紹了一種基於AT89C52微控制器和MQ-2型半導體電阻式煙霧感測器的煙霧報警器設計。該煙霧報警器具有聲光報警、濃度顯示以及與上位機串列埠通訊等功能。其結構簡單,價格低廉,效能穩定,具有較好的實用價值。 本文引用地址:http://www
opencv 視覺專案學習筆記(二): 基於 svm 和 knn 車牌識別
車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測影象中感興趣區域; 2)特徵提取: 對字元影象集中的每個部分進行提取; 3)分類: 判斷影象快是不是車牌或者 每個車牌字元的分類。 車牌識別分為兩個步驟, 車牌檢測, 車牌識別, 都屬於模式識別。 基本結構如下: 一、車牌
基於TCP和Socket的Linux環境下簡易聊天工具設計
主要實現一個Linux下的區域網聊天工具的設計。 該設計主要分為兩部分,客戶端部分和伺服器端部分。 執行伺服器端程式可以和任意一個運行了的客戶端程式的進行通訊,通訊內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vim編輯器,通過tcp,套介面程式設計實現
[原始碼和文件分享]基於C#和SQL SERVER的企業進銷存管理系統的設計和實現
摘要 進銷存管理是現代企業生產經營中的重要環節,是完成企業資源配置的重要管理工作,對企業生產經營效率的最大化發揮著重要作用。本文以我國中小企業的進銷存管理為研究物件,描述了企業進銷存管理系統從需求分析、系統設計、系統實現到系統測試的全週期。在本次設計確定了進銷存系統的基礎功能需求,深入剖析了企業
[原始碼和文件分享]基於VS2012和SQL SERVER的餐廳點餐系統設計與實現
一、需求分析 1. 面向物件 點典點菜系統是一款面向顧客和管理人員的全方面系統,其中管理人員又包括服務員、採購員和廚師。本組認真分析了不同物件的需求,為不同的物件都設計了獨特的系統功能。簡化了傳統點菜、燒菜和採購方式繁瑣的步驟,為顧客提供便捷操作的同時提高酒店管理的效率。 2. 市場背景