本帖最后由 jinglixixi 于 2020-10-1 16:15 編輯
HC32F460內置有2個獨立的12位ADC,并在開發板上配有10K的電位器以模擬電位高低,見圖1所示。 由原理圖可知該電位器的引腳被連到MCU的PC0上,即ADC12_IN10。
1.jpg (8.91 KB, 下載次數: 61)
下載附件
2020-9-30 23:11 上傳
圖1 電位器連接
在廠家提供的例程是通過串口來輸出數據采集值,但奇怪的是在串口連接并設置好以后,卻一直沒等到數據的到來。 為確定A/D是否真正獲得了正確的結果,就將OLED屏與A/D結合到一起以驗證A/D的數據采集功能。 其主程序的內容為: - int32_t main(void)
- {
- uint8_t u8Count;
- stc_port_init_t stcPortInit;
- MEM_ZERO_STRUCT(stcPortInit);
- SystemClockConfig();
- AdcConfig();
- stcPortInit.enPinMode = Pin_Mode_Out;
- PORT_Init(PortD, Pin00, &stcPortInit);
- PORT_Init(PortD, Pin01, &stcPortInit);
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32F460 TEST",16);
- OLED_ShowString(0,2,"OLED & A/D",16);
- Ddl_Delay1ms(1000u);
- ADC_PollingSa(M4_ADC1, m_au16Adc1Value, ADC1_CH_COUNT, TIMEOUT_MS);
- u8Count = 0u;
- ADC_StartConvert(M4_ADC2);
- while (u8Count < ADC2_CONTINUOUS_TIMES)
- {
- if (Set == ADC_GetEocFlag(M4_ADC2, ADC_SEQ_A))
- {
- ADC_GetChData(M4_ADC2, ADC2_SA_CHANNEL, m_au16Adc2Value, ADC2_SA_CHANNEL_COUNT);
- ADC_ClrEocFlag(M4_ADC2, ADC_SEQ_A);
- u8Count++;
- }
- }
- ADC_StopConvert(M4_ADC2);
- OLED_Clear();
- OLED_ShowString(0,0,"A/D= ",16);
- OLED_ShowString(0,2," U = mV",16);
- while (1u)
- {
- ADC_PollingSa(M4_ADC1, m_au16Adc1Value, ADC1_CH_COUNT, TIMEOUT_MS);
- OLED_ShowNum(40,2,(m_au16Adc1Value[10u] * ADC_VREF) / (float) ADC1_ACCURACY*1000,4,16);
- Ddl_Delay1ms(500u);
- }
- }
復制代碼
程序經編譯下載后,其起始界面如圖2 所示,在的最大值為4095 ,即0XFFFH ,對應的電壓值為3.287V ,見圖3 所示。之所產生這樣的結果是與其轉換公式有關的,改寫成直觀的形式為: 電壓值=A/D采集值*3.288/4096 以這個公式是不能期待有3.3V電壓顯示的,因為滿量程的測量值也僅是3.288V。況且A/D采集的最大值也僅能達到值0XFFFH,是不會產生0X1000H這個結果,即最大測量電壓也不會達到3.288V。 若滿量程時為3.3V電壓,在修改轉換公式的情況下,應為: 電壓值=A/D采集值*3.3/4095 此時,其采集的最大值如圖4所示。
2.jpg (27.14 KB, 下載次數: 58)
下載附件
2020-9-30 23:11 上傳
圖2 起始界面
3.jpg (29.28 KB, 下載次數: 58)
下載附件
2020-9-30 23:11 上傳
圖3 采樣最大值1
4.jpg (30.98 KB, 下載次數: 53)
下載附件
2020-9-30 23:11 上傳
圖4 采樣最大值2
|