2014年6月23日 星期一

[3DP]Dual thermocoupler sensor support with Marlin and RAMPS 1.4 在Marlin 與 RAMPS 1.4 使用雙熱電偶

好久沒更新部落格了,從大概2月開始玩3D printer,一開始就從Delta玩起,有點難度,不過一一克服中。

這邊介紹一下如何在RAMPS1.4 上使用Marlin firmware來用雙sensor來做溫度偵測與保護。

3DP因為持續地對塑膠加熱,然後常常需要長時間工作,10幾20個小時都很常見,這時候如果單靠一顆thermo sensor來做加熱的偵測回饋,有點風險。

雖然Marlin對於單sensor也有一些保護,如maximum temperature, minimum temperature的設定,因為通常溫度sensor失效時,偵測到的溫度不是極高或是極低,靠這兩個保護,也可以解決掉大多數的sensor 故障的問題。

但當sensor不是故障而是脫離,所以只偵測到室溫而已呢? 或是故障時停留在某個溫度時呢? 這時候軟體會以為溫度一直達不到預定目標,所以會對加熱棒一直加溫,結果輕則加熱棒燒毀,擠出頭座融化,重責引發火災。

其實我覺得韌體還有一些機制來做防止失誤,如:加熱幾分鐘內還無法達到目標溫度時停止加熱與列印。 不過個人功力有限,這邊就看有沒有能人來幫忙修改了。

那為什麼採用熱電偶(thermocouple) 而不用更常用的熱敏電阻(NTC)呢?

原因有兩個:
1. 熱電偶較耐高溫
2. 熱電偶有較佳的溫度曲線,不需要做查表補償

不過熱電偶的輸出只有很微弱的電壓,所以需要再sensor後面接一個放大器與零點補償的電路,現在有廠商有整合好的IC,所以使用上其實很簡單。

===================================================

Marlin 支持兩種熱電偶的IC,一種是數位,採用SPI介面的MAX6675,另外一種是類比的IC,AD595/AD597。

接法這邊兩種都會介紹,不過數位的MAX6675有幾個問題,而不能採用:

介紹目前使用的AD597接法:

一般買到的module板子只需要接3個pin,+5V, GND, S(訊號) 我買到的板子實際用會有一些問題:

1. 溫度offset: 這邊後來查出是因為這塊板子在+5V輸入有串一顆diode作保護,這樣子會讓IC的5V會有一些drop,造成板子的輸出會跟Arduino參考的5V有偏差,把這顆diode拿掉直接改用0 ohm電阻,或是把它short就好。

2. 打印時,溫度sensor因為noise關係,輸出不是很穩定,常會有10幾度的跳動,這樣容易造成PID控制也會跟著不穩定: 這邊我的作法是在5V跟GND加一顆10uF/16V的電容,與在熱電偶線的輸入端並一顆0.1uF的電容,這樣子就蠻穩定了。

這邊我用的pin腳是thermo0 A3, thermo1是A4,RAMPS 1.4這兩pin剛好跟5V與GND一起,用一個4 pin的排珍就可以接出來了。

在Marlin的修改:

 configuration.h
#define TEMP_SENSOR_0 -1
#define TEMP_SENSOR_1 -1

//開啟雙sensor保護 #define 
#define TEMP_SENSOR_1_AS_REDUNDANT
//當兩顆sensor溫度差達20度時,marlin會停止列印 
MAX_REDUNDANT_TEMP_SENSOR_DIFF 20


pins.h

 //在相對應的motherboard ID(一般單擠出頭,有熱床的MEGA都是選33)下面,把thermo0/1的 pin位置做修改


#define TEMP_0_PIN 3 #define TEMP_1_PIN 4

======================================================

MAX6675的接法(不過目前有問題,無法使用)

1. 只支持在thermo sensor0使用,所以只能用一顆sensor
2. Marlin firmware有bug,目前使用會跟smart controller LCD pin衝突,就算改pin重新定義還是無法使用,所以就放棄了

這邊簡單寫一下接法:













congiguration.h

#define TEMP_SENSOR_0 -2 //


temperature.cpp

long max6675_previous_millis = -MAX6675_HEAT_INTERVAL;

pin.h

// SPI for Max6675 Thermocouple
#ifndef SDSUPPORT // these pins are defined in the SD library if building with SD support #define MAX_SCK_PIN 52
#define MAX_MISO_PIN 50
#define MAX_MOSI_PIN 51
#define MAX6675_SS 53
#else #define MAX6675_SS 49
#endif
=====================================================