【TOSHIBA MCU】TMPM343 IRIS 光圈調整技術文件

1、 前言

東芝 TMPM343 MCU (以下簡稱 M343) 除了包含 Cortex M3 的核心,也包含了一個 MCD (Motor Control Driver) 做為直接驅動 STM 及 VCM 馬達的驅動器。
M343 還包含了一個 PSC (Programmable Servo Control),關於 PSC 的部分,在後續的章節會再介紹。

本文主要介紹使用 TMPM343 (以下簡稱 M343) 進行 camera 鏡頭光圈的調整。

參考原始碼是東芝所提供的 “20150511 M343 Surveillance camera package data_r3.1.zip”  (請洽世平東芝產品線相關人員)

下圖為 M343 驅動 Zoom 及 Focus 的 STM (步進馬達) 與 IRIS (光圈) / IR-Filter Cutter 的 VCM (音圈馬達) 的方塊圖,紅色框線的部位為M343 控制 IRIS 的音圈馬達驅動單元。 


專有名詞釋義:

STM ==> 完整名稱為 Stepping Motor ,作為自動對焦與影像縮放的鏡頭驅動,通過簡單的機械結構可獲得啟動、停止的良好反應性。
                  通過導螺桿與減速齒輪,抑制了自動對焦時的動作聲音,
適合短片拍攝的鏡頭驅動。
VCM ==> 完整名稱為 Voice Coil Motor,是馬達的一種。因為原理和揚聲器類似,所以叫音圈馬達,具有高頻響、高精度的特點。
                  其主要原理是在一個永久磁場內,通過改變馬達內線圈的
直流電流大小,來控制彈簧片的拉伸位置,從而帶動上下運動。
IRIS  ==> 鏡頭的光圈。


2、 IRIS VCM 介紹

M343 內建馬達控制裝置 MCD,除了可驅動鏡頭內的 Focus / Zoom STM 馬達,還可驅動 IRIS VCM 馬達。

鏡頭模組內的 IRIS 單元圖片如下:



以下是 M343 與 控制 IRIS 的參考線路圖:


[IRIS 的原理]
自動光圈根據進光亮度的變化 (由 Image Signal Processor 決定,並下達指令) 調節光圈孔洞的大小,以控制進光多寡。


控制 IRIS 光圈的機構是由兩片有水滴形孔洞的鍘刀形刀片,加上一個長條形的磁鐵條連結組合而成;藉由控制 VCM 音圈馬達產生感應磁場,
連接兩片刀片的磁鐵產生磁場吸力,
使磁鐵轉動,進而帶動刀片。兩塊刀片平行錯開滑動,控制刀身的兩個水滴型孔洞交錯形成光圈開啟與閉合的效果,
以達到調整進光量的目的。


此外,IRIS 還搭配霍爾感測器檢測磁鐵轉動(兩片刀片滑動)的變化情形,由 MCU 內部的 DAC 提供霍爾感測器所需的穩定偏壓,霍爾信號經 MCU 內部的 OP 放大,
反饋給 MCU 內部的 ADC 採樣,量測信號的大小,最後通過PID算法對光圈直流馬達進行更精準的控制。 


3、 IRIS VCM 引腳配置與線路設計

3_1. SDK 中 IRIS 的相關硬體配置與軟體的設置

以下是EVB 的 IRIS 相關引腳的配置



控制 IRIS VCM 的 TMRD 引腳 PL2 (連接到 MCD 的內部引腳) 的設置如下  


程式碼的設定如下:

void App_TMRD_VCM_Configuration(void)    // for VCM TMRD clock
{
/* TDB0OUT0, TDB0OUT1, TDB1OUT0, TDB1OUT1 port setting */
GPIO_SetOutput(GPIO_PL, GPIO_BIT_0 | GPIO_BIT_1 | GPIO_BIT_2| GPIO_BIT_3);
GPIO_EnableFuncReg(GPIO_PL, GPIO_FUNC_REG_1, GPIO_BIT_0 | GPIO_BIT_1 | GPIO_BIT_2|
GPIO_BIT_3);
}​

VCM 的正負端輸出 GO1 / GO2 是專用的 H 型橋式輸出的引腳,所以不需額外設置 GPIO 


放大霍爾信號的 OP Amp 引腳 OP2PIN / OP2NIN 為專用的 OP Amp 信號輸入專用引腳,也不需設置 GPIO 


