文章目录
- 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框图
2.1 外部输入通道
外部模拟的电压信号通过 ADCx_INn(n 取 0 到 15) 进入 ADC 模块
- RT1052 的每个 ADC 多达 16 外部输入个通道,这 16 个外部输入通道对应着不同的引脚
- 以下是ADC1对应的引脚
2.2 输入电压范围
ADC 的输入电压范围为:0~3.3V。
- 如果我们想让输入的电压范围变宽,可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V。
2.3 触发源
RT1052 支持软件触发和硬件触发
- 当 ADCx_CFG 寄存器的 ADTRG 位(转换触发选择位)为 1时,ADC 为软件触发方式
- 此时向 ADCx_HC0 寄存器 ADCH 位(外部输入通道选择位)写入需要转换的外部输入通道则开启一次转换。
ADC 还支持外部事件触发转换,通过 XBAR(外设间交叉开关)几乎可选择任何其他外设的相
关事件作为 ADC 的外部触发事件。
- 此时向 ADCx_HC0 寄存器 ADCH 位(外部输入通道选择位)写入需要转换的外部输入通道则开启一次转换。
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_IRQHandlerEnableIRQ(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 overlappingexception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)__DSB();
#endif
}