ADC学习

ADC:模数转换器(Analog-to-Digital Converter),将外部模拟信号转换成单片机能够处理的数字信号,过程包括采样、保持、量化、编码。

原理参考:https://blog.csdn.net/gtz736781333/article/details/116045697

STM32的ADC实现:(1条消息) STM32---ADC模数转换详解_阿槐123456的博客-CSDN博客_stm32ad转换模块

ADC分为三种模式:单次模式、连续模式、扫描模式;

 

1、单次模式:初始化-单次模式;ADC只执行一次转换

 选择时钟源:RCC_ADC_CLK_SOURCE_RCO48M

开启时钟:A、B、C、D、ADC

void adc_single_mode_test(void)
{
    uint32_t i;
    gpio_t *gpiox;
    uint32_t pin;
    float gain_value;
    float dco_value;

    adc_get_calibration_value(false, &gain_value, &dco_value);

    gpiox = GPIOA;
    pin = GPIO_PIN_8;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);
    pin = GPIO_PIN_11;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);

    adc_init();

    adc_config_clock_division(20); //sample frequence 150K

    adc_config_sample_sequence(0, 1);
    adc_config_sample_sequence(1, 2);
    adc_config_sample_sequence(2, 2);

    adc_config_conv_mode(ADC_CONV_MODE_SINGLE);

    adc_enable(true);

    adc_start(true);

    for (i = 0; i < ADC_DATA_NUM; i++)
    {
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_1[i] = adc_get_data();
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_2[i] = adc_get_data();
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        (void)adc_get_data();
        adc_start(true);
    }

    adc_start(false);
    adc_enable(false);

    for (i = 0; i < ADC_DATA_NUM; i++)
    {//calibration sample value
        calibrated_sample_1[i] = ((1.2/4096) * adc_data_1[i] - dco_value) / gain_value;
        calibrated_sample_2[i] = ((1.2/4096) * adc_data_2[i] - dco_value) / gain_value;
    }
}

2、连续模式:当前面ADC转换一结束马上就启动另一次转换

void adc_continue_mode_test(void)
{
    uint32_t i;
    gpio_t *gpiox;
    uint32_t pin;
    float gain_value;
    float dco_value;

    adc_get_calibration_value(false, &gain_value, &dco_value);

    gpiox = GPIOA;
    pin = GPIO_PIN_8;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);
    pin = GPIO_PIN_11;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);

    adc_init();

    adc_config_clock_division(20); //sample frequence 150K

    adc_config_sample_sequence(0, 1);
    adc_config_sample_sequence(1, 2);

    adc_config_conv_mode(ADC_CONV_MODE_CONTINUE);

    adc_enable(true);

    adc_start(true);
    for (i = 0; i < ADC_DATA_NUM; i++)
    {
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_1[i] = adc_get_data();
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_2[i] = adc_get_data();
    }

    adc_start(false);
    adc_enable(false);

    for (i = 0; i < ADC_DATA_NUM; i++)
    {//calibration sample value
        calibrated_sample_1[i] = ((1.2/4096) * adc_data_1[i] - dco_value) / gain_value;
        calibrated_sample_2[i] = ((1.2/4096) * adc_data_2[i] - dco_value) / gain_value;
    }
}

3、不知道是不是扫描模式,名字叫不连续模式

void adc_discontinuous_mode_test(void)
{
    uint32_t i;
    gpio_t *gpiox;
    uint32_t pin;
    float gain_value;
    float dco_value;

    adc_get_calibration_value(false, &gain_value, &dco_value);

    gpiox = GPIOA;
    pin = GPIO_PIN_8;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);
    pin = GPIO_PIN_11;
    gpio_init(gpiox, pin, GPIO_MODE_ANALOG);

    adc_init();

    adc_config_clock_division(20); //sample frequence 150K

    adc_config_sample_sequence(0, 1);
    adc_config_sample_sequence(1, 2);

    adc_config_conv_mode(ADC_CONV_MODE_DISCONTINUE);

    adc_enable(true);

    adc_start(true);

    while(!adc_get_interrupt_status(ADC_ISR_EOC));
    (void)adc_get_data();

    for (i = 0; i < ADC_DATA_NUM; i++)
    {
        adc_start(true);
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_1[i] = adc_get_data();

        adc_start(true);
        while(!adc_get_interrupt_status(ADC_ISR_EOC));
        adc_data_2[i] = adc_get_data();
    }

    adc_start(false);
    adc_enable(false);

    for (i = 0; i < ADC_DATA_NUM; i++)
    {//calibration sample value
        calibrated_sample_1[i] = ((1.2/4096) * adc_data_1[i] - dco_value) / gain_value;
        calibrated_sample_2[i] = ((1.2/4096) * adc_data_2[i] - dco_value) / gain_value;
    }
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP430是一款微控制器,ADC12是其内部的12位模数转换器模块,用于将模拟信号转换为数字信号,方便后续处理。以下是ADC12的简单介绍: 1. ADC12有8个输入通道,可以测量多种模拟信号,包括电压、电流、温度等。 2. ADC12的分辨率为12位,即可以将模拟量转换为0~4095的数字信号。 3. ADC12可以采用单次转换或自动循环转换模式,以适应不同的应用场景。 4. ADC12可以通过多种采样时钟源进行采样,以实现不同的采样速率和精度。 5. ADC12有多种触发方式,包括软件触发、外部触发和比较器触发等。 以下是一个简单的ADC12的使用示例: ```c #include <msp430.h> void ADC12_Init(void) { ADC12CTL0 = ADC12SHT02 + ADC12ON; // 采样保持时间为2个ADC时钟周期,ADC12模块开启 ADC12CTL1 = ADC12SHP; // 采样定时由ADC12内部高速时钟源控制 ADC12CTL2 |= ADC12RES_2; // 12位分辨率 ADC12MCTL0 |= ADC12INCH_0; // A0通道 ADC12IE |= ADC12IE0; // 使能ADC12中断 } void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 ADC12_Init(); // 初始化ADC12 while (1) { ADC12CTL0 |= ADC12ENC + ADC12SC; // 使能ADC12并开始转换 __bis_SR_register(LPM0_bits + GIE); // 进入低功耗模式,等待ADC12中断 } } #pragma vector = ADC12_VECTOR // ADC12中断服务函数 __interrupt void ADC12_ISR(void) { __bic_SR_register_on_exit(LPM0_bits); // 退出低功耗模式 int adc_value = ADC12MEM0; // 读取转换结果 } ``` 在这个示例中,我们首先通过ADC12_Init()函数初始化了ADC12模块,然后在主循环中不断启动ADC12转换,并进入低功耗模式等待ADC12中断。当ADC12转换完成后,会触发ADC12中断服务函数ADC12_ISR,我们在其中读取转换结果并退出低功耗模式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值