打印
[MM32生态]

【灵动微电子MM32F5330测评】基础测评之ADC

[复制链接]
842|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  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);
    }
}




使用特权

评论回复
沙发
guijial511| | 2024-7-23 19:16 | 只看该作者
有三个ADC就好了,可以实现三相交流信号的采样。

使用特权

评论回复
板凳
shenxiaolin| | 2024-7-29 21:07 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

83

主题

155

帖子

3

粉丝