此外,還需設置用於採樣檢測 霍爾信號的 ADC 通道,請參考以下程式碼:
void App_ADC_Init(void)
{
/* select ADC input channel */
ADC_SetInputChannel(ADC_UNITA, ADC_AN_03); // for Hall device
}​

3_2. IRIS 周邊相關線路

IRIS 周邊線路,除了 MCU 內部的 OP Amp,需加上做為 OP Amp 放大倍率的電阻以放大霍爾信號,與電容及電阻形成的低通濾波器以隔離來自霍爾信號端的低頻雜訊


增益及濾波的參考線路如下: 


當 R = 330K ohm,C = 390pF 時,
fc = 1 / (2 * Pi * R * C) = 1 / (2 * 3.14 * 330K * 390p) = 1.237 Hz, 低通濾波器設定的截止頻率 = 1.237 Hz

由於霍爾感測器所感測生成的信號很小,所以需要先行放大;
原廠建議 OP Amp 的增益值 = 330K ohm / 15K ohm = 22,即霍爾信號經過OP Amp 線路後信號會放大 22 倍。


4、 光圈霍爾感測信號的校正

4_1. 霍爾感測器電壓信號的校正

原廠提供以下的方式進行霍爾信號的校正


上述的內容提到,校準的目標是在 Eopen(aperture full open) 和 Eclose(aperture full close) 之間獲得合適的電壓範圍。 

 

(1) 設置偏置電壓 DAC (DAC6/M343、DAC4/M342) 的初始值,並檢查 OP Amp 的輸出電壓 OP2OUT (AINA3/M343, AINA0/M342);
     此時,霍爾傳感器的信號被 OP Amp 的線路放大,由周邊的增益電阻獲得固定增益後輸入到內部運算放大器。 (建議的增益=330kΩ/15kΩ=22)


(2) 調整偏置電壓DAC(DAC6/M343, DAC4/M342),將電壓變化範圍擴大到2.47V左右。(因為,Vcc(3.3V)*75%=2.47V)


(3) 調整偏移電壓 DAC0 以將偏移更改為 0—Vcc 之間的中心。
     (原廠使用的測試,Vcc(3.3V)/2=1.65V)最好是讓電壓落在Vcc/2左右變化,範圍約Vcc的75%左右。


4_2. 光圈的曝光

透過調整 IRIS (光圈) 的大小,可以控制光線進入鏡頭的進光量; 
不過,有時遇到反差過大的場景,可能會發現影像是灰灰濛濛的,那是由於 ISP 的測光偏差所造成的,
這時就能透過增加或減少曝光值( EV值 ),就可以還原真實拍攝場景!


現在的產品鏡頭影像大都會透過自己的內部程式,對環境光線進行計算,調整光圈的曝光值 (Expose Value),也就是對曝光值進行補償。


4_3. 霍爾信號的 Gain 與 Offset

由於霍爾的 OP Amp 的信號變化,是線性的關係,因此使用二元一次線性方程式來處理 EV 值的補償。
二元一次方程式最重要的兩參數,就是 gain 與 offset 值;因此 IRIS 的校正,就是透過二元一次方程式的線性關係,取得正確的 gain 值與 offset 值。


下面的程式碼“App_IRIS_tune_HallGain()”function,目的是取得真正的 iris_gain 值
int32_t App_IRIS_tune_HallGain(void)
{
int i, sum;

App_MCD_SetHallBias(hall_bias); // temporary initial gain

App_VCM_Control_TmrdDuty(eMCD_VCM_CH_G, 0x0a); // 將 TMRD 的 duty 設成 100%

App_TMRB_waitms(400);
sum = 0;
for(i = 0; i < times; i++) {
sum += App_ADC_GetValue_IrisHall();
App_TMRB_waitms(100);
}
iris_open = sum / times ;

App_VCM_Control_TmrdDuty(eMCD_VCM_CH_G, 0x00); // 將 TMRD 的 duty 設成 0%

App_TMRB_waitms(400);
sum = 0;
for(i = 0; i < times; i++) {
sum += App_ADC_GetValue_IrisHall();
App_TMRB_waitms(100);
}
iris_close = sum / times;
return( iris_close - iris_open );
}

在 App_IRIS_tune_HallGain() 程式中

(1) 首先先設置一個暫定的 offset 值, 
hall_bias = 0x20;

