簡介
本文將詳細介紹如何使用 EB 工具配置 Flagchip FC4150 MCAL ADC 讀取電位器值。並重點強調了配置 ADC 模塊的過程以及對 ADC 模塊的詳細解釋。關於 mcu、port 、dio、icu 模塊可參考之前發布的博文。本次示例演示將會使用 ADC0_SE0、ADC0_SE4 通道、採用中斷方式進行電位器值的讀取
硬體平台:旗芯微 FC4150 DEMO BOARD V2 開發板
軟體平台:EB tresos 28.1.0 、Flagchip_FC_IDE 4.04
MCAL: V1.1.0 & V1.1.1
一、MCAL 配置
1.1 配置 MCU 模塊
1.1.1 根據 demo board 電位器原理圖所示,我們需要在MCU模塊-> PCC下添加Port A 、E、ADC 0的外設並配置為時鐘使能。

▲ 圖 1.1.1
▲ 圖 1.1.2
1.1.2 在 McuClockReferencePoint 設置添加 McuClockReferencePoint_Adc0 參考時鐘源

▲ 圖 1.1.3
1.2 配置 PORT 模塊
1.2.1 進入 Port A 的 PortPin 界面下,添加 PTA25 引腳並命名為 Varistor1,配置 PTA25 為 ADC_SE0 、輸入模式,默認電平為低。

▲ 圖 1.2.1
1.2.2 進入 Port E 的 PortPin 界面下,添加 PTE4 引腳並命名為 Varistor2,配置 PTE4 為 ADC_SE04、輸入模式,默認電平為低。

▲ 圖 1.2.2
1.3配置 ADC 模塊
1.3.1 在Module Configurations 中添加 ADC模塊,在 ADC模塊中的 AdcHwUnit下添加 ADC 0 外設。

▲ 圖 1.3.1
1.3.2 雙擊 Index 0 進入 Adc HwUnit_0 配置界面,在 General 下配置 ADC 時鐘參考源、ADC 位數 12 位、ADC 參考電壓源為內部、AdcSampleTimeOptions 默認即可。

▲ 圖 1.3.2
1.3.3 進入 AdcChannel的 配置界面,添加兩個 ADC 通道,將 Adc Hardware Channel Id 更改為與原理圖對應的 ADC0_SE0、ADC0_SE4 通道

▲ 圖 1.3.3
1.3.4 進入 AdcGroup 的配置界面添加 AdcGroup_0

▲ 圖 1.3.4
1.3.4.1 雙擊 Index 0 進入 AdcGroup_0 配置界面,在 General 下配置 ADC 組,將 ADC 組配置模式設置為單次讀取,轉換模式設置為單次轉換,觸發模式設置為軟體觸發、設置轉換類型為中斷方式,填寫組轉換完成的回調函數 IoHwAb_Adc_Notification_0

▲ 圖 1.3.4.1
1.3.4.2 在 AdcGroupDefinition下添加剛剛配置好的兩個通道,分配給 ADC 組 0

▲ 圖 1.3.4.2
1.3.5 在 AdcInterrupt 下選擇 ADC 0 中斷使能

▲ 圖 1.3.5
二、示例代碼解析
2.1 將 EB 配置好的工程編譯並更新代碼至 FCIDE 中
2.2 Main 函數
將 Bsp_Adc_Init、BSP_FCUART_Init 函數取消屏蔽,Bsp_Adc_20ms_Task_Event、Bsp_Adc_1s_Task_Event 函數添加至任務時間片函數中

▲ 圖 2.2.1

▲ 圖 2.2.2
2.3 Adc_PBcfg.c
我們可以看到 ADC0_SE0、ADC0_SE4 在EB 工具配置好的屬性與回調函數的聲明

▲ 圖 2.3.1(ADC硬體模塊配置屬性)

▲ 圖 2.3.2(ADC通道配置屬性)

▲ 圖 2.3.2(ADC組配置屬性)
2.4 Bsp_Adc.c
2.4.1 在 demo 示例中編寫 IoHwAb_Adc_Notification_0 函數實體,添加 Adc0_Group0_Ready = TRUE;

▲ 圖 2.4.1
2.4.2 找到 Bsp_Adc_Init、Bsp_Adc_20ms_Task_Event、Bsp_Adc_1s_Task_Event 這是 demo 示例對 MCAL API 的調用

▲ 圖 2.4.2.1

▲ 圖 2.4.2.2
三、燒錄 & 調試
3.1 將工程編譯並燒錄到開發板
打開串口助手軟體,波特率設置為 115200 ,觀察到兩個電位器的 ADC 值已被 MCU 成功讀取

▲ 圖 3.1
四、MCAL ADC 模塊詳解
FC4150 ADC 模塊提供 8/10/12 位轉換精度、單次/連續轉換模式、軟/硬觸發、單通道採樣時間配置、硬體均值濾波等功能
4.1 General 配置

