打印
[新品上市]

【APM32F107VCT6 MINI开发板测评】第二步串口及ADC

[复制链接]
216|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本篇测评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);
        }

使用特权

评论回复
沙发
jonas222| | 2023-5-11 17:46 | 只看该作者
apm32可以直接用stm32的ADC库吗

使用特权

评论回复
板凳
uytyu| | 2023-5-11 18:33 | 只看该作者
ADC的通道与引脚是如何对应的              

使用特权

评论回复
地板
nomomy| | 2023-5-11 19:42 | 只看该作者
APM32F107VCT6的ADC可以采集负电平吗

使用特权

评论回复
5
macpherson| | 2023-5-11 20:26 | 只看该作者
APM32F107VCT6 中的ADC有多少通道

使用特权

评论回复
6
mmbs| | 2023-5-11 20:35 | 只看该作者
adc多通道采集可以不采用dma吗

使用特权

评论回复
7
qiufengsd| | 2023-5-11 20:42 | 只看该作者
如何用APM32F107VCT6的ADC采集0到48V的直流电压

使用特权

评论回复
8
bartonalfred| | 2023-5-11 21:01 | 只看该作者
内部ADC通道有没有24位的?              

使用特权

评论回复
9
linfelix| | 2023-5-11 21:22 | 只看该作者
APM32F107VCT6  Ad的精度能够达到多少

使用特权

评论回复
10
linfelix| | 2023-6-6 13:33 | 只看该作者
ADC数据串口输出如何按字节输出

使用特权

评论回复
11
51xlf| | 2023-6-6 13:44 | 只看该作者
串口和ADC在使用时都需要熟悉相关的通信协议、数据格式和参数配置,以确保数据的正确性和稳定性。

使用特权

评论回复
12
robincotton| | 2023-6-6 17:19 | 只看该作者
芯片内置了多个ADC模块,可以方便地进行模拟量采集,并提供多种不同精度和采样速率的选项。

使用特权

评论回复
13
gygp| | 2023-6-6 17:25 | 只看该作者
在APM32F107VCT6 芯片中,串口和ADC是常用的外设模块,在实际应用中有着广泛的应用。

使用特权

评论回复
14
dspmana| | 2023-6-6 17:51 | 只看该作者
如何用串口调试助手测试APM32的ADC接口

使用特权

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

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

81

主题

462

帖子

2

粉丝