本帖最后由 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输入口,修改后的程序如下:
/*! * * * * */ #include "main.h" #include "apm32e10x_adc.h" volatile uint32_t tick = 0; uint8_t txBuf[] = "HelloUSART1 \r\n"; void Delay(void); voidGPIO_Configuration(void); /*! * * @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采集的应用。
|