LPC55 系列 2 Channel differential input ADC function 軟體設定介紹

一、概述

本文章將介紹如何透過 NXP LPC55 系列中的 ADC 2 Channel differential input,透過晶片硬體架構一次 sampling 2 個 ADC 參數,藉以提高 ADC sampling 的速度。

Single-ended mode 如圖 1 所示,透過 VINA ( ADC0_0 Channel ) Pin 將外部轉換電壓訊號輸入給 Converter,轉換完畢時回饋 A 的 data 給 ADC 的 RESFIFO Storage Buffer。 ( 如圖 1 橘框所示 )

圖 1  ( 註 1 )

Dual-single-ended mode 如圖 2 所示,同時透過 VINA ( ADC0_0 Channel ) Pin 與 VINB ( ADC0_8 Channel ) Pin 將 2 個外部轉換電壓訊號輸入給 Converter,轉換完畢時批次回饋 A 與 B 的 data 給 ADC 的 RESFIFO Storage Buffer,藉此達到 ADC 同時 Sampling 的效果。

圖 2  ( 註 1 )

二、 需求物件:

        2.1 硬體

                2.1.1 NXP LPC55S28 EVK 詳細規格如下列網址所示:

https://www.nxp.com/design/development-boards/lpcxpresso-boards/lpcxpresso55s28-development-board:LPC55S28-EVK

                2.1.2 示波器

                2.1.3 Type A to mini B USB Cable : 1 pcs

        2.2 軟體

                2.2.1 MCUXPRESSO ( IDE ) 軟體開發環境如下列網址所示:

https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/mcuxpresso-integrated-development-environment-ide:MCUXpresso-IDE

2.2.2 NXP LPC55S28 SDK 原廠提供的 LPC55S28 EVK Sample Code 如下列網址所示:

                        https://mcuxpresso.nxp.com/en/welcome


三、 操作方式:

3.1 首先我們將會先演示 Single-ended mode 的範例,並透過 GPIO 做 output 訊號給示波器量測,而後再將 Code 改為 Dual-single-ended mode,以同樣的方式量測訊號比較差異。

NXP LPC55S28 EVK 板上配置有燒錄功能的 IC,如下圖 3 紅框。

圖 3 ( 註 2 )


3.2 將 USB Cable 連結到模組板 USB Connector,USB Cable 另一端連結到 PC 如圖 4。

圖 4  ( 註 2 )

3.3 執行 MCUXPRESSO 並將 NXP 的 SDK 導入到 IDE 中,操作流程如圖 5、6。

        3.3.1 點擊 import SDK example(s);

        3.3.2 彈出 SDK import Wizard 視窗,點選 LPC55S28;

        3.3.3 點選 Next;

        3.3.4 點選 sample code lpadc_interrupt;

        3.3.5 點選 Finish 完成 Project 建立。

圖 5

圖 6

3.4 為避免 function 執行 interrupt 造成 ADC Sampling rate 誤判,點選 project 中的 lpadc_interrupt.c 尋找 /* Enable the watermark interrupt. */ 程式,將下列 Function 註解掉。( 如圖 7 )

LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFO0WatermarkInterruptEnable)

LPADC_EnableInterrupts(DEMO_LPADC_BASE, kLPADC_FIFOWatermarkInterruptEnable)

EnableIRQ(DEMO_LPADC_IRQn)

圖 7

3.5 SDK 中已建立 ADC0_0 Channel 的 PIO setting,需於 Project 中的 pin_mux.c 中建立如圖 8 紅框的參數,以利在 SDK 中建立新一組 ADC0_8 Channel 的 PIO setting

3.5.1 宣告一變數 port0_pin16_config 將對 P0_16 ( ADC0_8 ) 的相關參數儲存其中,參數如下:

a ) IOCON_PIO_FUNC0 : 選擇 IOCON function 為 0 ( GPIO 功能 );

b ) IOCON_PIO_MODE_INACT : 針對該 Port Pin 不做內部上、下拉電阻功能;

c ) IOCON_PIO_SLEW_STANDARD : 選擇 Driver slew rate 為 Standard-mode;

d ) IOCON_PIO_INV_DI : 當 GPIO 為 input時輸入功能不反轉;

e ) IOCON_PIO_ANALOG_EN : 啟用類比通道;

f ) IOCON_PIO_OPENDRAIN_DI : 設定為 digital input;

g ) IOCON_PIO_ASW_EN : 方案 MCU 為 1B 版 ( CPU 150 MHz ) 因此此處設定為開啟;

3.5.2 IOCON_PinMuxSet function 中有 4 個參數需填入如下:

a ) IOCON : 對應到 LPC5528 的 IOCON register address ( 0x40001000 );

b ) 0U : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 );

c ) 16U : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 16 );

d ) port_pin_config : 該參數用來定義 IOCON register 的參數,詳細參數說明如 3.5.1 所示。

圖 8