▲ 圖 4.1
①AdcGeneral
- Adc_DeInit API:復位 ADC 配置
- Adc Development Error Detection :ADC 模塊開發錯誤檢測使能
- Adc Enable Limit Check:啟用 ADC 轉換結果進行上下限檢測
- Adc Enable Queuing :ADC 隊列啟用,觸發源可以轉換一個隊列
- Adc_StartStopGroup API :控制 ADC 組的啟動、停止轉換
- Adc Group Notification Capability:啟用在 ADC 組轉換時的通知
- Adc Hw Trigger API:啟用硬體觸發
- Adc_ReadGroup API :讀一個 ADC 組的轉換結果
- Adc_VersionInfo API: 讀 ADC 模塊版本信息
- Adc Priority Mechanism:設置 ADC 轉換的優先級
- Adc Result Alignment:ADC 轉換結果對齊方式
- Adc Timeout:用於初始化時,對 ADC 校準時間計時,如果超出 Timeout 配置時間,則會返回超時狀態
- Adc Dma Transfering Timeout:用於 DMA 傳輸時,對 DMA 傳輸時間計時,如果超出 Timeout 配置時間,則會返回超時狀態
- Adc Max Queue Depth:ADC 轉換請求的最大隊列深度
②AdcPublishedInformation
- 該模塊不需要配置
③IAutosarExt
- Adc Disable Production Error Reporting:禁用 ADC 採集錯誤反饋
- Adc Set Hardware Average Once:啟用 ADC 硬體均值濾波
- Adc Global Enable DMA Transfer: 使能 ADC 組的 DMA 傳輸
- Enable Adc User Mode Support:不需要配置
- Adc Continuous Without Interrupt Uses:ADC 配置為連續模式的時候不觸發中斷
④Adc Dem Event Parameter Refs
- 該模塊用不到
4.2 AdcHwUnit配置
最多可添加2個ADC外設(硬體決定)

▲ 圖 4.2
4.2.1 雙擊 Index0 進入AdcHwUnit0-> General配置界面

▲ 圖 4.2.1
- Adc Hardware Unit: ADC 硬體外設 Id 號
- Adc Logical Unit: ADC 邏輯 Id 號
- Adc Clock Reference:ADC 參考時鐘源,在 MCU->McuClockReferencePoint 中配置
- Adc Voltage Reference Selection: ADC 參考電壓源
- Adc Dma Channel :配置 ADC DMA 傳輸通道
- Adc Alignment:ADC 轉換結果對齊
- Adc Resolution:ADC 解析度
- ADC Startup Counter:在開始轉換前,設定一個 ADC 穩定時間
- Adc Pre-Trigger Select:設定預觸發源
- Adc Trigger Select :設定觸發源
- Adc Sample Time Option x :設定 ADC 採樣時間
- Adc Ptimer Prescaler Divider Select :ADC ptimer 的預分頻器配置
- Adc Ptimer Multiplication Factor Select for Prescaler :ADC ptimer 的倍頻因子配置
- Ptimer Sequence Error Interrupt Enable :使能 Ptimer 序列錯誤中斷
- Ptimer Sequence Error Notification :填寫序列錯誤中斷的回調函數名稱
- Adc Hardware Average Enable :ADC 硬體均值濾波使能
- Adc Hardware Average Select :ADC 硬體均值濾波個數
4.2.2 AdcHwUnit0-> AdcChannel 最多可支持 32 個外部通道 ,4 個內部通道

▲ 圖 4.2.2
4.2.3 雙擊 Index0 進入 AdcHwUnit0-> AdcChannel-> AdcChannel_0 配置界面

▲ 圖 4.2.3
- Adc Logical Channel ID: ADC 通道邏輯 ID 號
- Adc Hardware Channel Id : ADC 硬體通道 Id 號,與 port 模塊中的配置對應
- Adc Channel Limit Check: ADC 通道監測使能
- Adc Channel Range Select : 選擇檢測限制類型,當 ADC 轉換結果在設定類型的邊界外時或邊界內時,可以生成通道事件,類型如下:
- ADC_RANGE_ALWAYS: 全範圍
- ADC_RANGE_BETWEEN: 在上限值與下限值之間,含上限值
- ADC_RANGE_NOT_BETWEEN: 超出上限值或低於下限值,含下限值
- ADC_RANGE_NOT_OVER_HIGH: 低於上限值,含上限值
- ADC_RANGE_NOT_UNDER_LOW: 高於下限值
- ADC_RANGE_OVER_HIGH: 高於上限值
- ADC_RANGE_UNDER_LOW:低於下限值,含下限值
- Adc Channel Resolution:ADC 解析度,在 AdcHwUnit0-> General 配置界面已經配置好
- Adc Channel Sample Time Option:ADC 採樣時間,可選 SAMPLE_TIME_OPTION:0-4
- Adc Channel Sample Time:根據所選 SAMPLE_TIME_OPTIONx 自動計算出採樣時間數值
4.2.4 AdcHwUnit0-> AdcGroup 配置界面,對 ADC 通道進行組合,進行組轉換

▲ 圖 4.2.4
4.2.5 雙擊 Index0 ,進入 AdcGroup->AdcGroup_0->General 配置界面

