RT1052的ADC单通道采集

开发平台

  • Board:野火RT1052-MINI
  • IDE:Keil 5.28

关于RT1052上的ADC

从官方手册来看,
在这里插入图片描述
RT1052上的ADC性能并不小。

ADC的初始化代码:

bool Adc_Init(void)
{
    gpio_pin_config_t Config;
    adc_config_t config;
    adc_channel_config_t ADC_CH_config;

    /*
     * GPIO 配置为输入模式
     * 不使用中断
    */
    Config.direction = kGPIO_DigitalInput;
    Config.interruptMode = kGPIO_NoIntmode;
    GPIO_PinInit(ADC_GPIO, ADC_PIN, &Config);

    /*
     * GPIO 复用配置
     * PAD配置
    */
    IOMUXC_SetPinMux(ADC_MUX,0);
    IOMUXC_SetPinConfig(ADC_MUX,ADC_PAD_CONFIG_DATA);
    
    /*
     * 获取ADC默认配置
     * 初始化ADC
     * 失能硬件触发模式
     * 配置硬件平均
    */
    ADC_GetDefaultConfig(&config);
    config.enableContinuousConversion = true;
    ADC_Init(ADCx, &config);
    ADC_EnableHardwareTrigger(ADCx,false);
    ADC_SetHardwareAverageConfig(ADCx, kADC_HardwareAverageCount32);

    /*
     * ADC通道配置
     * 使能中断完成转化
     * 初始化通道配置
    */
    ADC_CH_config.channelNumber = ADC_Channel;
    ADC_CH_config.enableInterruptOnConversionCompleted = true;
    ADC_SetChannelConfig(ADCx,ADC_GROUP,&ADC_CH_config);

    if(ADC_DoAutoCalibration(ADCx)==kStatus_Success)
    {
        PRINTF("ADC校正完成\n");
    }
    else
    {
        PRINTF("ADC校正失败\n");
    }

    return  true;
}

值得注意的是,如果将ADC_EnableHardwareTrigger(ADCx,false);
改为开启,那ADC的值会一直停留不变,反正我也很郁闷,搞了半天才知道这个问题。因为之前都是用中断的方式采集的,但是我之前开了也能正常采集。

ADC获取值:

uint32_t ADC_Get(void)
{
    adc_channel_config_t adcChannelConfigStruct;
    adcChannelConfigStruct.channelNumber = ADC_Channel;
    adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;

    ADC_SetChannelConfig(ADCx, ADC_GROUP, &adcChannelConfigStruct);
    
    return ADC_GetChannelConversionValue(ADCx,ADC_Channel);
}

如果没有开启连续采样模式,就必须每次都执行一遍ADC_SetChannelConfig()这个函数,开启之后可以不执行直接获取。

ADC的转换公式:

X/3.3 = data/2^N

X是所要求的电压值。
data是ADC得到的原始数据。
N是ADC的位数,8位、10位、12位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章