(2) 接著將 IRIS VCM TMRD 的 duty 設成 100%  使 VCM 產生的磁力將光圈完全打開。
App_VCM_Control_TmrdDuty(eMCD_VCM_CH_G, 0x0a);	// ==> 0x0a = 100% duty

(3) 把 IRIS ADC 的值連續取 10 次並且加總,進行算術平均數的運算,得到 iris_open,以避免偶發的異常值的發生。

(4) 接著將 IRIS VCM TMRD 的 duty 設成 0%  停止 VCM 轉動,將光圈完全關閉。 

App_VCM_Control_TmrdDuty(eMCD_VCM_CH_G, 0x00);	// ==> 0x0 = 0% duty

(5) 再次將 IRIS ADC 的值連續取 10 次並且加總,進行算術平均數的運算,得到 iris_close。


(6) 最後回傳 ( iris_close - iris_open ) 的差值。此差值為 IRIS 光圈全開與全關的霍爾信號的變化量,即為 iris_gain。


IRIS 的霍爾信號的校正程式“App_IRIS_Calibrate()”如下: 
uint8_t hall_bias = 0x20;
int32_t iris_amp = 3000;
int32_t iris_gain;
void App_IRIS_Calibrate(void)
{
hall_bias = 0x20;
iris_gain = App_IRIS_tune_HallGain();

if(iris_gain > 0){ // spec sheet show the minimum
hall_bias = target_gain * hall_bias / (iris_gain);
App_MCD_SetHallBias(hall_bias); // temporary initial gain
}

App_IRIS_SetEV();
iris_target = ev_00; // IRIS Open

#ifdef IRIS_PSC_CONTROL
App_PSC_TargetFromMCU(iris_target);
#endif
}

hall_bias 是霍爾信號的偏壓值,即 offset,開始校正前此值暫時設定為 0x20;
iris_gain 取自 App_IRIS_tune_HallGain()  (此時 hall_bias 為暫定值 0x20)
由以下的算式取得正確的 hall_bias 值 

hall_bias = target_gain * hall_bias / (iris_gain);​


 5、 PSC 與 光圈馬達驅動的 PID 控制

TMPM343 內部除了 ARM Cortex M3 core 之外,本文前言還提到包含了一個 PSC (Programmable Servo Controller);
這個 PSC 的控制器,目的是使用 PID 的演算法去增進 IRIS VCM 馬達細部的控制,達到更好的效果。


以下是 SDK 中關於 PSC 的設置: 
#ifdef IRIS_PSC_CONTROL
App_PSC_Configuration(); //test port PB4-PB7
#endif

void App_PSC_Configuration(void)
{
#if 1 // for monitoring
// PSCxPT1(psc_A), PSCxPT2(psc_B), PSCxPT3(psc_C), PSCxPT4(psc_D) PB4-PB7
TSB_PB->CR |= 0xF0;
TSB_PB->FR4 |= 0x10;
TSB_PB->FR5 |= 0x20;
TSB_PB->FR6 |= 0x40;
TSB_PB->FR7 |= 0x80;
TSB_PSCA->PTCR |= 0x02;
TSB_PSCB->PTCR |= 0x04;
TSB_PSCC->PTCR |= 0x08;
TSB_PSCD->PTCR |= 0x10;
#endif

App_PSC_C_Configuration();
}


PSC 的控制程式碼,東芝原廠分別以“psc_c_code_include.s”、“psc_c_data_include.s”組合語言的原始碼去引入“res_c_code.bin”、“res_c_data.bin”檔;


初始化時,只需在程式進行初始化的地方呼叫即可: 

#ifdef IRIS_PSC_CONTROL
App_PSC_Init();
#endif

App_PSC_Init() 除了對 PSC 的相關暫存器做初始化之外,還會去執行上述的“.bin”檔的內容。 

#define    IRIS_PSC_CONTROL	// IRIS is controlled by PSC.

void App_PSC_Init(void)
{
App_PSC_C_Init();
}

