单片机学习系列(进阶篇):模数转换(ADC)与数模转换(DAC)原理详解及应用实战

单片机学习系列(6):模数转换(ADC)与数模转换(DAC)原理与应用

一、模数转换(ADC)概述

  • 作用与意义:在实际应用中,单片机常常需要处理各种模拟信号,比如温度传感器输出的随温度变化的电压信号、光线传感器输出的与光照强度相关的电流信号等。而单片机只能识别和处理数字信号,ADC 就起到了将这些模拟信号转换为数字信号的关键作用,使得单片机可以对外部的模拟世界进行感知和分析,进而做出相应的控制决策。
  • 二、ADC 工作原理

  • 采样:首先对模拟信号进行采样,即在一定的时间间隔内获取模拟信号的瞬时值。这个采样频率需要满足奈奎斯特采样定理,即采样频率至少是模拟信号最高频率成分的 2 倍,这样才能保证采样后的数据可以完整地还原出原始模拟信号(在理想情况下)。例如,对于一个最高频率为 1kHz 的模拟信号,采样频率应不低于 2kHz。
  • 量化:采样得到的模拟值是连续的,而数字信号是离散的,量化就是将采样得到的连续模拟值按照一定的规则划分成离散的等级,每个等级用一个特定的数字代码来表示。比如采用 8 位 ADC,就可以将模拟信号量化为 256(2⁸)个等级。
  • 编码:把量化后的结果用二进制代码等形式进行编码,最终得到可以被单片机识别和处理的数字信号。
  • 三、ADC 相关参数

    分辨率

  • 定义:指 ADC 能够分辨的最小模拟输入量变化,通常用数字输出的位数来表示。例如 10 位 ADC 的分辨率为 1/1024(因为 2¹⁰ = 1024),意味着它可以把模拟输入范围等分成 1024 份来进行区分,位数越高,分辨率越高,对模拟信号的分辨能力就越强。
  • 应用影响:在测量精度要求较高的场景中,如高精度的电子秤,需要测量微小的重量变化对应的微弱模拟电压变化,就需要选择高分辨率的 ADC 来保证测量的准确性。
  • 转换时间

  • 定义:从启动 ADC 转换开始到得到稳定的数字输出结果所需要的时间。不同类型、不同速度等级的 ADC 其转换时间不同,快速的 ADC 转换时间可以达到微秒甚至纳秒级,而一些低速 ADC 可能需要几十毫秒甚至更长时间。
  • 应用考虑:在对实时性要求较高的系统中,比如实时监测电机转速变化对应的模拟信号,就需要选用转换时间短的 ADC,以确保能及时获取最新的信号数据进行相应控制。
  • 参考电压

  • 定义:ADC 进行量化时的基准电压,它决定了模拟输入信号的量程范围。比如参考电压为 5V 时,对于 8 位 ADC,其能转换的模拟输入电压范围通常就是 0 – 5V,输入的模拟信号超出这个范围可能导致转换结果不准确或者损坏 ADC 芯片。
  • 应用要点:在连接外部模拟信号源时,要确保信号的电压范围在 ADC 的参考电压范围内,并且根据实际需求合理设置参考电压,以充分利用 ADC 的分辨率和量程。
  • 四、单片机中 ADC 的配置与应用(以 STM32 单片机为例)

    通道选择

  • 原理:STM32 单片机通常有多个 ADC 通道,这些通道可以连接不同的外部模拟信号输入引脚。比如 ADC1 的通道 0 可以连接一个温度传感器的输出引脚,通道 1 可以连接光线传感器引脚等,通过配置相应的寄存器来选择要进行转换的通道。
  • 代码示例(简单示意)
  • // 使能 ADC1 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    
    // 配置 ADC1 的通道 0 为模拟输入通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
    

    转换模式设置

  • 连续转换与单次转换:可以设置为连续转换模式,即一次转换完成后自动开始下一次转换,适用于需要持续监测模拟信号的情况,如实时环境监测系统;也可设置为单次转换模式,每次转换需要手动启动,常用于按特定时间间隔或者事件触发进行转换的场景,比如定时采集电池电量对应的模拟电压信号。
  • 代码示例(设置连续转换模式)
  • ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  // 设置为连续转换模式
    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_SoftwareStartConvCmd(ADC1, ENABLE);
    
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));  // 等待转换完成标志位
    uint16_t adcResult = ADC_GetConversionValue(ADC1);  // 获取转换结果
    

    五、数模转换(DAC)概述

  • 作用与意义:与 ADC 相反,DAC 是将单片机输出的数字信号转换为模拟信号,常用于需要输出模拟量去控制外部设备的场景,比如通过单片机输出的数字信号经 DAC 转换为模拟电压信号,去控制音频放大器的音量大小、电机的转速调节等。
  • 六、DAC 工作原理

  • 原理简述:DAC 内部通常基于电阻网络(如 R-2R 梯形电阻网络等)或者其他数字模拟转换技术,根据输入的数字代码,通过相应的电路将其转换为对应的模拟电压或电流输出。例如,对于一个 8 位 DAC,当输入的数字代码为全 0 时,输出模拟电压为 0V(假设参考电压合适),当输入为全 1 时,输出模拟电压达到最大值(由参考电压等因素决定),中间的不同数字代码对应不同比例的模拟电压输出。
  • 七、单片机中 DAC 的配置与应用(以 STM32 单片机为例)

    通道与输出模式配置

  • 通道选择:STM32 单片机同样有多个 DAC 通道可供选择,不同通道可以连接到不同的外部引脚输出模拟信号,通过配置相关寄存器来确定使用的通道以及对应的引脚。
  • 输出模式:可以设置为缓冲模式或者直通模式等。缓冲模式下,输出信号经过一个缓冲放大器,能增强驱动能力和稳定性;直通模式则信号直接输出,具有更快的响应速度,但驱动能力相对较弱,需要根据实际连接的外部设备负载特性来选择合适的模式。
  • 代码示例(简单示意)
  • // 使能 DAC 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    
    // 配置 DAC 通道 1,设置为缓冲模式
    DAC_InitTypeDef DAC_InitStructure;
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = 0;
    DAC_InitStructure.DAC_OutputBuffer = ENABLE;  // 设置为缓冲模式
    DAC_Init(DAC1, &DAC_InitStructure);
    
    // 使能 DAC 通道 1
    DAC_Cmd(DAC1, DAC_Channel_1, ENABLE);
    

    设置输出值

  • 方式:通过向相应的寄存器写入数字值来控制 DAC 的模拟输出量。可以直接给定一个固定的数字值来实现固定的模拟输出,也可以根据需要动态地改变写入的数字值,从而实现模拟信号的动态变化,比如输出一个周期性变化的模拟波形(如正弦波、三角波等)。
  • 代码示例(输出固定电压值,假设参考电压为 3.3V,8 位 DAC)
  • uint8_t digitalValue = 128;  // 对应中间电压值(8 位范围 0 - 255)
    DAC_SetChannel1Data(DAC1, DAC_Align_8b_R, digitalValue);
    

    八、常见问题及解决办法

  • ADC 转换结果不准确问题:首先检查参考电压是否稳定且设置正确,不稳定的参考电压会导致转换结果偏差较大。其次,查看采样时间设置是否合理,采样时间过短可能导致采样值不准确,尤其是对于一些变化较慢的模拟信号,需要适当延长采样时间。另外,还要留意模拟信号输入线路是否存在干扰,如有干扰可采取增加滤波电容等抗干扰措施。
  • DAC 输出模拟信号异常问题:确认输出模式选择是否适合外部设备负载,比如驱动大负载时若选择直通模式可能导致输出信号失真。同时,检查参考电压以及数字输入值的范围是否符合要求,超出范围会造成输出异常,还要排查硬件连接是否良好,确保模拟信号能正常输出到外部设备。
  • 九、下期预告

    在“单片机学习系列(7)”中,将会深入讲解单片机的电源管理与低功耗模式相关知识,包括不同低功耗模式的特点、如何进入和退出这些模式以及在实际项目中如何通过合理的电源管理来延长设备的续航时间、降低功耗等内容,欢迎大家继续关注哦。

    希望大家通过学习 ADC 和 DAC 的知识,能更好地处理单片机系统中的模拟信号与数字信号转换问题,有疑问可随时在评论区交流呀!

    作者:DoYangTan

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机学习系列(进阶篇):模数转换(ADC)与数模转换(DAC)原理详解及应用实战

    发表回复