28
ホットプレートを利用したリフローの製作 坂井 雅紀 https://www.craft-design.yokohama から ソフトウエアをダウンロードできます

坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ホットプレートを利用したリフローの製作         坂井 雅紀

https://www.craft-design.yokohamaから ソフトウエアをダウンロードできます

Page 2: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

底から見た写真手前からSSRのヒートシンク、PIC16F1788のった基板、その隣にスイッチングレギュレータ、奥にLCDなどが見えます

Page 3: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)
Page 4: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ホットプレートの温度を測定するサーミスタを接続するコネクタ

PIC16F1788

ショート時:デバッグモードオープン時:ノーマルモード

PICKITプログラム

LCDコントラストボリューム

Page 5: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ホットプレートの裏側温度フューズ240℃とサーモスイッチ195℃が見えます

Page 6: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

温度フューズ & サーモスイッチをとりはずし直接 AC100vケーブルをカシメで接続します

Page 7: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

回路図

Page 8: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ホットプレート

温度制御方法

1秒 2秒 3秒 4秒

ヒーターON

ヒーターOFF

100%ON

80%ON

60%ON

40%ON

20%ON

コントローラは下図の用に1秒間隔でホットプレート内のヒータを制御する。このヒーターON時間はソフトウエアのheater_on_time(変数)の値で制御する。ソフトウエアでPWM信号を生成しています。100%ヒーターONの時のheater_on_timeは200となる。最小分解時間は5mSecであり ヒータON時間は5mSec*Heater_on_timeとなる。ヒータON時、コントローラは下図のブロック図のSSR(ソリッドステートリレー)に信号を送り、SSRがONしAC100Vがホットプレートのヒーターに供給され、加熱される。

SSR

コントローラPIC16F1788

AC100V温度

センサ

Page 9: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

本リフローのPID温度制御は PICFUNの後閑先生が書かれているPIDの内容を参考に 行いました。

PID制御の計算式はe0(今回の偏差) = 目標温度 – 現在の温度dMV0(今回の操作量差分) = Kp*(e0 - e1) + Ki*e0 + Kd*(e0 - 2e1 + e2)またはdMV0(今回の操作量差分) = 100/Pb{(e0 - e1) + e0/Ti + (e0 - 2e1 + e2)*Td}MV0(今回の操作量) = MV1(前回の操作量) + dMV0

ここで e1:前回の偏差、e2:前々回の偏差Kp:比例感度(または比例ゲイン),Pb:比例帯 = 100/KpKi:積分計数、Ti:積分時間 = Kp/KiKd:微分係数、Td:微分時間 = Kd/Kp

Page 10: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

1)K(定常値)、L(無駄時間)、T(時定数)を求める  (CHR法・・・ステップ応答から求める)

1-1)ホットプレートの時間vs温度特性グラフのS字曲線の     変曲点上に接線を引く1-2) ホットプレートの時間vs温度特性グラフの 時間が     無限大の時の定常値Kを予測する(300℃とした)1-3)定常値Kの63%のに当たる値になったところから、     無駄時間L、時定数Tを求める。

次ページのグラフ

Page 11: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 2300

50

100

150

200

250

300

ホットプレート 時間vs温度特性

時間(秒)

温度

