本發(fā)明涉及溫度控制領(lǐng)域,尤其是一種3D打印機(jī)溫度控制系統(tǒng)。
背景技術(shù):
PID控制具有結(jié)構(gòu)簡(jiǎn)單、容易理解和方便實(shí)用等特點(diǎn),因此它現(xiàn)在依舊廣泛使用于溫度控制系統(tǒng)中。PID控制其實(shí)采用了比例控制,積分控制和微分控制三種控制計(jì)算方法。PID控制運(yùn)算將目標(biāo)溫度和實(shí)時(shí)溫度的差值作為輸入,分別通過(guò)比例、積分、微分運(yùn)算來(lái)得出控制輸出量。輸出量作為控制執(zhí)行機(jī)構(gòu)的輸入量通過(guò)PWM方式來(lái)判斷是否加熱還是冷卻。而PWM(Pulse Width Modulation)控制是脈沖寬度調(diào)節(jié)技術(shù),通過(guò)對(duì)一些系列脈沖的寬度進(jìn)行調(diào)制,來(lái)等效地獲得所需要波形(含形狀和幅值)。同樣,PWM技術(shù)也是對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過(guò)高分辨率計(jì)數(shù)器的使用,方波的占空比被調(diào)制用來(lái)對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。例如,在傳統(tǒng)熔融層積的3D打印機(jī)中當(dāng)PID運(yùn)算出控制量為256,PWM則在每一個(gè)單位時(shí)間內(nèi)對(duì)計(jì)數(shù)器加1且同時(shí)比較計(jì)數(shù)器中的數(shù)值和控制的大小輸出1或0,以此來(lái)實(shí)現(xiàn)占空比調(diào)節(jié)加熱功率。
3D打印中,參與溫度控制的對(duì)象有個(gè)兩個(gè):打印頭和熱床。兩者的溫度調(diào)節(jié)性能的好與壞會(huì)直接影響3D打印質(zhì)量。一般FDM型3D打印機(jī)打印頭一般分成兩個(gè)部分:冷端和熱端。冷端負(fù)責(zé)以合適的速度提供物料,并為噴嘴均勻噴出熔融物料提供壓力,熱端則負(fù)責(zé)將物料融化。冷端包含一個(gè)給料螺桿和迫使物料進(jìn)入熱端融化室的驅(qū)動(dòng)裝置。為了保證有足夠量的物料進(jìn)入融化室并提供合適的壓力,冷端必須在高摩擦負(fù)載下保持恒定驅(qū)動(dòng)速度的同時(shí)提供良好的轉(zhuǎn)矩相應(yīng)。加熱需要的溫度通常在150至250攝氏度之間,為了保證良好的溫度反饋控制,噴嘴外會(huì)緊密連接熱敏電阻或熱電偶來(lái)采集溫度。熱床,即構(gòu)建加熱平臺(tái)。FDM型3D打印機(jī)的熱床可以通過(guò)防止翹邊來(lái)提高打印質(zhì)量。當(dāng)擠出的塑料冷卻時(shí),塑料會(huì)出現(xiàn)輕微收縮。當(dāng)這個(gè)輕微的收縮過(guò)程在整個(gè)均勻打印中并沒(méi)有發(fā)生的時(shí)候,就會(huì)造成一部分塑料出現(xiàn)翹邊的情況。這種變形通常被視為邊角被抬離構(gòu)建平臺(tái)。在一個(gè)已加熱的熱床上進(jìn)行打印操作,已打印在熱床上的部分可以在打印過(guò)程中依舊保持一定的溫度,并且可以讓溫度低于熔點(diǎn)的材料產(chǎn)生收縮現(xiàn)象。在熱床上進(jìn)行3D打印操作,一些材料如ABS和PLA可以完成更高質(zhì)量的成品。
如圖1所示,傳統(tǒng)3D打印機(jī)溫度控制解決方案是通過(guò)軟件實(shí)現(xiàn)對(duì)打印頭和熱床的溫度控制,其中分為溫度采集、加熱及PID控制由三個(gè)部分組成:主程序完成PID參數(shù)自整定及PID運(yùn)算,得出溫度控制量;軟件中斷程序負(fù)責(zé)溫度采集及加熱、冷卻控制。每一個(gè)毫秒產(chǎn)生一次中斷來(lái)執(zhí)行溫度的采集和脈沖寬度調(diào)制方式加熱,而且為了采集到的溫度更加精確則采用過(guò)樣采集方式,即采集16次取平均值,然后作為PID運(yùn)算函數(shù)的輸入進(jìn)行PID控制。為了獲得穩(wěn)定、精確的溫度控制,現(xiàn)有方案要求溫度控制中斷程序必須以很高的頻率執(zhí)行。這無(wú)疑大大增大了CPU的工作負(fù)荷,也易導(dǎo)致與運(yùn)動(dòng)控制中斷程序的響應(yīng)沖突,產(chǎn)生程序跑飛現(xiàn)象,造成工作中斷。此外,當(dāng)打印速度提高時(shí),為了保證足夠的熔融時(shí)間,需要延長(zhǎng)擠壓頭熔融腔的長(zhǎng)度,這必然提高對(duì)溫度控制精確度的要求。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供一種新型的3D打印機(jī)溫度控制系統(tǒng),能有效提高溫度控制的實(shí)時(shí)性、精度及穩(wěn)定性,且降低CPU負(fù)載。
為實(shí)現(xiàn)上述目的,本發(fā)明的技術(shù)方案如下:
一種3D打印機(jī)溫度控制系統(tǒng),包括依次連接的總線接口模塊、寄存器文件、PID運(yùn)算模塊及溫度采集模塊,PID運(yùn)算模塊還連接加熱模塊,溫度采集模塊判斷采集到的溫度,若沒(méi)有超出預(yù)設(shè)范圍,則將溫度數(shù)據(jù)發(fā)送給PID運(yùn)算模塊,PID運(yùn)算模塊計(jì)算完成后,輸出有效信號(hào)和PID控制量給加熱模塊,加熱模塊采用PWM方式加熱,根據(jù)PID控制量的大小通過(guò)PWM方法來(lái)控制加熱的時(shí)間,PID運(yùn)算模塊分比例運(yùn)算、積分運(yùn)算、微分運(yùn)算和PID結(jié)果運(yùn)算四個(gè)部分通過(guò)硬件實(shí)現(xiàn)完成PID運(yùn)算結(jié)果。
其中,PID運(yùn)算模塊包括打印頭PID運(yùn)算模塊和熱床PID運(yùn)算模塊,加熱模塊包括打印頭加熱模塊和熱床加熱模塊,打印頭PID運(yùn)算模塊和熱床PID運(yùn)算模塊分別連接打印頭加熱模塊和熱床加熱模塊
優(yōu)選地,PID運(yùn)算模塊結(jié)合Bang-Bang控制來(lái)計(jì)算控制量,即目標(biāo)溫度與實(shí)時(shí)溫度做差,如果差值較大且超過(guò)閾值則采用Bang-Bang控制,不然則進(jìn)行PID運(yùn)算計(jì)算控制量。
優(yōu)選地,PID運(yùn)算模塊設(shè)置溫度差約束,如果目標(biāo)溫度和實(shí)時(shí)溫度差值大于溫度差約束則全功率加熱,如果目標(biāo)溫度和實(shí)際溫度小于0,則輸出0,即停止加熱。
優(yōu)選地,PID運(yùn)算模塊的運(yùn)算步驟具體為:
1)第一個(gè)周期所完成的運(yùn)算:
(1)將總線輸入的差值參數(shù)neg_pid_functional_range取反加1,判斷偏差是否小于0,即判斷其最高位是否為0,如果為0則是正數(shù),如果為1則是負(fù)數(shù),差值參數(shù)的作用在于如果實(shí)時(shí)溫度和設(shè)定溫度之間的差值如果大于它,則輸出全功率加熱,相反如果小于則輸出0,將PID運(yùn)算控制在5度以內(nèi)的精度,其中neg_pid_functional_range為32位數(shù)據(jù);
(2)計(jì)算差值error_reg,溫度采集模塊輸出的溫度實(shí)時(shí)數(shù)據(jù)i_current_temp與總線輸入的目標(biāo)溫度i_target_temp進(jìn)行差值計(jì)算;
(3)計(jì)算當(dāng)前溫度與前一次采集溫度的偏差變化值,即error_ctemp_dState,在PID運(yùn)算中會(huì)涉及到當(dāng)前溫度與前一次采集溫度的偏差值參與微分運(yùn)算,error_ctemp_dState由當(dāng)前溫度i_current_temp減去前一個(gè)運(yùn)算結(jié)果完成后所采集的溫度i_temp_dState_ex,i_temp_dState_ex則是每一次PID運(yùn)算模塊輸出后,鎖存在加熱模塊中,等待PID再一次運(yùn)算時(shí)候返回該值;
(4)將當(dāng)前溫度i_current_temp存入寄存器current_temp_1_reg,表示第一周期,將當(dāng)前溫度跟隨寄存器一直保持到第五個(gè)周期整體PID運(yùn)算結(jié)束后再將溫度輸出給加熱模塊,作為下一次實(shí)時(shí)溫度偏差值的輸入;
(5)輸入有效信號(hào)i_valid保存到寄存器valid1_reg中,表示第一周期;
2)第二個(gè)周期所完成的運(yùn)算:
(1)將第一周期寄存器數(shù)據(jù)current_temp_1_reg保存到寄存器current_temp_2_reg中;將第一個(gè)周期寄存器數(shù)據(jù)valid1_reg保存到寄存器valid2_reg,表示第二周期;
(2)完成比例運(yùn)算乘積項(xiàng)pTerm,將PID參數(shù)kp與差值項(xiàng)error_reg相乘,因?yàn)閗p與error_reg都是32位數(shù)據(jù),相乘則造成數(shù)據(jù)溢出,所以采用截位的方法保留乘積結(jié)果的16位,即pTerm_tmp[47:16],然后保存到寄存器pTerm_reg中,完成微分項(xiàng)計(jì)算;
(3)i_kd與error_ctemp_dState進(jìn)行乘法運(yùn)算,截位后得運(yùn)算結(jié)果dTerm_tmp_0[47:16],存入寄存器dTerm_tmp_0_reg;
(4)計(jì)算積分項(xiàng)中間變量temp_iState存入寄存器temp_iState_reg,由當(dāng)前差值項(xiàng)error_reg與前一次積分中間變量i_temp_iState_reg_ex相加得出;
(5)判斷信號(hào)min_pid_out_reg,max_pid_out_reg,在比較差值參數(shù)pid_functional_range后,如果滿足在差值參數(shù)范圍內(nèi),則繼續(xù)進(jìn)行PID運(yùn)算,如果不滿足,則將判斷信號(hào)置1,信號(hào)min_pid_out_reg置1,則PID運(yùn)算五個(gè)周期后輸出最小值,信號(hào)max_pid_out_reg置1,則PID運(yùn)算五個(gè)周期后輸出最大值;
3)第三個(gè)周期所完成的運(yùn)算:
(1)將第二周期寄存器數(shù)據(jù)current_temp_2_reg保存到寄存器current_temp_3_reg中;將第二周期寄存器數(shù)據(jù)max_pid_out_reg和min_pid_out_reg分別保存到寄存器max_pid_out_3_reg和min_pid_out_3_reg;將第二周期寄存器數(shù)據(jù)pTerm_reg保存到寄存器pTerm_3_reg,將第二個(gè)周期寄存器數(shù)據(jù)valid2_reg保存到寄存器valid3_reg,表示第三周期;
(2)計(jì)算積分累加項(xiàng)temp_iState_constrain,判斷temp_iState_reg是否何在約束范圍內(nèi),如果超過(guò)i_temp_iState_max,則賦值i_temp_iState_max,如果小于0,則賦值0,如果在約束范圍內(nèi),則賦值數(shù)據(jù)temp_iState_reg;
(3)計(jì)算積分項(xiàng)iTerm,Ki與temp_iState_constrain相乘,截位的結(jié)果保存到寄存器iTerm_reg;
(4)微分項(xiàng)dTerm保存到寄存器dTerm_reg;
4)第四個(gè)周期所完成的運(yùn)算:
(1)將第三周期寄存器數(shù)據(jù)current_temp_3_reg保存到寄存器current_temp_4_reg中;將第三周期寄存器數(shù)據(jù)max_pid_out_3_reg和min_pid_out_3_reg分別保存到寄存器max_pid_out_4_reg和min_pid_out_4_reg;將第三周期寄存器數(shù)據(jù)temp_iState_constrain_reg保存到寄存器temp_iState_constrain_4_reg;將第三周期寄存器數(shù)據(jù)dTerm_reg保存到寄存器dTerm_4_reg,將第三個(gè)周期寄存器數(shù)據(jù)valid3_reg保存到寄存器valid4_reg,表示第四周期;
(2)計(jì)算PID輸出結(jié)果的加法項(xiàng),因?yàn)镻ID運(yùn)算輸出結(jié)果是由pTerm+iTerm–dTerm計(jì)算而來(lái),然后為了獲得更快的處理速度,一般將較長(zhǎng)的公式拆分,進(jìn)行分開計(jì)算可以增加處理速度,所以,先將pTerm_3_reg和iTerm_reg相加,將結(jié)果保存到寄存器pid_out_4_reg中;
5)第五個(gè)周期所完成的運(yùn)算:
(1)將第四周期寄存器數(shù)據(jù)current_temp_4_reg保存到寄存器current_temp_5_reg中;將第四周期寄存器數(shù)據(jù)temp_iState_constrain_4_reg保存到寄存器temp_iState_constrain_5_reg;將第四周期寄存器數(shù)據(jù)dTerm_reg保存到寄存器dTerm_4_reg,將第四個(gè)周期寄存器數(shù)據(jù)valid4_reg保存到寄存器valid5_reg,表示第五周期;
(2)計(jì)算PID運(yùn)算結(jié)果pid_out_tmp,pid_out_4_reg和dTerm_4_reg做差得出結(jié)果項(xiàng)pid_out_5,在PID運(yùn)算中,設(shè)置了約束范圍,即小于PID_MAX,大于0,如果超出約束范圍,超過(guò)則輸出最大PID_MAX,小于則輸出最小值0;
(3)判斷PID運(yùn)算模塊得出運(yùn)算結(jié)果o_pid_out,根據(jù)min_pid_out_4_reg,max_pid_out_4_reg信號(hào),來(lái)判斷PID的最終輸出結(jié)果,如果兩個(gè)信號(hào)皆是低電平,則輸出pid_out_tmp/2,否則,min_pid_out_4_reg高電平,輸出0;max_pid_out_4_reg,高電平輸出PID_MAX;
6)第六個(gè)周期所完成的運(yùn)算:
(1)輸出o_valid有效信號(hào),表示PID運(yùn)算計(jì)算完成;
(2)輸出PID運(yùn)算結(jié)果,輸出當(dāng)前積分累加值o_temp_iState_constrain_ex和當(dāng)前溫度值o_current_temp_ex到加熱模塊作為暫存數(shù)據(jù)。
優(yōu)選地,加熱模塊包括上次采集溫度寄存器、偏差寄存器以及控制量寄存器,控制量寄存器連接計(jì)數(shù)器和邏輯判斷電路;上次采集溫度寄存器與偏差寄存器用于分別儲(chǔ)存上次采集溫度數(shù)據(jù)和偏差數(shù)據(jù),并返回PID模塊參數(shù),計(jì)數(shù)器用來(lái)控制加熱端口高電平還是電平,以此來(lái)控制加熱時(shí)間;溫度和偏差數(shù)據(jù)通過(guò)判斷PID有效信號(hào)和控制量是否為0來(lái)控制是否鎖存信號(hào);當(dāng)一次PID運(yùn)算完畢,輸出有效信號(hào)和控制量,則開始一次加熱周期;PID控制量鎖存到控制量寄存器中;計(jì)數(shù)器工作期間判斷加熱端口是否加熱,如果加熱則持續(xù)計(jì)數(shù),當(dāng)計(jì)數(shù)時(shí)序滿足一毫秒時(shí),計(jì)數(shù)器清零;在計(jì)數(shù)器工作時(shí),通過(guò)邏輯判斷電路進(jìn)行邏輯判斷PWM和控制量之間的大小,輸出加熱信號(hào),以此驅(qū)動(dòng)加熱端口。
本發(fā)明的有益效果是:
本發(fā)明通過(guò)PID運(yùn)算模塊每6個(gè)周期即可輸出一次PID運(yùn)算結(jié)果,且加熱模塊采用新型PWM硬件結(jié)構(gòu),有效提高了溫度控制的實(shí)時(shí)性、精度及穩(wěn)定性,且降低了CPU負(fù)載,有利于3D打印機(jī)的功能擴(kuò)展。
附圖說(shuō)明
圖1為傳統(tǒng)3D打印機(jī)溫度控制系統(tǒng)軟件程序流程圖。
圖2為本發(fā)明實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)示意圖。
圖3為本發(fā)明實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)中PID運(yùn)算模塊結(jié)構(gòu)示意圖。
圖4為本發(fā)明實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)中加熱模塊結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面結(jié)合附圖及實(shí)例,對(duì)本發(fā)明做進(jìn)一步說(shuō)明。
圖2為本發(fā)明實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)示意圖。溫度控制系統(tǒng)包括依次連接的總線接口模塊、寄存器文件、PID運(yùn)算模塊(包括打印頭PID運(yùn)算模塊和熱床PID運(yùn)算模塊)及溫度采集模塊,打印頭PID運(yùn)算模塊和熱床PID運(yùn)算模塊還分別連接打印頭加熱模塊和熱床加熱模塊。如果溫度采集模塊采集到的溫度沒(méi)有超出預(yù)設(shè)范圍,則將打印頭和熱床的溫度數(shù)據(jù)發(fā)送給PID運(yùn)算模塊。PID運(yùn)算模塊計(jì)算完成后,會(huì)輸出有效信號(hào)和PID控制量給加熱模塊。加熱模塊采用PWM方式加熱,根據(jù)PID控制量的大小通過(guò)PWM方法來(lái)控制加熱的時(shí)間。PID運(yùn)算模塊除了將運(yùn)算結(jié)果發(fā)送給加熱模塊外,還有運(yùn)算中的中間量發(fā)送給加熱模塊用以寄存這一次運(yùn)算后的數(shù)據(jù)。原因是,在下一次PID運(yùn)算中,會(huì)用到上一次運(yùn)算的中間量。寄存器文件連接PID運(yùn)算模塊與溫度采集模塊,并通過(guò)總線接口模塊連接至總線。
圖3為本實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)中PID運(yùn)算模塊結(jié)構(gòu)示意圖。在本發(fā)明中,采用的是溫度值來(lái)進(jìn)行計(jì)算,并且有小數(shù)參與運(yùn)算。采用定點(diǎn)小數(shù)的方法,32位溫度數(shù)據(jù)高16位為整數(shù),低16位為小數(shù)。PID運(yùn)算主要是通過(guò)對(duì)實(shí)時(shí)溫度與目標(biāo)溫度的偏差值計(jì)算、溫度變化率的計(jì)算和偏差累加的計(jì)算。利用減法器,對(duì)目標(biāo)溫度和實(shí)時(shí)溫度做差值,結(jié)果保存到32位偏差寄存器中。此時(shí),需要判斷偏差的值是否在[0,5]之間。當(dāng)偏差小于0,表示實(shí)時(shí)溫度已經(jīng)超過(guò)目標(biāo)溫度,此時(shí)停止加熱,則將PID最小輸出信號(hào)置1。作用是結(jié)合繼電器開關(guān)控制,減少PID多余運(yùn)算,提高PID控制精度和速度。如果偏差大于5,則將PID最大輸出信號(hào)置1,表示全功率加熱信號(hào)。如果偏差滿足在[0,5]之間,則開始PID運(yùn)算。PID運(yùn)算可以分四個(gè)部分:比例運(yùn)算、積分運(yùn)算、微分運(yùn)算和PID結(jié)果運(yùn)算。
PID運(yùn)算模塊中,基于對(duì)PID算法原理解析,分為了六個(gè)周期來(lái)完成運(yùn)算。
1)第一個(gè)周期所完成的運(yùn)算:
(1)將總線輸入的差值參數(shù)neg_pid_functional_range取反加1。判斷偏差是否小于0,即判斷其最高位是否為0,如果為0則是正數(shù),如果為1則是負(fù)數(shù)。差值參數(shù)的作用在于如果實(shí)時(shí)溫度和設(shè)定溫度之間的差值如果大于它,則輸出全功率加熱,相反如果小于則輸出0。將PID運(yùn)算控制在5度以內(nèi)的精度,其中neg_pid_functional_range為32位數(shù)據(jù)。
(2)計(jì)算差值error_reg。溫度采集模塊輸出的溫度實(shí)時(shí)數(shù)據(jù)i_current_temp與總線輸入的目標(biāo)溫度i_target_temp進(jìn)行差值計(jì)算。
(3)計(jì)算當(dāng)前溫度與前一次采集溫度的偏差變化值,即error_ctemp_dState。在PID運(yùn)算中會(huì)涉及到當(dāng)前溫度與前一次采集溫度的偏差值參與微分運(yùn)算,error_ctemp_dState由當(dāng)前溫度i_current_temp減去前一個(gè)運(yùn)算結(jié)果完成后所采集的溫度i_temp_dState_ex。i_temp_dState_ex則是每一次PID運(yùn)算模塊輸出后,鎖存在加熱模塊中,等待PID再一次運(yùn)算時(shí)候返回該值。
(4)將當(dāng)前溫度i_current_temp存入寄存器current_temp_1_reg,表示第一周期。將當(dāng)前溫度跟隨寄存器一直保持到第五個(gè)周期整體PID運(yùn)算結(jié)束后再將溫度輸出給加熱模塊,作為下一次實(shí)時(shí)溫度偏差值的輸入。
(5)輸入有效信號(hào)i_valid保存到寄存器valid1_reg中,表示第一周期。
2)第二個(gè)周期所完成的運(yùn)算:
(1)將第一周期寄存器數(shù)據(jù)current_temp_1_reg保存到寄存器current_temp_2_reg中;將第一個(gè)周期寄存器數(shù)據(jù)valid1_reg保存到寄存器valid2_reg,表示第二周期。
(2)完成比例運(yùn)算乘積項(xiàng)pTerm。將PID參數(shù)kp與差值項(xiàng)error_reg相乘。因?yàn)閗p與error_reg都是32位數(shù)據(jù),相乘則造成數(shù)據(jù)溢出。所以采用截位的方法保留乘積結(jié)果的16位,即pTerm_tmp[47:16],然后保存到寄存器pTerm_reg中。完成微分項(xiàng)計(jì)算。
(3)i_kd與error_ctemp_dState進(jìn)行乘法運(yùn)算,截位后得運(yùn)算結(jié)果dTerm_tmp_0[47:16]。存入寄存器dTerm_tmp_0_reg。
(4)計(jì)算積分項(xiàng)中間變量temp_iState存入寄存器temp_iState_reg。由當(dāng)前差值項(xiàng)error_reg與前一次積分中間變量i_temp_iState_reg_ex相加得出。
(5)判斷信號(hào)min_pid_out_reg,max_pid_out_reg。在比較差值參數(shù)pid_functional_range后,如果滿足在差值參數(shù)范圍內(nèi),則繼續(xù)進(jìn)行PID運(yùn)算。如果不滿足,則將判斷信號(hào)置1。信號(hào)min_pid_out_reg置1,則PID運(yùn)算五個(gè)周期后輸出最小值。信號(hào)max_pid_out_reg置1,則PID運(yùn)算五個(gè)周期后輸出最大值。
3)第三個(gè)周期所完成的運(yùn)算:
(1)將第二周期寄存器數(shù)據(jù)current_temp_2_reg保存到寄存器current_temp_3_reg中;將第二周期寄存器數(shù)據(jù)max_pid_out_reg和min_pid_out_reg分別保存到寄存器max_pid_out_3_reg和min_pid_out_3_reg;將第二周期寄存器數(shù)據(jù)pTerm_reg保存到寄存器pTerm_3_reg。將第二個(gè)周期寄存器數(shù)據(jù)valid2_reg保存到寄存器valid3_reg,表示第三周期。
(2)計(jì)算積分累加項(xiàng)temp_iState_constrain。判斷temp_iState_reg是否何在約束范圍內(nèi)。如果超過(guò)i_temp_iState_max,則賦值i_temp_iState_max。如果小于0,則賦值0。如果在約束范圍內(nèi),則賦值數(shù)據(jù)temp_iState_reg。
(3)計(jì)算積分項(xiàng)iTerm。Ki與temp_iState_constrain相乘,截位的結(jié)果保存到寄存器iTerm_reg。
(4)微分項(xiàng)dTerm保存到寄存器dTerm_reg。
4)第四個(gè)周期所完成的運(yùn)算:
(1)將第三周期寄存器數(shù)據(jù)current_temp_3_reg保存到寄存器current_temp_4_reg中;將第三周期寄存器數(shù)據(jù)max_pid_out_3_reg和min_pid_out_3_reg分別保存到寄存器max_pid_out_4_reg和min_pid_out_4_reg;將第三周期寄存器數(shù)據(jù)temp_iState_constrain_reg保存到寄存器temp_iState_constrain_4_reg;將第三周期寄存器數(shù)據(jù)dTerm_reg保存到寄存器dTerm_4_reg。將第三個(gè)周期寄存器數(shù)據(jù)valid3_reg保存到寄存器valid4_reg,表示第四周期。
(2)計(jì)算PID輸出結(jié)果的加法項(xiàng)。因?yàn)镻ID運(yùn)算輸出結(jié)果是由pTerm+iTerm–dTerm計(jì)算而來(lái)。然后為了獲得更快的處理速度,一般將較長(zhǎng)的公式拆分,進(jìn)行分開計(jì)算可以增加處理速度。所以,先將pTerm_3_reg和iTerm_reg相加,將結(jié)果保存到寄存器pid_out_4_reg中。
5)第五個(gè)周期所完成的運(yùn)算:
(1)將第四周期寄存器數(shù)據(jù)current_temp_4_reg保存到寄存器current_temp_5_reg中;將第四周期寄存器數(shù)據(jù)temp_iState_constrain_4_reg保存到寄存器temp_iState_constrain_5_reg;將第四周期寄存器數(shù)據(jù)dTerm_reg保存到寄存器dTerm_4_reg。將第四個(gè)周期寄存器數(shù)據(jù)valid4_reg保存到寄存器valid5_reg,表示第五周期。
(2)計(jì)算PID運(yùn)算結(jié)果pid_out_tmp。pid_out_4_reg和dTerm_4_reg做差得出結(jié)果項(xiàng)pid_out_5。在PID運(yùn)算中,設(shè)置了約束范圍,即小于PID_MAX,大于0。如果超出約束范圍,超過(guò)則輸出最大PID_MAX,小于則輸出最小值0。
(3)判斷PID運(yùn)算模塊得出運(yùn)算結(jié)果o_pid_out。根據(jù)min_pid_out_4_reg,max_pid_out_4_reg信號(hào),來(lái)判斷PID的最終輸出結(jié)果。如果兩個(gè)信號(hào)皆是低電平,則輸出pid_out_tmp/2。否則,min_pid_out_4_reg高電平,輸出0;max_pid_out_4_reg,高電平輸出PID_MAX。
6)第六個(gè)周期所完成的運(yùn)算
(1)輸出o_valid有效信號(hào),表示PID運(yùn)算計(jì)算完成。
(2)輸出PID運(yùn)算結(jié)果,輸出當(dāng)前積分累加值o_temp_iState_constrain_ex和當(dāng)前溫度值o_current_temp_ex到加熱模塊作為暫存數(shù)據(jù)。
本實(shí)施例中,PID運(yùn)算模塊每6個(gè)周期即可輸出一次PID運(yùn)算結(jié)果,提高了溫度控制的實(shí)時(shí)性及精度。PID硬件設(shè)計(jì)結(jié)構(gòu)采用PID算法,PID算法結(jié)合了Bang-Bang控制來(lái)計(jì)算控制量(bang-bang控制是如果實(shí)時(shí)溫度小于目標(biāo)溫度則全功率加熱,如果實(shí)時(shí)溫度大于目標(biāo)溫度則停止加熱),即目標(biāo)溫度與實(shí)時(shí)溫度做差,如果差值較大且超過(guò)閾值則采用Bang-Bang控制,不然則進(jìn)行PID運(yùn)算計(jì)算控制量。在硬件設(shè)計(jì)中,也涉及到Bang-Bang控制,設(shè)置了溫度差約束。如果目標(biāo)溫度和實(shí)時(shí)溫度差值大于溫度差約束則全功率加熱,如果目標(biāo)溫度和實(shí)際溫度小于0,則輸出0,即停止加熱。溫度采集模塊持續(xù)提供實(shí)時(shí)溫度給PID運(yùn)算模塊,PID運(yùn)算模塊計(jì)算出控制量輸出給加熱模塊完成加熱。由于PID運(yùn)算周期比溫度采集時(shí)間短,會(huì)造成采集新的數(shù)據(jù)未完成而計(jì)算結(jié)果再一次輸出的情況,此時(shí)增加i_valid輸入信號(hào),表示輸入的溫度數(shù)據(jù)有效,并且保持到六個(gè)周期后輸出o_valid表示PID運(yùn)算輸出有效。將計(jì)算出的控制量輸出給加熱模塊來(lái)驅(qū)動(dòng)加熱或關(guān)閉加熱。
圖4為本實(shí)施例3D打印機(jī)溫度控制系統(tǒng)硬件結(jié)構(gòu)中加熱模塊結(jié)構(gòu)示意圖。加熱模塊主要功能為輸入控制量,采用PWM方式來(lái)驅(qū)動(dòng)加熱。加熱模塊根據(jù)信號(hào)PID運(yùn)算有效信號(hào),接受來(lái)自PID運(yùn)算模塊的三個(gè)參數(shù):積分中間量、上一次實(shí)時(shí)溫度和PID運(yùn)算量。積分中間量連接到PID運(yùn)算模塊的輸出端o_temp_iState_constrain_ex,上一次實(shí)時(shí)溫度連接到PID運(yùn)算模塊的輸出端o_current_temp_ex。PID處理模塊計(jì)算的結(jié)果連接到端口i_pid_out,是一個(gè)大于等于0,小于256的整數(shù)。通過(guò)PID加熱完成一次計(jì)算后,將這一次用到的實(shí)時(shí)溫度和積分項(xiàng)保存到加熱模塊,等待PID運(yùn)算的結(jié)果驅(qū)動(dòng)加熱模塊,完成整個(gè)溫度調(diào)節(jié)過(guò)程后,再將兩個(gè)數(shù)據(jù)發(fā)送給PID運(yùn)算模塊用于下一次溫度PID計(jì)算中。
加熱模塊包括上次采集溫度寄存器、偏差寄存器以及控制量寄存器,控制量寄存器連接計(jì)數(shù)器和邏輯判斷電路。上次采集溫度寄存器與偏差寄存器用于分別儲(chǔ)存上次采集溫度數(shù)據(jù)和偏差數(shù)據(jù),并返回PID模塊參數(shù)。計(jì)數(shù)器用來(lái)控制加熱端口高電平還是電平,以此來(lái)控制加熱時(shí)間。溫度和偏差數(shù)據(jù)通過(guò)判斷PID有效信號(hào)和控制量是否為0來(lái)控制是否鎖存信號(hào)。當(dāng)一次PID運(yùn)算完畢,輸出有效信號(hào)和控制量,則開始一次加熱周期。PID控制量鎖存到控制量寄存器中。計(jì)數(shù)器工作期間判斷加熱端口是否加熱,如果加熱則持續(xù)計(jì)數(shù),當(dāng)計(jì)數(shù)時(shí)序滿足一毫秒時(shí),計(jì)數(shù)器清零。在計(jì)數(shù)器工作時(shí),通過(guò)邏輯判斷電路進(jìn)行邏輯判斷PWM和控制量之間的大小,輸出加熱信號(hào),以此驅(qū)動(dòng)加熱端口。