MM32F5330内置 2 个 12 位模拟/数字转换器(ADC),单 ADC 最高转换率可达 3MSPS。 ADC1 有最多 14 个外部通道,ADC2 有最多 14 个外部通道,其中 12 个 ADC1 和 ADC2 的通道在引脚排布上是复用的,因此共有 16 个可用的 ADC 外部输入引脚。对于这些复用引脚,可以将 ADC1 和 ADC2 并行使用来获得最高 6MSPS 的转换率。ADC2 配有 2 个内部通道,分别连接温度传感器和电压传感器。ADC 支持单次单周期和连续扫描转换模式。在扫描模式下,自动进行已选定的一组模拟输入上的采集值转换。ADC 可以使用 DMA 操作。 ADC 支持硬件过采样,过采样率从 2 次到 256 次可配。可过采样到 16 位分辨率。 模拟看门狗功能允许非常精准地监视一路或所有选中的通道,当被监视的信号超出预置的阈值时,将产生中断。由通用定时器(TIMx)和高级控制定时器产生的事件,可以分别内部级联到 ADC 的触发,应用程序能使 ADC 转换与时钟同步。
一、MM32F5330 ADC初始化ADC的初始化通常包括配置ADC的模式、分辨率、分频系数、采样时间等参数,并开启ADC的时钟和相关的GPIO时钟,设置GPIO为模拟输入模式。以下是一个ADC初始化的示例代码 - void ADC_Configure(void) {
- ADC_InitTypeDef ADC_InitStruct;
- GPIO_InitTypeDef GPIO_InitStruct;
-
- // 使能ADC时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
-
- // ADC校准
- ADC_CalibrationConfig(ADC1, 0x1FE);
-
- // 初始化ADC结构体
- ADC_StructInit(&ADC_InitStruct);
- ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; // 12位分辨率
- ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_16; // 分频系数16
- ADC_InitStruct.ADC_Mode = ADC_Mode_Scan; // 扫描模式
- ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
- ADC_Init(ADC1, &ADC_InitStruct);
-
- // 配置ADC采样时间
- ADC_SampleTimeConfig(ADC1, ADC_Channel_1, ADC_SampleTime_240_5);
- ADC_SampleTimeConfig(ADC1, ADC_Channel_4, ADC_SampleTime_240_5);
- ADC_SampleTimeConfig(ADC1, ADC_Channel_5, ADC_SampleTime_240_5);
-
- // 使能ADC通道
- ADC_ChannelCmd(ADC1, ADC_Channel_1, ENABLE);
- ADC_ChannelCmd(ADC1, ADC_Channel_4, ENABLE);
- ADC_ChannelCmd(ADC1, ADC_Channel_5, ENABLE);
-
- // 使能GPIOA时钟,配置为模拟输入模式
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
- GPIO_StructInit(&GPIO_InitStruct);
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- // 使能ADC
- ADC_Cmd(ADC1, ENABLE);
- }
二、ADC通道值获取初始化完成后,可以编写函数来获取ADC通道的值。这个函数通常包括启动ADC转换、等待转换完成和读取转换结果等步骤。一个ADC通道值获取的函数: - void ADC_DifferentialConversion_Sample(void)
- {
- uint16_t ADC_Value = 0, D_Value = 0;
- printf("\r\nTest %s", __FUNCTION__);
- ADC_Configure();
- while (1)
- {
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while (RESET == ADC_GetFlagStatus(ADC1, ADC_IT_EOS))
- {
- }
- ADC_ClearFlag(ADC1, ADC_IT_EOS);
- ADC_Value = ADC_GetChannelConvertedValue(ADC1, ADC_Channel_4);
- if (ADC_Value > 2048)
- {
- D_Value = ADC_Value - 2048;
- }
- else
- {
- D_Value = 2048 - ADC_Value;
- }
- printf("\r\nDifferential Conversion : %d, \tDelta Voltage : %0.2f", ADC_Value, (float)D_Value * (float)3.3 / (float)2048);
- PLATFORM_DelayMS(500);
- }
- }
|