RT1050的ADC

文章目录

  • 1 ADC介绍
  • 2 ADC框图
    • 2.1 外部输入通道
    • 2.2 输入电压范围
    • 2.3 触发源
    • 2.4 时钟源
    • 2.5 偏移矫正功能
      • 2.5.1 校准
  • 3 单通道中断采集实验
    • 3.1 ADC选项
    • 3.2 ADC配置
    • 3.3 配置用户通道和中断
    • 3.4 中断代码

1 ADC介绍

RT1052 有 2 个 ADC,每个 ADC 有 12 位、10 位、8 位可选,每个 ADC 有 16 个外部通道。

  • ADC具有最高 1MS/s 采样率
  • 支持单次或连续转换模式
  • 可配置采样时间和转换速度
  • 支持硬件求平均
  • 支持自动比较转换结果为小于、大于或等于某一设定的值,或者在设定的范围内、范围外。

2 ADC框图

RT1050的ADC_第1张图片

2.1 外部输入通道

外部模拟的电压信号通过 ADCx_INn(n 取 0 到 15) 进入 ADC 模块

  • RT1052 的每个 ADC 多达 16 外部输入个通道,这 16 个外部输入通道对应着不同的引脚
  • 以下是ADC1对应的引脚
    RT1050的ADC_第2张图片

2.2 输入电压范围

ADC 的输入电压范围为:0~3.3V。

  • 如果我们想让输入的电压范围变宽,可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V。

2.3 触发源

RT1052 支持软件触发和硬件触发

  • 当 ADCx_CFG 寄存器的 ADTRG 位(转换触发选择位)为 1时,ADC 为软件触发方式
    • 此时向 ADCx_HC0 寄存器 ADCH 位(外部输入通道选择位)写入需要转换的外部输入通道则开启一次转换。
      ADC 还支持外部事件触发转换,通过 XBAR(外设间交叉开关)几乎可选择任何其他外设的相
      关事件作为 ADC 的外部触发事件。

2.4 时钟源

时钟有四个,分别为 ADACK、IPG Clock、IPG Clock 除 2、ALTCKL。

  • IPG clock . 默认时钟源。
  • IPG clock 二分频, 如果 IPG 的时钟过高,使用 ADIV 寄存器最大可得到 16 分频的 IPG 时钟。
  • ADACK, 该时钟是 ADC 模块中的时钟源生成的,所以当单片机处于停止模式时该时钟仍然在运行。使用该时钟在停止模式下 ADC 可以进行转换。

寄存器 ADICLK[1:0]位决定 ADC 数字部分的时钟源。

2.5 偏移矫正功能

ADCx_OFS 用于在转换结果基础上增加或者减少固定的值。ADCx_OFS 寄存器 SIGN 位用于设置增加或者减少,OFS 位用于设置增加或者减少的值。

2.5.1 校准

在系统复位后启动 ADC 转换之前要进行校准。ADCx_CAL 寄存器 CAL_CODE 保存有硬件校准值,每次校准之后该值自动更新。

3 单通道中断采集实验

RT1052 的 ADC 不使用 ADC_ETC(外部触发控制器) 时非常简单,完成 ADC 配置之后将转换通道写入相应的寄存器即可自动转换,如果开启了中断,转换完成后触发中断。

3.1 ADC选项

#define ADC1_BASE                                (0x400C4000u)
/** Peripheral ADC1 base pointer */
#define ADC1                                     ((ADC_Type *)ADC1_BASE)
/** Peripheral ADC2 base address */
#define ADC2_BASE                                (0x400C8000u)
/** Peripheral ADC2 base pointer */
#define ADC2                                     ((ADC_Type *)ADC2_BASE)

3.2 ADC配置

typedef struct _adc_config {
2 bool enableOverWrite; /*!< 使能覆盖 . */
3 bool enableContinuousConversion;/*!< 启用连续转换模式 . */
4 bool enableHighSpeed; /*!< 使能高速模式 . */
5 bool enableLowPower; /*!< 使能低功耗模式 */
6 bool enableLongSample; /*!< 使能长采样 */
7 /*!< 使能异步时钟输出 . */
8 bool enableAsynchronousClockOutput;
9 /*!< 选择参考电压源 */
10 adc_reference_voltage_source_t referenceVoltageSource;
11 /*!< 长采样模式或短采样模式下的采样周期 */
12 adc_sample_period_mode_t samplePeriodMode;
13 adc_clock_source_t clockSource; /*!< 时钟源选择 . */
14 adc_clock_driver_t clockDriver; /*!< 选择时钟分频比 */
15 adc_resolution_t resolution; /*!< 选择 ADC 分辨率 */
16 } adc_config_t;

3.3 配置用户通道和中断

/* Configure the user channel and interrupt. */
adcChannelConfigStruct.channelNumber = DEMO_ADC_USER_CHANNEL;
adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
g_AdcInterruptCounter = 0U; /* Clear the interrupt counter. */

3.4 中断代码

#define DEMO_ADC_BASE ADC1
#define DEMO_ADC_IRQn ADC1_IRQn
#define DEMO_ADC_USER_CHANNEL 0U
#define DEMO_ADC_CHANNEL_GROUP 0U
#define EXAMPLE_ADC_IRQHandler ADC1_IRQHandler

EnableIRQ(DEMO_ADC_IRQn);

void EXAMPLE_ADC_IRQHandler(void)
{
    g_AdcConversionDoneFlag = true;
    /* Read conversion result to clear the conversion completed flag. */
    g_AdcConversionValue = ADC_GetChannelConversionValue(DEMO_ADC_BASE, DEMO_ADC_CHANNEL_GROUP);
    g_AdcInterruptCounter++;
    /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
      exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
    __DSB();
#endif
}

你可能感兴趣的:(NXP,嵌入式硬件)