[APM32F4] 【APM32F402R Micro-EVB开发板测评】+多通道A/D数据采集及显示

[复制链接]
 楼主| jinglixixi 发表于 2025-7-23 13:32 | 显示全部楼层 |阅读模式

APM32F402R Micro-EVB开发板配有一个12bit ADC数模转换器,可进行多个数据通道的采集。
以3个数据采集通道为例,其信号输入的引脚分别对应PA0~PA2。
它对 ADC的初始化函数为:
  1. void ADC_Init(void)
  2. {
  3.     GPIO_Config_T GPIO_ConfigStruct;
  4.     ADC_Config_T ADC_ConfigStruct;
  5.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
  6.     GPIO_ConfigStructInit(&GPIO_ConfigStruct);
  7.     GPIO_ConfigStruct.mode    = GPIO_MODE_ANALOG;
  8.     GPIO_ConfigStruct.pin     = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
  9.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  10.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
  11.     ADC_Reset(ADC1);
  12.     ADC_ConfigStructInit(&ADC_ConfigStruct);
  13.     ADC_ConfigStruct.mode                  = ADC_MODE_INDEPENDENT;
  14.     ADC_ConfigStruct.scanConvMode          = ENABLE;
  15.     ADC_ConfigStruct.continuousConvMode    = ENABLE;
  16.     ADC_ConfigStruct.externalTrigConv      = ADC_EXT_TRIG_CONV_NONE;
  17.     ADC_ConfigStruct.dataAlign             = ADC_DATA_ALIGN_RIGHT;
  18.     ADC_ConfigStruct.nbrOfChannel          = ADC_CH_SIZE;
  19.     ADC_Config(ADC1, &ADC_ConfigStruct);
  20.     RCM_ConfigADCCLK(RCM_PCLK2_DIV_6);
  21.     ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_13CYCLES5);
  22.     ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_13CYCLES5);
  23.     ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_2, 3, ADC_SAMPLETIME_13CYCLES5);
  24.     DMA_Init();
  25.     ADC_EnableDMA(ADC1);
  26.     ADC_Enable(ADC1);
  27.     ADC_ResetCalibration(ADC1);
  28.     while (ADC_ReadResetCalibrationStatus(ADC1));
  29.     ADC_StartCalibration(ADC1);
  30.     while (ADC_ReadCalibrationStartFlag(ADC1));
  31.     ADC_EnableSoftwareStartConv(ADC1);
  32. }

通过串口对采集数据进行输出的函数为:
  1. void ADC_MultiChannelPolling(void)
  2. {
  3. float voltage;
  4. uint8_t index;
  5. for (index = 0; index < ADC_CH_SIZE; index++)
  6. {
  7. voltage = (adcData[index] * 3300.0) / 4095.0;
  8. printf("ADC CH[%d] voltage = %.03f mV\r\n", index, voltage);
  9. }
  10. printf("\r\n");
  11. }

检测多通道数据采集的主程序为:
  1. int main(void)
  2. {
  3. USART_Config_T USART_ConfigStruct;
  4. USART_ConfigStructInit(&USART_ConfigStruct);
  5. USART_ConfigStruct.baudRate = 115200;
  6. USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  7. USART_ConfigStruct.mode = USART_MODE_TX;
  8. USART_ConfigStruct.parity = USART_PARITY_NONE;
  9. USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
  10. USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
  11. BOARD_COM_Config(COM1, &USART_ConfigStruct);
  12. ADC_Init();
  13. while (1)
  14. {
  15. ADC_MultiChannelPolling();
  16. Delay(1000);
  17. }
  18. }

经程序的编译和下载,其检测结果如图1所示。
2bbe28fc6fd3499cc644fe9491e697f4
图1 检测结果

在配接TFT显示屏的情况下,其采集数据的显示函数为:
  1. void ADC_MultiChannelPolling(void)
  2. {
  3. float voltage;
  4. uint8_t index;
  5. for (index = 0; index < ADC_CH_SIZE; index++)
  6. {
  7. voltage = (adcData[index] * 3300.0) / 4095.0;
  8. if(index ==0) LCD_ShowNum(60,60,voltage,4);
  9. if(index ==1) LCD_ShowNum(60,90,voltage,4);
  10. if(index ==2) LCD_ShowNum(60,120,voltage,4);
  11. }
  12. }

测试采集数据显示效果的主程序为:
  1. int main(void)
  2. {
  3. BOARD_TFT_Config();
  4. tft_Init();
  5. LCD_Clear(RED);
  6. BACK_COLOR=RED;
  7. POINT_COLOR=YELLOW;
  8. LCD_ShowString(120,10,"APM32F402");
  9. POINT_COLOR=WHITE;
  10. LCD_DrawLine(0, 30, 319, 30);
  11. LCD_DrawLine(0, 210, 319, 210);
  12. POINT_COLOR=YELLOW;
  13. LCD_ShowString(20,60,"ch0: mV ");
  14. LCD_ShowString(20,90,"ch1: mV ");
  15. LCD_ShowString(20,120,"ch2: mV ");
  16. ADC_Init();
  17. while (1)
  18. {
  19. ADC_MultiChannelPolling();
  20. Delay(1000);
  21. }
  22. }

经程序的编译和下载,其检测结果如图2所示。
2126856c7ff32ec0a3d50691be1463ab
图2 显示效果



ShadowDance 发表于 2025-7-23 14:45 | 显示全部楼层
楼主,电压的分频数为什么是 4095啊?
12位的精度不是应该4096吗!
 楼主| jinglixixi 发表于 2025-7-23 15:11 | 显示全部楼层
ShadowDance 发表于 2025-7-23 14:45
楼主,电压的分频数为什么是 4095啊?
12位的精度不是应该4096吗!

snap.jpg
ShadowDance 发表于 2025-7-24 09:42 | 显示全部楼层
0 - 0x0FFF, 共4096个区间
也要把 0 算上啊
 楼主| jinglixixi 发表于 2025-7-24 15:22 | 显示全部楼层
ShadowDance 发表于 2025-7-24 09:42
0 - 0x0FFF, 共4096个区间
也要把 0 算上啊

黎明热忱 发表于 2025-7-25 20:53 | 显示全部楼层
F402R的电压参考电压是内部的,还是外置的?
 楼主| jinglixixi 发表于 2025-7-26 00:10 | 显示全部楼层
黎明热忱 发表于 2025-7-25 20:53
F402R的电压参考电压是内部的,还是外置的?

内部
暖茶轻语 发表于 2025-7-29 12:39 | 显示全部楼层
这个开发板的ADC功能确实强大,能够同时采集三个通道的数据,代码实现也很清晰。不过,我好奇在实际应用中,这些数据的采集精度和稳定性如何?有没有可能受到外部干扰?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

517

主题

2932

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部