本帖最后由 jinglixixi 于 2020-10-1 16:15 编辑
HC32F460内置有2个独立的12位ADC,并在开发板上配有10K的电位器以模拟电位高低,见图1所示。 由原理图可知该电位器的引脚被连到MCU的PC0上,即ADC12_IN10。
图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 起始界面
图3 采样最大值1
图4 采样最大值2
|