本篇测评ADC和串口,利用串口打印出ADC的电压值。
开发板台:KEIL。
开发板:APM32F107VCT6
简介:
系列产品有 2 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道和 2 个内
部通道。其中 ADC1 和 ADC2 都有 16 个外部通道各通道 A/D 转换模式有单次、
连续、扫描或间断, ADC 转换结果可以左对齐或右对齐存储在 16 位数据寄存器
中。
ADC寄存器:
ADC相关特性:
ADC 供电要求: 2.4V 到 3.6V,一般电源电压为 3.3V。
ADC 转换时间
公式: TCONV=采样时间+12.5 个周期
采样时间由 SMPCYCCFGx[2:0]位控制,最小采样周期为 1.5 个,当
ADCCLK=14MHz, 采样时间为 1.5 周期: TCONV=1.5 周期+12.5 周
期=14 周期=1 μs。
ADC 转换模式
产品内置多个 ADC、 多个通道(具体数量参考数据手册),可以组合出多种转换
模式。
内置多个 ADC,依据 ADC 的数量, 转换模式可以分为独立 ADC 模式、双重
ADC 模式;内置多个通道,可以将通道 2 类组别,即规则通道、注入通道,在每
组内部转换模式分为扫描模式、间断模式; 对于每个组内部的通道,转换模式分
为单次转换模式、连续转换模式。
在应用中, 依据实际应用需求, 可结合 ADC 的数量、转换的通道数、每个通道
的转换方式设计出满足需求的 ADC 转换方式,APM32F103 MINI板的ADC通道0配置为转换。
串口简介:
USART(通用同步异步收发器)是一个可以灵活地与外部设备进行全双工、半双
工数据交换的串行通信设备,且同时满足外部设备对工业标准 NRZ 异步串行数
据格式的要求。 USART 还提供宽范围的波特率选择,且支持多处理器通信。
USART 不仅支持标准的异步收发模式,也支持一些其他的串行数据交换模式,
如 LIN 协议、智能卡协议、 IrDA SIR ENDEC 规范和硬件流控制模式。
USART 还支持使用 DMA 功能,以实现高速数据通信
下面了解了 一下串口的发送与接收步骤:
发送配置步骤
置位 USART_CTRL1 寄存器的 UEN 位,使能 USART。
通过设置 USART_CTRL1 寄存器的 DBLCFG 位来决定字长。
通过设置 USART_CTRL2 寄存器的 STOPCFG 位来决定停止位位数。
若选择多缓冲器通信,需在 USART_CTRL3 寄存器中使能 DMA。
在 USART_BR 寄存器中设置通信的波特率。
使能 USART_CTRL1 寄存器的 TXEN 位,发送一个空闲帧。
等待 USART_STS 寄存器的 TXBE** 位置 1。
向 USART_DATA 寄存器写入数据(如果未使能 DMA,则每个需要发
送的字节都要重复步骤 7-8)。
等待 USART_STS 寄存器的 TXC** 位置 1,表示发送完成。
接收配置步骤
置位 USART_CTRL1 寄存器的 UEN 位,使能 USART。
通过设置 USART_CTRL1 寄存器的 DBLCFG 位来决定字长。
通过设置 USART_CTRL2 寄存器的 STOPCFG 位来决定停止位位数。
若选择多缓冲器通信,需在 USART_CTRL3 寄存器中使能 DMA。
在 USART_BR 寄存器中设置通信的波特率。
设置 USART_CTRL1 的 RXEN 位,使能接收。
板载原理图:
实物连接方式:
输出结果:
代码:
ADC初始化:
GPIO_Config_T gpioConfig;
ADC_Config_T adcConfig;
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
/* Configure PC0 (ADC Channel0) as analog input */
GPIO_ConfigStructInit(&gpioConfig);
gpioConfig.mode = GPIO_MODE_ANALOG;
gpioConfig.pin = GPIO_PIN_0;
GPIO_Config(GPIOA, &gpioConfig);
/* ADCCLK = PCLK2/4 */
RCM_ConfigADCCLK(RCM_PCLK2_DIV_4);
/* Enable ADC clock */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
/* ADC configuration */
ADC_Reset(ADC1);
ADC_ConfigStructInit(&adcConfig);
adcConfig.mode = ADC_MODE_INDEPENDENT;
adcConfig.scanConvMode = DISABLE;
adcConfig.continuosConvMode = ENABLE;
adcConfig.externalTrigConv = ADC_EXT_TRIG_CONV_None;
adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
/* channel number */
adcConfig.nbrOfChannel = 1;
ADC_Config(ADC1, &adcConfig);
/* ADC channel Convert configuration */
ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_13CYCLES5);
/* Enable ADC DMA */
ADC_EnableDMA(ADC1);
/* Enable ADC */
ADC_Enable(ADC1);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
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);
串口:
USART_Config_T USART_ConfigStruct;
/* USART config */
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;
采集并打印:
APM_MINI_COMInit(COM1, &USART_ConfigStruct);
if(DMA_ReadStatusFlag(DMA1_FLAG_TC1) == SET)
{
voltage = (float)DMA_ADCConvertedValue / 4095 * 3.3;
printf("\r\n");
printf("ADC register data = 0x%04X \r\n", DMA_ADCConvertedValue);
printf("voltage = %.03f V \r\n", voltage);
Delay(200);
DMA_ClearStatusFlag(DMA1_FLAG_TC1);
APM_MINI_LEDToggle(LED2);
APM_MINI_LEDToggle(LED3);
}
|