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);
}
}
|