sumoon_yao 发表于 2022-5-22 14:28

【APM32E103xE测评】AD采集与串口输出

本帖最后由 sumoon_yao 于 2022-5-22 14:30 编辑

    APM32E103xCxE系列MCU的性能还是相当不错的,先来看看主要性能指标。 -   32位Arm®Cortex®-M3内核,最高120MHz工作频率-   Flash:容量最高为512KB-   SRAM:容量最高为128KB-   支持睡眠、停机、待机三种低功耗模式-   最多有112个I/O ,所有I/O都可以映射到外部中断向量,最多有87个容忍5V输入的I/O -   丰富的通信外设:2个I2C,3个USART,2个UART,3个SPI,2个CAN,1个USBD,1个SDIO-   模拟接口:3个12位ADC,2个12为DAC-   2个7 通道PWM输出,4个16位通用定时器,2个16位基本定时器,2个看门狗定时器,1个24为自减型系统定时器 本次测评主要想测试下APM32E103 MCU的AD采集,并通过串口输出实时采集的AD值。 从官网下载开发板相关资料,先安装固件包,安装完成后应该是这样的:

   官方提供的例程还是很丰富的,打开串口输出例程,然后在此基础上,增加AD采集功能。数据手册中PC4是AD输入通道之一,且该IO也在开发板上引出,就以该引脚作为AD输入口,修改后的程序如下:
/*! * @file       main.c * * @brief      Main program body * * @version    V1.0.0 * * @date       2021-07-26 * */ #include "main.h"#include "apm32e10x_adc.h" volatile uint32_t tick = 0;uint8_t txBuf[] = "HelloUSART1    \r\n"; void Delay(void);voidGPIO_Configuration(void); /*! * @brief      Main program    * * @param      None * * @retval   None * */int main(void){    uint8_t i;    uint16_t ad_value;        GPIO_Config_T GPIO_ConfigStruct;    USART_Config_T USART_ConfigStruct;    ADC_Config_T ADC_configStruct;        /* GPIO configuration------------------------------------------------------*/    GPIO_Configuration();       APM_MINI_LEDInit(LED2);    APM_MINI_LEDOff(LED2);       RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);   RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA |RCM_APB2_PERIPH_USART1));        GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;    GPIO_ConfigStruct.pin = GPIO_PIN_9;    GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;    GPIO_Config(GPIOA, &GPIO_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;    USART_Config(USART1,&USART_ConfigStruct);        USART_Enable(USART1);        SysTick_Config(SystemCoreClock / 1000);     /* ADC1 Configuration------------------------------------------------------*/    ADC_configStruct.mode =ADC_MODE_INDEPENDENT;    ADC_configStruct.scanConvMode = DISABLE;     ADC_configStruct.continuosConvMode =ENABLE;    ADC_configStruct.externalTrigConv =ADC_EXT_TRIG_CONV_None;     ADC_configStruct.dataAlign =ADC_DATA_ALIGN_RIGHT;     ADC_configStruct.nbrOfChannel = 14;    ADC_Config(ADC1, &ADC_configStruct);     /* ADC1 regular channel14 configuration */     ADC_ConfigRegularChannel(ADC1,ADC_CHANNEL_14, 1, ADC_SAMPLE_TIME_13_5);     /* Enable ADC1 */    ADC_Enable(ADC1);     /* Enable ADC1 reset calibration register*/       ADC_ResetCalibration(ADC1);    /* Check the end of ADC1 reset calibrationregister */   while(ADC_ReadResetCalibrationStatus(ADC1));     /* Start ADC1 calibration */    ADC_StartCalibration(ADC1);    /* Check the end of ADC1 calibration */    while(ADC_ReadCalibrationStartFlag(ADC1));     /* Start ADC1 Software Conversion */     ADC_EnableSoftwareStartConv(ADC1);     while(1)    {      Delay();      ad_value =ADC_ReadConversionValue(ADC1);            sprintf(txBuf,"ADC Value = %d \r\n",ad_value);             for(i = 0; i < sizeof(txBuf); i++)      {          while(USART_ReadStatusFlag(USART1,USART_FLAG_TXBE) == RESET);          USART_TxData(USART1, txBuf);      }            APM_MINI_LEDToggle(LED2);    }} /*! * @brief      Configures the differentsystem clocks * * @param      None * * @retval   None * * @note */void GPIO_Configuration(void){    GPIO_Config_T configStruct;        configStruct.pin = GPIO_PIN_4;    configStruct.mode = GPIO_MODE_ANALOG;    GPIO_Config(GPIOC, &configStruct);} /*! * @brief      Delay * * @param      None * * @retval   None * */void Delay(void){    tick = 0;        while(tick < 1000);}
    编译,无报错,下一步就是将编译好的程序下载到开发板上,由于该系列芯片和ST的兼容,直接使用手头的ST-LINK/V2下载。点击“Download”后居然报错:

记得以前调试其它开发板的时候也遇到过类似问题,可以通过修改下面的参数,再下载就不会报错了。

打开串口终端,准备测试3个点,满量程,1/2量程,零点,看看采集到的AD值是否稳定。

先来看看满量程,直接用杜邦线把PC4引脚和VDD引脚短接,测得数值如下:

   再把PC4引脚和GNDD引脚短接,测得数值如下:

   最后用2个10k电阻对VDD进行分压,再接入PC4引脚,如下图所示:

   测得AD值如下:

   以上所有测得的AD数值均为单次采样值,未作任何处理,从测得的数值来看,APM32E103 MCU的AD采集还是相当不错的, 虽然只有12位精度,但应该可以满足大多数需要AD采集的应用。



WoodData 发表于 2022-5-23 14:27

可以可以,学习下

流水源 发表于 2022-5-23 21:13

看看

落花又见流水 发表于 2022-5-23 21:14

学习一下

WoodWang 发表于 2022-5-23 21:15

搞个电位器测下adc试试

belindagraham 发表于 2022-6-2 09:44

APM32E103怎么样?

touser 发表于 2022-6-2 09:53

AD采集使用dma了吗?

sumoon_yao 发表于 2022-6-2 09:58

touser 发表于 2022-6-2 09:53
AD采集使用dma了吗?

没有使用DMA

dspmana 发表于 2022-6-2 10:47

AD采集可行

mollylawrence 发表于 2022-6-2 11:44

AD是16个吗

selongli 发表于 2022-6-2 14:48

最大支持几个串口呢?

sumoon_yao 发表于 2022-6-3 12:05

mollylawrence 发表于 2022-6-2 11:44
AD是16个吗

3个12位AD,21个通道

sumoon_yao 发表于 2022-6-3 12:06

selongli 发表于 2022-6-2 14:48
最大支持几个串口呢?

5个串口:2个UART 3个USART

chenjun89 发表于 2022-6-6 18:51

单次测量值看来还是比较稳定

chenqianqian 发表于 2022-6-7 08:16

看来AD性能还是不错

E=MC2U 发表于 2022-7-6 13:57

这只能叫12位解析度,不叫12位精度,从贴图来看,10个LSB在跳,就是低于9位的有效精度。

fentianyou 发表于 2022-7-8 09:58

数据稳定吗   

maqianqu 发表于 2022-7-8 10:25

有完整的工程文件吗

janewood 发表于 2022-7-8 15:17

DMA读取最简单了。

modesty3jonah 发表于 2022-7-8 15:43

这个资料在哪里下载的
页: [1] 2
查看完整版本: 【APM32E103xE测评】AD采集与串口输出