void App_PSC_C_Init(void)
{

*ptrPSC_PID_AOX_FROM_MCU = 0x00000000; // PID AOX
*ptrPSC_PID_KD_FROM_MCU = 0x00010000; // PID KD
*ptrPSC_PID_KP_FROM_MCU = 0x00008000; // PID KP
*ptrPSC_PID_KI_FROM_MCU = 0x00000010; // PID KI
*ptrPSC_PID_L0_FROM_MCU = 4000; // PID TMRD L0_o(Upper limit)
*ptrPSC_PID_L1_FROM_MCU = 0; // PID TMRD L1_o(Lower limit)
*ptrPSC_PID_ADnREGy_FROM_MCU = minmax4_psc; // minmax4
*ptrPSC_PID_TDnxRGy_FROM_MCU = TD1BRG2_ADD; // TMRD TD1BRG2
*ptrPSC_PID_TDnBCR_FROM_MCU = TDBBCR_ADD; // TMRD TD1BCR
*ptrPSC_PID_TDnBCR_DATA_FROM_MCU = 0x00000007; // TMRD TDxBCR WRITE DATA
*ptrPSC_PID_R0_FROM_MCU = 0x40314100; // PID TARGET ADDRESS
*ptrPSC_PID_A0_FROM_MCU = 0x40314560; // PID CURRENT ADDRESS

PSC_SetRepetProcVectPointer(TSB_PSCC, PSC_C_STARTADDR);

// ======== TMRB0 repeat
/* Set REN<b0:TMRBx> to enable Repeat processing */
// PSC_SetRepeatFUNC(TSB_PSCC, ENABLE);
PSC_SetTriggerEventFUNC(TSB_PSCC, PSC_TRIGGER_EVENT_0, ENABLE);
}

所以實際的運算與控制處理,都在上述原廠所包覆的 bin 檔與組合語言的程式碼中;使用者只要定義 “#define    IRIS_PSC_CONTROL” 即可,
之後的運作,系統會自動處理 IRIS VCM 馬達霍爾檢測信號的取得並且進行 PID 動態控制。

IRIS 的 PID 動態控制碼,是寫在“psc_C_PID_IRIS_sample.asm”中,
程式會先取得 ADC 採樣後的資料並初步處理,再經 PID 運算產生結果,再轉成輸出 IRIS 的輸出調整值,然後直接應用在 IRIS 的控制中。

以下是節錄“psc_C_PID_IRIS_sample.asm”的部分程式碼,詳情可參考原代碼。 
;*************    ADC input ****************
MVI AP0, 0xFFF ;//M343
MOV L0, AP0 ;//M343
MVI AP0, ADAREG0_MIR ; Set AD addres pointer
LD R0, (AP0+) ; Load ADAREG0
:
;************* Differential ****************
LD A0, (AP2+) ; K1 -> A0
LD M1, (AP2+) ; K1_M1 -> M1
MLSH A0 ; A0*M0 & shiftM1 = ERR* K1
LD R0, (AP1) ; b1*W(N-1) -> R0
:
:
;************* Proportion ****************
LD M0, (AP2+) ; Kp -> M0
LD M1, (AP2+) ; Kp_M1 -> M1
MOV A0, L0 ; L0 -> A0=ERR
MLSH A0 ; A0*M0 & shiftM1 = Kp*ERR & shiftM1 -> A0
:
;************* Integral ****************
LD R0, (AP1) ; I(N-1) -> R0
MOV A0, L0 ; L0 -> A0=ERR
ADD A0 ; A0+R0=ERR + I(N-1)
LD L0, (AP2+) ; L0_i(Upper limitValue:UL1) -> L0
LD L1, (AP2+) ; L1_i(Lower limitValue:LL1) -> L1
CLAMP A0 ; A0= I(N)
ST A0, (AP1) ; ERR+ I(N-1) -> I(N-1)
:
;************* Output Data gen. ****************
MOV R0, R1 ; Kp*ERR + Kd*IIR1 = R1 -> R0
ADD A0 ; Ki*I(N) + Kp*ERR + Kd*IIR1 -> A0

LD M1, (AP2+) ; N3_shift_bit -> M1
MVI AP0, 1
MOV M0, AP0
:
;************* output adjust value ****************
MVI AP0, PIDA0X ; Write PIDA0X
ST A0, (AP0) ; -
SLL A0, 4 ; 4bit Shift for 1bit modulation(off)
MOV R0, A0

MVI AP2, DUTY_PRIV ;
ST R0, (AP2)

PSC 與 PID 演算法處理這兩個部分,位於以下的資料夾中。 


關於 PID 的參數設定,原廠建議客戶使用預設參數即可滿足大多數的情況,不用重新設定。


參考資料:
1. 東芝文件: All-Appli note for Tamron Fujinon Ricom_20150106.pdf
2. 東芝參考源代碼:20150511 M343 Surveillance camera package data_r3.1.zip

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能