wenbo2005.online

学习记录 / 基础 TxT 篇

ADC 模数转换

基础 TxT 篇2025-05-03

ADC转换模式:

单次转换模式: 每次进行一次ADC转换后,ADC会自动停止,并将结果存储在ADC数据寄存器中。

重复单次转换模式: 当ADC完成一次转换后,它会自动启动另一次转换,持续的进行转换,直到外部触发或者软件触发的方式停止连续转换。

多通道顺序单次转换模式: 用于对多个输入通道进行依次转换。在该模式下,ADC会根据配置的通道采集顺序,对多个通道进行单次采样并转换。

多通道顺序重复转换模式: 用于对多个输入通道进行依次重复转换。在该模式下,ADC会根据配置的通道采集顺序,对多个通道进行重复采样并转换。

ADC基本参数:

分辨率: 表示ADC转换器的输出精度,通常以位数(bit)表示,MSPM0L1306支持8、10、12位的分辨率,位数越高,精度越高。

采样率: 表示ADC对模拟输入信号进行采样的速率,通常以每秒采样次数(SPS)表示,也称为转换速率,表示ADC能够进行多少次模拟到数字的转换。MSPM0G3507的SPS为4Msps。

电压基准: ADC的电压基准是用于与模拟输入信号进行比较,从而实现模拟信号到数字信号的转换的一个参考电压。

而MSPM0G3507可以支持软件选择三种基准:

(1)MCU 电源电压 (VDD) (默认)

(2)通过 VREF+和 VREF- 引脚为 ADC 提供外部基准

(3)1.4V 和 2.5V 的可配置内部专用 ADC 基准电压 (VREF)

采样范围: 指ADC可以采集到的模拟输入信号的电压范围,范围:VREF- ≤ ADC ≤ VREF+

其中VREF- 为设置的电压基准负,通常为0V。VREF+ 为电压基准正,根据软件的配置确定范围。

一,图像配置界面(ADC相关)

ADC12 Profiles:自定义模板

ADC12 Clock Source:系统时钟

Sample Cloack Divider:8分频(保证采样率为4M)

Conversion Mode:Single (单通道)

Conversion Starting Address :数据存放地址0

Sampling Mode:采样模式手动(手动开启采样)

Trigger Source:Software (软件)

Conversion Data Format :右对齐

Active Memory Control Blocks :内存0(与上面设置一致)

//内存0配置:

Input Channel :通道0

Device Pin Name :引脚

Reference Voltage:参考电压(默认VDD)

Conversion Resolution :12-bits(分辨率)

Power Down Mode:手动

PinMux:

ADC12 Peripheral         ADC0
ADC12 Channel 0 Pin     PA27/31

二,单通道采集代码(内存0):

void adc_getvalue(uint16_t *data)
{
    //使能ADC转换
    DL_ADC12_enableConversions(ADC12_0_INST);
    //软件触发ADC开始转换
    DL_ADC12_startConversion(ADC12_0_INST);
    //如果当前状态 不是 空闲状态
    while (DL_ADC12_getStatus(ADC12_0_INST) != DL_ADC12_STATUS_CONVERSION_IDLE );
    //清除触发转换状态
    DL_ADC12_stopConversion(ADC12_0_INST);
    //失能ADC转换
    DL_ADC12_disableConversions(ADC12_0_INST);
    //获取数据
    data[0] = DL_ADC12_getMemResult(ADC12_0_INST, ADC12_0_ADCMEM_0);
    //data[1] = DL_ADC12_getMemResult(ADC12_0_INST, ADC12_0_ADCMEM_1);
}

uint32_t adc_time=0;
void ADC_Proc()
{
    if(uwTick - adc_time<100) return;
    uwTick = adc_time;

    char buff[128];

    adc_getvalue(&adc_value);
    snprintf(buff, 128, "ADC:%d\r\n",adc_value);
    UART_Tx_Display(buff,strlen(buff));
}