▲ 圖 4.2.5
- Adc Group Access Mode : ADC 轉換結果訪問模式配置,單訪問模式、流訪問模式、流訪問模式需配合 Adc Group Streaming Buffer Mode 、Adc Group Streaming Number Samples 配置去使用
- Adc Group Conversion Mode:ADC 轉換模式配置、單次轉換、連續轉換
- Adc Group Id: ADC 組 id 號
- Adc Group Priority: ADC 組的優先級配置,在 ADC->General->Adc Priority Mechanism 下配置為非 ADC_PRIORITY_NONE 時,可以啟用 ADC 組的優先級配置
- Adc Group Replacement: 在轉換過程中,ADC 組被高優先級 ADC 組打斷時的替換機制。ADC_GROUP_REPL_ABORT_RESTART 中止/重啟機制:在轉換過程中,當前 ADC 組被更高優先級的 ADC 組打斷時,則會在更高優先級的 ADC 組轉換完成後重新啟動當前 ADC 組轉換
ADC_GROUP_REPL_SUSPEND_RESUME 掛起/恢復機制:在轉換過程中,當前 ADC 組被更高優先級的 ADC 組打斷時,則會在更高優先級的 ADC 組轉換完成後繼續當前 ADC 組轉換
- Adc Transfer Type : ADC 傳輸類型
- Adc Group Notification :啟用 ADC 組轉換完成後的通知機制,填入回調函數名稱
- Adc Group Streaming Buffer Mode:將緩存區為線性緩衝區(buffer 滿時停止轉換)或循環緩衝區(buffer 滿時進行覆蓋)
- Adc Group Streaming Number Samples: 在流訪問模式下,每個通道需要獲取的 ADC 值的數量,單訪問模式下默認為 1
- Adc Group In Back to Back Mode:使能表示通道按順序發生轉換,儘可能的快,並且不會導致內部 Ptimer 錯誤
- Adc Group Uses Channel Delays:啟用用戶自定義通道延時,在 AdcGroup_0-> AdcChannelDelay 配置
- Adc Delay Next Ptimer: Ptimer 預觸發器有 8 個通道用來觸發 ADC 組轉換,當使用 Ptimer 預觸發器來觸發 ADC 組轉換時,不同的 Ptimer 預觸發器通道之間應根據當前組的轉換時間來間隔相應的時間,避免同時觸發導致 ADC error
- Adc Ptimer Period For Continous Mode:如使用 Ptimer 連續進行預觸發 ADC 組轉換時,應設定 Ptimer 周期值大於 ADC 組轉換時間
- Adc Hardware Average Enable: ADC 硬體採樣均值濾波使能
- Adc Hardware Average Select: 選擇 ADC 硬體採樣均值濾波時間
4.2.6 AdcGroup->AdcGroup_0->AdcGroupDefinition 配置界面,添加該 ADC 組的通道

▲ 圖 4.2.6
4.2.7 AdcGroup->AdcGroup_0->AdcChannelDelay 配置界面,當在 AdcGroup->AdcGroup_0->General 啟用 Adc Group Uses Channel Delays 時,可以添加通道轉換延遲時間

▲ 圖 4.2.7
4.3 AdcPowerStateConfig 配置
不支持低功耗
▲ 圖 4.3
4.4 AdcInterrupt 配置
可以添加 ADC 外設0、1用於 ADC硬體中斷。

▲ 圖 4.4
4.5 PublishedInformation ADC 模塊版本信息
4.6 ADC 模塊常用函數
- Adc_Init:初始化 ADC 模塊
- Adc_SetupResultBuffer:配置 ADC 組轉換結果緩衝區
- Adc_DeInit:將 ADC 模塊復位至默認狀態
- Adc_StartGroupConversion:開始 ADC 組模數轉換
- Adc_StopGroupConversion:停止 ADC 組模數轉換
- Adc_ReadGroup:讀取 ADC 組的最後一輪轉換結果,並存入指定的結果緩衝區地址
- Adc_EnableHardwareTrigger:使能 ADC 組轉換為硬體觸發方式
- Adc_DisableHardwareTrigger:失能 ADC 組轉換為硬體觸發方式
- Adc_EnableGroupNotification: 使能 ADC 組轉換的事件通知
- Adc_DisableGroupNotification:失能 ADC 組轉換的事件通知
- Adc_GetGroupStatus:返回當前 ADC 組的狀態
- Adc_GetStreamLastPointer:獲取每個通道的有效採樣數,獲取指向緩衝區的最後一個結果位置的指針位置
- Adc_GetVersionInfo:獲取 ADC 模塊的版本信息
五、總結
本文以 adc 讀取電位器值為示例,詳細介紹了如何配置和使用 ADC(模數轉換)模塊,通過本文的講解,讀者可以了解到如何正確配置 ADC 模塊,以實現模數轉換的功能。
六、參考文獻
(1) AUTOSAR_SWS_AdcDriver.pdf
(2) FC4150 Reference Manual V3.0.pdf
歡迎在博文下方留言評論,我們會及時回復您的問題。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:Memory
更多資訊,請掃碼關注我們!
評論