---
# System prepended metadata

title: 以Microchip PIC實作智慧照明系統
tags: [Microchip, MCUT, Embedded System, C Language]

---

# 以Microchip PIC實作智慧照明系統

明志科大工讀實習成果

## 實作成果影片-以PID控制檯燈
{%youtube mHmxSjEjD1g %}

## 前言
在大三的工讀期間，非常的榮幸能來到工研院綠能所之LED照明節能計畫(D200)實習，藉此機會了解業界工作環境，學習嵌入式系統的開發，同時增加職場經驗。
在最後一個階段中的目標是使用微控制器製作出一個燈具控制系統，本系統將參考市面上販售的智慧燈具，並研究其工作方式，實現出功能相似的系統，實作將利用先前所學的PIC微控制器，來整合外部模組與控制LED檯燈。過程中，學習到了PIC微控制器的時間與腳位中斷、類比數位轉換器、脈波寬度調變和程式撰寫技巧。

## 背景技術
* CIE1931轉換相對色溫 - [參考資料](https://zh.wikipedia.org/wiki/CIE1931%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4#%E5%AE%9E%E9%AA%8C%E7%BB%93%E6%9E%9C%E2%80%94_CIE_RGB%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4)
* 脈衝寬度調變(PWM) - [參考資料](http://wiki.csie.ncku.edu.tw/embedded/PWM#pllphase-lockedloop-鎖相迴路)
* 類比數位轉換器(ADC) - [參考資料](http://wiki.csie.ncku.edu.tw/embedded/ADC#基本概念)

## 實作內容
### 實作目的
本次的實作目的在於熟悉為控制器周邊模組功能，例如中斷、I2C、PWM，並且閱讀其技術文件和撰寫其程式，透過實作，了解到程式在不同的寫法與其效率的差別，以及模組的使用。
### 前置作業
使用MATLAB數學軟體建立出照度轉換方程式與求出色溫轉換矩陣的係數，使PIC微控器運算出的照度與色溫在與手持式光譜儀量測出的誤差能夠在一定的誤差範圍。

![](https://i.imgur.com/5wKmsQz.jpg =250x)
**▲量測環境**

#### 建立調光公式與範圍

1. PWM轉換色溫公式
首先需要在每個PWM強度下做色溫的取樣，再利用MATLAB做曲線擬合，求出轉換公式之後再驗算求出誤差，再把誤差較大的區段截掉（紅色區域），得出PWM範圍為100至255。
![](https://i.imgur.com/s125OoI.png)
**▲色溫量測結果**
![](https://i.imgur.com/V96aXnm.png =300x)
**▲曲線擬合結果**
![](https://i.imgur.com/s9of9vI.png)
**▲色溫公式驗算**
![](https://i.imgur.com/fmmwH79.png)
**▲色溫公式誤差**
2. PWM轉換照度公式
其作法與求出色溫公式一致。
![](https://i.imgur.com/rfdstQS.png)
**▲照度量測結果**
![](https://i.imgur.com/3rUw0Uh.png =300x)
**▲曲線擬合結果**
![](https://i.imgur.com/mGt31BL.png)
**▲照度公式驗算**
![](https://i.imgur.com/5w39FJx.png)
**▲照度公式誤差**

3. 建立調光範圍
求出色溫與照度的轉換公式之後，為了在每個色溫與照度能調整的比例與範圍能一致，所以需要把每個色溫與照度的數值記錄下來，之後扣除極端值，匡出適當調光的範圍，並把範圍裡的最大與最小照度與色溫設為計算的上下限。
![](https://i.imgur.com/Mg36seT.jpg)
**▲調光範圍**

### 系統架構
本系統使用
* 315Mhz遙控模組
    * 控制檯燈的照度、色溫、啟用自動補光功能、開關檯燈。
* OLED顯示模組
    * 顯示目前檯燈輸出的照度與色溫的估計值和功能狀態。
* APDS9930感測器
    * 在自動補光功能時啟用，其目的是感測目前環境照度，讓微控制器調整檯燈照度至固定照度，達到補光功能。


![](https://i.imgur.com/0hI0r6S.png =550x)

**▲燈具控制系統架構**

### 程式設計

#### 程式流程圖
1. 主程式
在微控制器待機時，主要在判斷旗標，當觸發按鍵中斷時，功能旗標被設定，這時程式將會進入符合的旗標，執行顯示動作或是自動補光功能。其中，由於一次顯示一整個OLED螢幕需要消耗216毫秒，這將會引響其他程式的運行，所以把顯示方式改為一次顯示一行，減少執行時間。
![](https://i.imgur.com/URcQGs7.png )
**▲主程式流程圖**

2. 腳位中斷程式
為了讓微控制器接收到315Mhz遙控模組的數位訊號時能即時的反應，進入副程式，執行旗標的改變，以及調整燈具的輸出。在這顆微控制器的中斷名字稱為“當改變時中斷”(IOC, Interrupt On Change)，其觸發方式有：上緣觸發與下緣觸發。
![](https://i.imgur.com/1VaTNIn.png)
**▲腳位中斷程式流程圖**

3. 時間中斷程式
讓微控制器在每8毫秒的時候進入時間中斷輸出脈波調變訊號給檯燈，達到平滑調光的效果。
![](https://i.imgur.com/ZaRMISH.png =300x)
**▲時間中斷程式流程圖**

### PIC實驗

在先前的章節裡有提到脈波寬度條變與時間中斷，在實作中，脈波寬度條變是使用在LED檯燈的調光上而時間中斷主要使用在平滑調光。
![](https://i.imgur.com/Io9vGNT.png =400x)
**▲為輸出頻率5Khz，工作週期50%的波形**

![](https://i.imgur.com/LgwHjFH.png =400x)
**▲為10毫秒的時間中斷的波形**
其實驗的方式為利用進入中斷時翻轉PIC的I/O腳位準位，然後以示波器讀取這個腳位的輸出訊號。


### 程式優化

1. 避免使用浮點運算
由於使用的PIC內部沒有浮點運算單元，所以當在執行有關程式時，所消耗的時間達到了毫秒級，這代表著將會失去微控制器即時控制的優點，所以利用了在DSP中的定點算術運算，差別如下圖。

| ![](https://i.imgur.com/JhHSdZ1.png) | ![](https://i.imgur.com/1bF3YjF.png) |
|:------------------------------------:|:------------------------------------:|
|             使用浮點運算             |           使用定點算術運算           |

2. 除法運算
因為本次使用的PIC微控制器的內部沒有除法運算單元，所以如果除數是固定值的話，可以利用倒數，讓算式變成乘法運算，其結過果與上兩張圖相似。

## 實作結果
定色溫調整照度以及定照度調整色溫功能：
* 測試環境
![](https://i.imgur.com/cDzLwqV.jpg =150x)
 
* 測試結果
![](https://i.imgur.com/eXyEPIS.png =300x)
* 測試方法
使用手持式光譜儀分別紀錄這兩個功能，利用遙控器從初始值調整到極大及極小值。
* 自動補光功能
利用手去遮擋環境光感測器，測試補光功能是否會調到設定值3000Lux，由於下方的照度儀受到環境光影響，所以會有些許誤差。
    | ![](https://i.imgur.com/ESyRiDB.jpg =150x) | ![](https://i.imgur.com/R2dn3jf.jpg =150x) |
    | ------------------------------------------ | ------------------------------------------ |
    | 補光功能測試-環境光                        | 補光功能測試-遮擋                          |

* OLED顯示器
環境光感測器關閉，反之補光模式時開啟，而在LED檯燈關閉時輸出皆為0如 ，在燈具開啟後則會恢復上階段的照度與色溫如圖。
    | ![](https://i.imgur.com/9s23EsE.jpg =150x) | ![](https://i.imgur.com/3LhzEkk.jpg =150x) | ![](https://i.imgur.com/3lgyUZn.jpg =150x) |
    | ------------------------------------------ | ------------------------------------------ | ------------------------------------------ |
    | 調光調色溫模式                             | 補光模式                                   | LED檯燈關閉                                |



###### tags: `C Language` `Embedded System` `Microchip` `MCUT`