Learning Objectives
- 把測試寫成「步驟+上下限」,對每個讀值判斷 Pass/Fail,再得出總判定
- 幫每一顆產品編序號,讓每一筆結果都追溯得到
- 產生 CSV 測試報表,算出良率並統計失敗原因
- 了解「遇到失敗就停止」與保護帶等產線常見的取捨
從實驗室量測到產線測試
前幾課的程式回答的是「這顆元件的特性是什麼」。工廠的產線要回答的是另一個問題:這一顆能不能出貨? 一條產線一天可能測幾千顆,測試程式要做到:
- 每顆產品照同樣的步驟、同樣的條件測。
- 每個讀值和限值(spec limit)比較,判斷 PASS 或 FAIL。
- 每顆產品有序號,結果寫進報表,之後查得到這一顆在什麼時候、哪一站、量到多少。
- 統計良率(yield)與失敗原因,回饋給生產與設計。
本課的產品是一顆 LED 模組(LED 加限流電阻),測三個項目:
| 步驟 | 條件 | 量什麼 | 限值 |
|---|---|---|---|
| leak 漏電流 | 加 1 V(低於導通電壓) | 電流 | ≤ 0.05 mA |
| vf 順向電壓 | 加 5 V | LED 兩端電壓 | 1.90~2.20 V |
| i5 工作電流 | 加 5 V | 電流 | 15~25 mA |
逐步看:限值與判斷
限值放在一個字典裡,判斷寫成一個函數,所有步驟共用。注意兩個細節:等於限值算 PASS(含端點), 以及漏電流只有上限(下限寫 None)。
逐步看:測一顆產品
測試步驟寫成一個串列 STEPS,迴圈一個步驟一個步驟做;每一步的結果(步驟、讀值、單位、判斷)存成一個元組。
最後印出每一步與總判定:全部 PASS 才是 PASS。看電路畫面:1 V 時 LED 不亮(測漏電流),5 V 時才亮。
小測驗:限值與判斷
下面的程式會印出什麼?
low, high = 1.90, 2.20
for v in [1.90, 2.2, 2.2001, 1.8999]:
print("PASS" if low <= v <= high else "FAIL", end=" ")
下面的程式會印出什麼?
print([f"LED-2611-{n:04d}" for n in [7, 42, 1234]])
一顆產品三個步驟的判斷是 PASS、FAIL、PASS。總判定是什麼?
報表、良率與追溯
一批產品測完,至少要留下兩種資料:
- 逐顆紀錄:序號、每一步的讀值與判斷、總判定。出問題時,用序號就能查到這一顆當時量到多少。
- 統計:良率=PASS 數 ÷ 測試數;失敗原因統計依次數排序(柏拉圖),先處理造成最多失敗的那一項。
真實的報表還會記錄測試時間、測試站與治具編號、儀器序號與校正日期、測試程式的版本,這叫可追溯性(traceability)。
資料多了之後,通常存進資料庫(例如 SQLite、PostgreSQL),才能跨批次查詢與統計;Python 的 sqlite3 模組就能用,觀念和 CSV 一樣是一列一顆產品。
遇到失敗就停止(stop on fail)是另一個取捨:後面的步驟不做,可以縮短測試時間; 但只知道第一個失敗的原因,維修或分析時資訊比較少。研發階段通常全部測完,量產階段常常遇到失敗就停止。
逐步看:一批產品的報表與良率
batch.csv 是 6 顆產品的讀值(為了專心在報表,這裡直接讀已經量好的資料)。程式依生產順序編序號、判斷、寫 report.csv,
最後用 Counter 統計失敗原因。看上方的 n 與 passed 怎麼增加。
小測驗:良率與報表
下面的程式會印出什麼?
from collections import Counter
fails = Counter(["vf", "leak", "vf", "i5", "vf"])
passed, total = 15, 20
print(f"{passed / total:.1%}", fails.most_common(1))
量產時打開「遇到失敗就停止」,最主要的代價是什麼?
重點整理
- 測試=步驟表+限值表;判斷
low <= value <= high(含端點),單邊限值用 None 表示沒有那一邊。 - 每一步 PASS/FAIL,總判定用
all():全部 PASS 才是 PASS。 - 序號固定格式(
f"{n:04d}"補零),每一筆結果都帶序號,報表才追溯得到。 - 良率=PASS ÷ 測試數;失敗原因用
Counter統計、most_common()排序。 - 遇到失敗就停止:省時間、少資料;讀值很接近限值時要考慮量測不確定度,常用保護帶把測試限值內縮。
下一課是專題:把這一軌學到的東西整合起來,做一個自動化元件特性測試站。