(℃

K 定常値:300℃

0.63K=189℃

T時定数:150秒

L無駄時間:10秒

Page 12: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

制御動作種別 Kpの値 Kiの値 Kdの値

P(比例)制御 0.3~0.7T/KL=4.9~11.4

0 0

PI制御 0.35~0.6T/KL=5.7~9.8

0.3~0.6/KL=0.0326~0.0652(Ti=87~306)

PID制御 0.6~0.95T/KL=9.8~15

0.6~0.7/LK=0.0652~0.0761(Ti=129~230)

0.3~0.45T/K=4.5~6.75(Td=0.3~0.7)

PID計算した結果は、heater_on_time(0~200)の値をを変えることによりホットプレート内のヒーターON時間を制御する。P動作から上記パラメーターで実験すると、Kp=1の時、オーバーシュートが発生しない最短時間で収束した。(上の表ではKp=4.9~11.4なので、大きな違いがある。理論式から実際の制御で何かが抜けているのかもしれない?)また、PI動作では、Kp=1、Ti=300で最も良い結果が得られた。PID動作では、heater_on_time(操作量)の値が、安定しないため、PI動作で制御している。以上より 現在のPI制御の式はe0(今回の偏差) = 目標温度 – 現在の温度(次ページのサーミスタ デジタルデータ:赤)dMV0(今回の操作量差分) = (e0 - e1) + e0/300MV0(今回の操作量:heater_on_time) = MV1(前回の操作量) + dMV0で制御している。

Page 13: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

0 10 20 25 30 40 50 60 70 80 85 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 2500

200

400

600

800

1000

1200

温度センサー(サーミスタ:204 CT-4) 特性

adc_data

1024-adc_data

温度

デジ

タル

デー

Page 14: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ノーマルモード表示(温度設定)

S C゜02.pmeTt 0e

N +C゜33.pmeTwo

<設定温度>[ ]℃ 表示

<リフロー温度>現在のリフロー温度

を示す。[℃表示]

<ヒーターON/OFF>リフローのヒータの

ON/OFFを示す

Page 15: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ノーマルモード表示(プロファイル設定)

P C゜011elifo 0r

N +C゜33.pmeTwo

<プロファイルNo>ハンダ付けプロファイル

番号を示すProfile1~9

<プロファイル温度>現在のプロファイル温度を示す。

1秒ごとにプロファイル温度が更新される[ ]℃ 表示

<リフロー温度>現在のリフロー温度

を示す。[℃表示]

<ヒーターON/OFF>リフローのヒータの

ON/OFFを示す

Page 16: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

デバッグモード表示(温度設定)

1 tC゜0205703 02

0 +C゜33770000

<設定温度>デジタル表示

<設定温度>[ ]℃ 表示

<リフロー温度>現在のリフロー温度

を示す。[℃表示]

<リフロー温度>現在のリフロー温度

を示す。[デジタル表示]=サーミスタ出力

<ヒータON時間>リフローのヒーターをONしている時間を示す(0~200)

<ヒーターON/OFF>リフローのヒータの

ON/OFFを示す

<温度設定>デバッグモード

温度設定を示す

<経過時間>スタートボタン押下からの時間

Page 17: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

デバッグモード表示(プロファイル設定)

0 1pC゜0166300 00

0 +C゜33770000

<プロファイル実行時間>リフロー温度が100℃に達した以降の時間を

示す[秒]

<プロファイル温度>デジタル表示

<プロファイル温度>[ ]℃ 表示

<プロファイルNo>ハンダ付けプロファイル

番号を示す(p1~p9)

<リフロー温度>現在のリフロー温度

を示す。[℃表示]

<リフロー温度>現在のリフロー温度

を示す。[デジタル表示]=サーミスタ出力

<ヒータON時間>リフローのヒーターをONしている時間を示す(0~200)

<ヒーターON/OFF>リフローのヒータの

ON/OFFを示す

Page 18: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

ホットプレートを利用したリフローの製作

main

オシレータ設定、PORTの設定

start_flag=0,ヒーターOFF、heater_on_timer=0,LED消灯

OPamp1,2、ADC初期設定、LCD初期設定

now_temp set_temp ⇒ 初期設定(set_temp>=10)

タイマー2(5mSec)初期設定(割込み設定)

割込み許可

while(1)

input_action()

PIDパラメータ初期設定( MV0=0,dMV0=0,MV1=0,e0=0,e1=0,e2=0,Kp,Ti,Td )

process_action()

Page 19: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

タイマー2割込み処理(5mSecTimer)

割込みフラグクリア

Rotary_A_10ms=1? && Rotary_A_5mSec=0?&& rotary_encoder_detect_counter=0?

Rotary_B=0?

encoder_flag=1

encoder_flag=0

encoder_flag=2

Rotary_A_10ms=Rotary_B_5msRotary_A_5ms=Rotary_A

encoder_flag_detect_counter>0

encoder_flag_detect_counter--

five_msec_flag生成

RET

ロータリーエンコーダーA端子の立下りを検知encoder_flag_detect_counterが0の時検知可能

5mSec処理フラグ

encoder_flag_detect_counter=20

ロータリーエンコーダーの回転を検知後、5mSec*20=100mSec検知を禁止する

Page 20: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

input_action()ロータリーエンコーダー処理

encoder_flag=0

encoder_flag?

display_upper_LCD()

0

1(左回転)

2(右回転)

set_temp--

set_temp=1

set_temp++

set_temp=255

set_temp<2 set_temp>255

set_tempに対応したデジタル値に変換

デジタル値をset_digiにセット

Page 21: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

RET

start_flag=0?

start_flaf=1,LED点灯 start_flaf=0,LED消灯、ヒーターOFF

500mSecDelay

押しボタン処理

スタート/ストップボタン押下?

<set_tempの値の意味> 0 : 使用不可 1 - 9 : プロファイルNoを示す10 - 255 : 設定温度を示す

Page 22: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

display_upper_LCD

RET

set_temp?

display_profile_temp()

0-9 10-255

display_set_temp()

Page 23: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

profile_tempをASCIIコードに変換

lcd_strings1[0-6]に[Profile]設定

LCD1行目に表示

RET

profile_temp?

lcd_strings1[15,15]に[ p]設定

lcd_strings1[7]に[set_temp]設定

lcd_strings1[8]に[スペース]設定

lcd_strings1[9-13]に[Start]設定 lcd_strings1[9-13]に[End ]設定

lcd_strings1[9-13]に[profile温度℃]設定

100 0

other

display_profile_temp

Page 24: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

display_set_temp

set_tempをASCIIコードに変換

lcd_strings1[12-14]に[ ]℃設定

set_degiをASCIIコードに変換

lcd_strings1[4-7]にASCIIコード設定

lcd_strings1[9-11]にASCIIコード設定

lcd_strings1[0-3]に[Set ]設定

LCD1行目に入力情報表示

RET

debug?

lcd_strings1[15]に[ d ]]設定lcd_strings1[15]に[ t ]設定

