打印
[APM32F4]

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

[复制链接]
467|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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

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

检测多通道数据采集的主程序为:
int main(void)
{
USART_Config_T USART_ConfigStruct;
USART_ConfigStructInit(&USART_ConfigStruct);
USART_ConfigStruct.baudRate = 115200;
USART_ConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
USART_ConfigStruct.mode = USART_MODE_TX;
USART_ConfigStruct.parity = USART_PARITY_NONE;
USART_ConfigStruct.stopBits = USART_STOP_BIT_1;
USART_ConfigStruct.wordLength = USART_WORD_LEN_8B;
BOARD_COM_Config(COM1, &USART_ConfigStruct);
ADC_Init();
while (1)
{
ADC_MultiChannelPolling();
Delay(1000);
}
}

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

图1 检测结果

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

测试采集数据显示效果的主程序为:
int main(void)
{
BOARD_TFT_Config();
tft_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(120,10,"APM32F402");
POINT_COLOR=WHITE;
LCD_DrawLine(0, 30, 319, 30);
LCD_DrawLine(0, 210, 319, 210);
POINT_COLOR=YELLOW;
LCD_ShowString(20,60,"ch0: mV ");
LCD_ShowString(20,90,"ch1: mV ");
LCD_ShowString(20,120,"ch2: mV ");
ADC_Init();
while (1)
{
ADC_MultiChannelPolling();
Delay(1000);
}
}

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

图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吗!


使用特权

评论回复
地板
ShadowDance| | 2025-7-24 09:42 | 只看该作者
0 - 0x0FFF, 共4096个区间
也要把 0 算上啊

使用特权

评论回复
5
jinglixixi|  楼主 | 2025-7-24 15:22 | 只看该作者
ShadowDance 发表于 2025-7-24 09:42
0 - 0x0FFF, 共4096个区间
也要把 0 算上啊

使用特权

评论回复
6
黎明热忱| | 2025-7-25 20:53 | 只看该作者
F402R的电压参考电压是内部的,还是外置的?

使用特权

评论回复
7
jinglixixi|  楼主 | 2025-7-26 00:10 | 只看该作者
黎明热忱 发表于 2025-7-25 20:53
F402R的电压参考电压是内部的,还是外置的?

内部

使用特权

评论回复
8
暖茶轻语| | 2025-7-29 12:39 | 只看该作者
这个开发板的ADC功能确实强大,能够同时采集三个通道的数据,代码实现也很清晰。不过,我好奇在实际应用中,这些数据的采集精度和稳定性如何?有没有可能受到外部干扰?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

510

主题

2917

帖子

39

粉丝