# MAX6675熱電偶晶片整合模組解析 [Datasheet](https://www.analog.com/media/en/technical-documentation/data-sheets/max6675.pdf) ### 運行原理(簡易說明,引用自*[這篇](https://blog.csdn.net/weixin_42580645/article/details/111056589)*) * **溫度轉換:** 在將熱電電壓轉換為等效溫度值之前,必須補償熱電偶冷端(MAX6675環境溫度)與0°C虛擬基準之間的差異。對於K型熱電偶,電壓變化為41µV /°C,可通過以下線性方程式近似熱電偶特性,電壓變VOUT是熱電偶輸出電壓(µV)。TR是遠端熱電偶結的溫度(°C)。TAMB是環境溫度(°C) ![image](https://hackmd.io/_uploads/ByFpz8KdC.png) * **冷端補償:** 檢測並校正環境溫度的變化用 * **數字化:** ADC將冷端二極管的測量值與放大後的熱電偶電壓相加,並將12位結果讀出到SO引腳上。全零序列表示熱電偶讀數為0°C。全部為1的順序表示熱電偶讀數為+ 1023.75°C。 * **電源耦合雜訊:** 此晶片易受到電源耦合雜訊影響,應配置0.1pF電容可以最大限度減少雜訊影響(**模組已經整合進去)** ![image](https://hackmd.io/_uploads/HkMriUYu0.png) --- ### **輸出腳位圖PINOUT** ![image](https://hackmd.io/_uploads/B1pQDrFdA.png) ![image](https://hackmd.io/_uploads/BJWSvSF_A.png) ![image](https://hackmd.io/_uploads/rJ0Z_Bt_0.png) CS腳位 : 高電位時開始採集,低電位時將轉換結果從SO輸出 SCK腳位 : CS為低電位時,提供CLK信號讀取SO處的結果 SO腳位 : 讀取及輸出熱電偶數據 --- ### **Serial數據** ![image](https://hackmd.io/_uploads/SJaIUBtdA.png) 總計16bit資料 第2位元為熱電偶連接狀況0為正常,不正常反之為1 3到14位元,總計12位元為熱電偶資料,換算為十進制乘上0.25即為攝氏溫度 根據spec,採集週期應大於0.22秒且SPI端口速率要小於4.3MHz ![image](https://hackmd.io/_uploads/S1XNdE5_A.png) ![image](https://hackmd.io/_uploads/rJuWDLYdR.png) --- ### **程式實作Code** 程式設計如下,根據程式設計的資料量為: 正常運作時根據getsizeof()數值為xx.xx時佔用16個bytes 非正常運作時,會返回1的值,根據getsizeof()顯示占用14個bytes ![image](https://hackmd.io/_uploads/rJyMtSj_A.png) max6675.py將需要功能寫成function ``` import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) # 腳位設置 def set_pin (CS, SCK, SO, UNIT): global sck sck= SCK global so so = SO global unit unit = UNIT GPIO.setup(CS, GPIO.OUT, initial = GPIO.HIGH) GPIO.setup(SCK, GPIO.OUT, initial = GPIO.LOW) GPIO.setup(SO, GPIO.IN) # 讀取溫度(可調原始數據、攝氏、華氏) def read_temp(cs_no): GPIO.output(cs_no, GPIO.LOW) time.sleep(0.002) GPIO.output(cs_no, GPIO.HIGH) time.sleep(0.22) GPIO.output(cs_no, GPIO.LOW) GPIO.output(sck, GPIO.HIGH) time.sleep(0.001) GPIO.output(sck, GPIO.LOW) Value = 0 for i in range(11, -1, -1): GPIO.output(sck, GPIO.HIGH) Value = Value + (GPIO.input(so) * (2 ** i)) GPIO.output(sck, GPIO.LOW) GPIO.output(sck, GPIO.HIGH) error_tc = GPIO.input(so) GPIO.output(sck, GPIO.LOW) for i in range(2): GPIO.output(sck, GPIO.HIGH) time.sleep(0.001) GPIO.output(sck, GPIO.LOW) GPIO.output(cs_no, GPIO.HIGH) if unit == 0: temp = Value if unit == 1: temp = Value * 0.25 if unit == 2: temp = Value * 0.25 * 9.0 / 5.0 + 32.0 if error_tc != 0: return -cs_no else: return temp GPIO.cleanup() ``` 即可引入max6675.py使用 ``` # before import the max6675, you must save the max6675.py file at "/usr/lib/python2.7/dist-packages" # wiring # Raspberry MAX6675 # GND ------ GND # 5V ------ VCC # pin 18 ------ SCK # pin 22 ------ CS # pin 16 ------ SO # import max6675 module. import max6675 # set the pin for communicate with MAX6675 cs = 24 sck = 23 so = 21 # max6675.set_pin(CS, SCK, SO, unit) [unit : 0 - raw, 1 - Celsius, 2 - Fahrenheit] max6675.set_pin(cs, sck, so, 1) try: while 1: # read temperature connected at CS 22 a = max6675.read_temp(cs) # print temperature print(a) # when there are some errors with sensor, it return "-" sign and CS pin number # in this case it returns "-22" max6675.time.sleep(2) except KeyboardInterrupt: pass ```