n y

Page 25: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

process_action()

RET

five_msec_flag=1?

display_now_temp()

conrol_heater()

five_msec_flag=0y

heater_ontimer--

one_sec_timer=0?y

one_sec_timer--one_sec_timer=200

1秒処理

5mSec処理 heater_on_timer=0?

ヒーターOFFLCDに[-]表示

y

Page 26: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

display_now_temp()

RET

ヒーターADC ON AD⇒ 変換完了か?

AD結果をnow_digiにセット

now_digi>829

now_digiをLCD左に表示

温度をLCD右に表示

now_digiの対応温度をthermisterテーブルで変換start_flag=0ヒーターOFF

LED消灯

1秒毎の処理

環境ADC ON AD⇒ 変換完了か?

AD結果をenv_digiにセット

ADC出力のデジタル値が255℃以上なのでヒーター

をOFFする。

y

Page 27: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

control_heater()

RET

start_flag=1

heater_on_timer設定ヒーターON

LCDに[+]表示

ヒーターOFFLED消灯

y

ON状態か?n

now_digi>set_digi?

ヒーターOFFLCDに[-]表示

PID計算heater_on_timerの値

(0-200)を求める

e2=e1,e1=e0MV1=MV0

y

n

1秒毎の処理

ヒーターOFF 1秒間に1回は必ずヒーターをOFFする

<Heater_on_timeの値>4:4×5mSec=20mSec(ヒータON時間:5Hz 1波形)200:200×5mSec=1000msec(ヒーターON時間 1秒 50波形)1秒ごとに本処理を行うので200の設定はヒーター連続ONを示す

set_temp<10の時、プロファイルnのset_digiに設定

Page 28: 坂井 雅紀Ki:積分計数、Ti:積分時間 = Kp/Ki Kd: 微分係数、Td:微分時間 = Kd/Kp 1)K(定常値)、L(無駄時間)、T(時定数)を求める (CHR法・・・ステップ応答から求める)

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 2400

50

100

150

200

250

300

リフロー温度特性

JEDEC規格

サーミスタ (共晶はんだ )

温度計 (共晶はんだ )

サーミスタ (鉛フリーはんだ )

温度計 (鉛フリーはんだ )

時間(秒)---100℃以降の経過時間

温度

(℃

60-150sec

60-120sec

60-180sec60-150sec

JEDEC規格の共晶はんだと鉛フリーはんだプロファイルにおける、自作リフローの温度特性を測定した。JEDEC規格の共晶はんだのプロファイルで規定しているのは、Ⓐのプレヒード部で温度は100~150℃:60~120秒、Ⓑのリフロー部で温度225~240℃:60~150秒である。鉛フリーはんだのプロファイルで規定しているのは、Ⓒのプレヒート部で温度は150~200℃:60~180秒、Ⓓのリフロー部で245~260℃:60~150秒である。

Ⓐリフローに実装されているサーミスタ温度センサーと、リフロー中央部を外付け温度計で温度を測定した