3.6 同樣於 Project 中的 pin_mux.c 中建立 PIO0_13 作為 output,以利後續使用示波器來測量 ADC Sampling time 的訊號來源 ( 如圖 9 ),此外需 include fsl_gpio.h 作為建立 PIO0_13 作為 output時的相關參數定義 。( 如圖 10 )

3.6.1 宣告一變數 led_config 將對 GPIO output 的相關參數儲存其中,參數如下:

a ) . pinDirection: 宣告為 kGPIO_DigitalOutput;

b ) . outputLogic : GPIO_PinInit function 中為 Output 輸出為 Low;

3.6.2 GPIO_PinInit function 中有 4 個參數需填入如下:

a ) GPIO : 對應到 LPC5528 的 GPIO register address ( 0x4008C000 );

b ) 0 : 對應到硬體規劃的 GPIO Port 上 ( 這邊宣告為 Port 0 );

c ) 13 : 對應到硬體規劃的 GPIO Port Pin 上 ( 這邊宣告為 Port 0 Pin 13 );

d ) led_config : 該參數用來定義 GPIO register 的 In/Out put 與 Output 時的輸出邏輯為 high 或 low,詳細參數說明如 3.6.1 所示。

圖 9
圖 10

3.7 SDK 中已建立 ADC0_0 Channel,於 lpadc_interrupt.c 中建立如圖 11 紅框的參數,以利在 SDK 中建立新一組 ADC0_8 Channel。

圖 11

3.8 SDK 中已建立 ADC0_0 Channel 的 init,於 lpadc_interrupt.c 中建立如圖 12 紅框的 init code,inti ADC0_8 Channel。

3.8.1 LPADC_GetDefaultConvCommandConfig(&ADC0_8_Command) : 獲取 ADC defaultConvCommandConfig 的參數值,後續將針對除了 default 以外 ADC ConvCommandConfig 所需變更的參數進行設定。

a ) ADC0_8_Command.sampleChannelMode = kLPADC_SampleChannelSingleEndSideB:在 MCU IP 中 ADC0_8 定義為 SingleEndSideB,因此在這邊將該參數至入 ADC0_8_Command 中;

b ) ADC0_8_Command.channelNumber = ADC0_8 : 將 ADC0_8 Channel 參數設定到 ADC0_8_Command 中;



3.8.2 LPADC_SetConvCommandConfig function 中有 2 個參數需填入如下,並將參數設定到 ADC register 中 :

a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000;

b ) DEMO_LPADC_USER_CMDID 8: 對應 LPC5528 的 ADC command low buffer register 為第幾組,DEMO_LPADC_USER_CMDID8 參數為 9;

c ) ADC0_8_Command : 該參數用來定義 ADC register 中的 CMDL 與 CMDH 參數,詳細參數說明如 3.8.1 所示。

3.8.3 LPADC_GetDefaultConvTriggerConfig(&ADC0_8_Tigger) : 獲取 ADC defaultConvTriggerConfig 的參數值,後續將針對除了 default 以外 ADC ConvTriggerConfig 所需變更的參數進行設定。

a ) ADC0_8_Tigger.targetCommandId       = DEMO_LPADC_USER_CMDID8 : 將對應的 ADC0_8 Tigger 參數設定到 targetCommandId 中,後續當 對應的 ADC0_8 Tigger 被出發時,ADC0_8 則會開始執行 Sampling;

b ) ADC0_8_Tigger.enableHardwareTrigger = false : 將 Hardware Trigger 關;

3.8.4 LPADC_SetConvTriggerConfig function 中有 3 個參數需填入如下,並將參數設定到 ADC register 中 :

a ) DEMO_LPADC_BASE : 對應到 LPC5528 的 ADC register address 0x400A0000;

b ) 8U : 對應 LPC5528 的 ADC Trigger control register 為第幾組,8U 參數為 8;

c ) ADC0_8_Tigger : 該參數用來定義 ADC register 中的 TCTRL 參數,詳細參數說明如 3.8.3 所示。

圖 12

3.9 為避免 function 執行 UART Print 降低 ADC Sampling rate,點選 project 中的 lpadc_interrupt.c 將下列 Function 註解掉。 ( 如圖 13 )

圖 13

3.10 於 while 中重新建立透過 software trigger 作 ADC Sample 的機制。 ( 如圖 14 )

3.10.1 GPIO->SET[0] = 1 << 13:針對 PIO0_13 做 SET output pull high 功能,本範例中透過該 GPIO 切換變化,並使用示波器來測量 ADC Sampling time 的訊號來源。

3.10.2 ADC0->SWTRIG = 0x1 : 設定 software 為 1,表示該指令下達時 ADC0_0 開始 Sampling。

3.10.3 while(ADC_CH0_source == 0){ADC_CH0_source = ADC0->RESFIFO[0];}:當 ADC_CH0_source 取得非 0 的值時表示 ADC Sampling完畢,若持續為 0 則持續訪問 ADC0->RESFIFO[0] 的 register。

