一、引言

        在嵌入式开发领域,STM32F103 系列微控制器因其高性能和丰富的外设而被广泛应用。其中,ADC(模拟 – 数字转换器)外设是连接模拟世界和数字世界的关键桥梁,使微控制器能够处理各种模拟信号。今天,我们就深入探讨一下 STM32F103 的 ADC 外设。

二、STM32F103 ADC 的基本特征

        STM32F103 通常配备了 1 – 3 个 ADC 模块(具体数量取决于芯片型号),每个 ADC 都是 12 位逐次逼近型模拟数字转换器。

  • 分辨率:12 位的分辨率意味着它可以将输入的模拟信号量化为 2^12 = 4096 个不同的数字值,从而提供了相对较高的精度。
  • 转换模式多样:支持单次转换和连续转换模式。单次转换适用于只需要获取一次模拟信号值的情况;连续转换则适用于需要连续监测模拟信号变化的场景。
  • 多种触发方式:可以通过软件触发,也可以使用外部事件(如定时器、外部中断等)触发,使得 ADC 的转换可以与其他外设的操作紧密配合。
  • 可配置的采样时间:不同的模拟信号源可能需要不同的采样时间来确保准确的转换,STM32F103 的 ADC 允许根据实际情况灵活配置采样时间。
  • 三、ADC 内部结构剖析

    1. 输入通道
    2. 外部通道:STM32F103 的 ADC 具有多个外部输入通道(一般为 8 – 16 个),这些通道可以连接各种外部模拟信号源,如传感器输出的电压信号等。
    3. 内部通道:除了外部通道,还提供了内部通道,例如可以连接内部温度传感器,用于测量芯片内部的温度;还可以连接内部参考电压,以实现一些特殊的测量和校准功能。
    4. 转换通道组
    5. 规则通道组:这是 ADC 转换的主要通道组,可以配置多个通道按顺序进行转换。在连续转换模式下,规则通道组会按照设定的顺序依次对每个通道进行转换,并将结果存储在相应的数据寄存器中。
    6. 注入通道组:注入通道组相对独立,可以在规则通道组转换过程中插入转换操作。它通常用于需要紧急处理或具有更高优先级的模拟信号转换。

    四、ADC 转换过程详解

    1. 采样阶段:根据配置的采样时间,ADC 对输入通道上的模拟信号进行采样。采样时间的长短会影响转换的精度和速度,对于变化缓慢的模拟信号,可以使用较短的采样时间;对于快速变化的信号,则可能需要较长的采样时间以确保准确采样。
    2. 转换阶段:采样完成后,ADC 开始进行转换。在逐次逼近型转换过程中,ADC 通过不断调整内部的数字值,与输入的模拟信号进行比较,直到找到最接近的数字值。这个过程是自动进行的,转换时间取决于 ADC 的时钟频率和转换精度。
    3. 数据存储阶段:转换完成后,得到的数字值会根据配置的数据对齐方式(左对齐或右对齐)存储到相应的数据寄存器中。数据对齐方式的选择主要取决于后续的数据处理需求。

    五、编程示例与代码解释

    以下是一个简单的代码示例,用于在 STM32F103 上使用 ADC 进行单次转换:

    #include "stm32f10x.h"
    
    // 初始化 ADC
    void ADC_Init()
    {
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
    
        // 使能 ADC1 和 GPIOA 时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
        // 配置 PA0 为模拟输入
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        // ADC 初始化设置
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfConversion = 1;
        ADC_Init(ADC1, &ADC_InitStructure);
    
        // 使能 ADC1
        ADC_Cmd(ADC1, ENABLE);
    
        // 执行 ADC 校准
        ADC_ResetCalibration(ADC1);
        while(ADC_GetResetCalibrationStatus(ADC1));
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1));
    }
    
    // 获取 ADC 值
    uint16_t Get_ADC_Value()
    {
        // 启动 ADC 转换
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        // 等待转换完成
        while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        // 获取转换结果
        return ADC_GetConversionValue(ADC1);
    }

            在上述代码中,首先进行了 ADC 和相关 GPIO 的初始化,包括配置 GPIO 为模拟输入模式、设置 ADC 的工作模式、转换模式、触发方式、数据对齐方式等。然后,在获取 ADC 值的函数中,通过软件触发启动 ADC 转换,并等待转换完成后获取转换结果。

    六、总结

            STM32F103 的 ADC 外设是一个功能强大且灵活的模拟 – 数字转换工具。通过对其基本特征、内部结构、转换过程以及编程示例的介绍,我们可以看到它在嵌入式系统中处理模拟信号方面的重要性和实用性。在实际应用中,开发者可以根据具体的项目需求,充分利用 ADC 的各种特性,实现精确的模拟信号采集和处理。

    作者:jee10

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32的ADC介绍

    发表回复