3.10.4 ADC_CH0 = (ADC_CH0_source & ADC_RESFIFO_D_MASK) >> g_LpadcResultShift:當需要再 IDE 上查看 ADC Sampling 到的參數時開啟該段 code,若不需則暫時排除,避免佔用 ADC Sampling rate 的量測時間。

3.10.5 同 3.10.2 ~ 3.10.4 的步驟,為開啟 ADC0_8 的 Sampling步驟。

3.10.6 將 ADC_CH0_source 與 ADC_CH8_source 歸 0。

3.10.7 GPIO->CLR[0] = 1 << 13:針對 PIO0_13 做 SET output pull low 功能。

圖 14

        3.11 修改 code 並點擊 build 按鈕。( 如圖 15 紅框所示 )

圖 15

3.12 點擊 GUI Flash Tool 進行燒錄動作。

        3.12.1 點擊 GUI Flash Tool 如圖 16 紅框;

        3.12.2 點擊 OK 選擇已 Link 的燒錄器 如圖 17 紅框;

        3.12.3 點擊 Run 執行燒錄 如圖 18 紅框;

        3.12.4 燒錄完畢後點擊 OK 如圖 19 紅框;

圖 16
圖 17
圖 18
圖 19

3.13 點擊 EVK 上的 reset 按鈕後即刻透過示波器量測 PIO0_13 量測 ADC Sample 速率,在使用 Sample Code 的狀況下 Single-ended mode ADC 2 個 Channel 的 Sampling rate 為 159.2 kHz。( 如圖 20 )

圖 20

3.14 Dual-single-ended mode Code 的修改地方如下:

3.14.1 在 LPADC_SetConvCommandConfig(DEMO_LPADC_BASE, DEMO_LPADC_USER_CMDID, &mLpadcCommandConfigStruct) 前追加參數, mLpadcCommandConfigStruct.sampleChannelMode = kLPADC_SampleChannelDualSingleEndBothSide,藉此設定 Dual-single-ended mode 如圖 21。

圖 21

3.14.2 將 ADC0_8_Command.sampleChannelMode  = kLPADC_SampleChannelSingleEndSideB 參數註解掉,避免 ADC0_8 被規畫到 Single-ended mode 如圖 22。

圖 22

3.14.3 將 Single-ended mode 的 code 註解掉 如圖 23。

3.14.4 GPIO->SET[0] = 1 << 13:針對 PIO0_13 做 SET output pull high 功能,本範例中透過該 GPIO 切換變化,並使用示波器來測量 ADC Sampling time 的訊號來源。

3.15.5 ADC0->SWTRIG = 0x1 : 設定 software 為 1,表示該指令下達時 ADC0_0 開始 Sampling,因以變更為 Dual-single-ended mode 因此 ADC0_8 也會同時Sampling。

3.15.6 while(   ADC_CH0_source == 0 && ADC_CH8_source == 0){ADC_CH0_source = ADC0->RESFIFO[0];ADC_CH8_source = ADC0->RESFIFO[0];}:當 ADC_CH0_source 與 ADC_CH8_source 取得非 0 的值時表示 ADC Sampling完畢,若持續為 0 則持續訪問 ADC0->RESFIFO[0] 的 register。

3.15.7 ADC_CH0 = (ADC_CH0_source & ADC_RESFIFO_D_MASK) >> g_LpadcResultShift:當需要再 IDE 上查看 ADC Sampling 到的參數時開啟該段 code,若不需則暫時排除,避免佔用 ADC Sampling rate 的量測時間。

3.15.8 ADC_CH8 = (ADC_CH8_source & ADC_RESFIFO_D_MASK) >> g_LpadcResultShift:定義同 3.15.7。

3.15.9 將 ADC_CH0_source 與 ADC_CH8_source 歸 0。

3.15.10 GPIO->CLR[0] = 1 << 13:針對 PIO0_13 做 SET output pull low 功能。

圖 23

3.15 接下來的步驟則與 3.11、3.12 相同,點擊 EVK 上的 reset 按鈕後即刻透過示波器量測 PIO0_13 量測 ADC Sample 速率,在使用 Sample Code 的狀況下 Dual-single-ended mode ADC 2 個 Channel 的 Sampling rate 為 284.1 kHz。( 如圖 24 )

圖 24

四、結論:

比較最終量測結果,同時轉換 2 個 ADC Channel 時 Single-ended mode 的 Sampling rate 為 159.2 kHz、Dual-single-ended mode 的 Sampling rate 為 284.1 kHz,Dual-single-ended 較 Single-ended mode 快 124.9 kHz。


註 1:作者:NXP Semiconductors;出處:NXP 文件 UM11126 的 Fig.147

註 2:作者:NXP Semiconductors;出處:NXP 文件 UM11158的 Fig.1

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

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