[MM32生态] 【灵动微电子MM32F5330测评】基础测评之ADC

[复制链接]
1426|2
 楼主| abner_ma 发表于 2024-7-22 22:19 | 显示全部楼层 |阅读模式
  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 转换与时钟同步。
A1.png
A2.png
一、MM32F5330 ADC初始化
ADC的初始化通常包括配置ADC的模式、分辨率、分频系数、采样时间等参数,并开启ADC的时钟和相关的GPIO时钟,设置GPIO为模拟输入模式。以下是一个ADC初始化的示例代码
  1. void ADC_Configure(void) {  
  2.     ADC_InitTypeDef ADC_InitStruct;  
  3.     GPIO_InitTypeDef GPIO_InitStruct;  
  4.   
  5.     // 使能ADC时钟  
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  
  7.   
  8.     // ADC校准  
  9.     ADC_CalibrationConfig(ADC1, 0x1FE);  
  10.   
  11.     // 初始化ADC结构体  
  12.     ADC_StructInit(&ADC_InitStruct);  
  13.     ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; // 12位分辨率  
  14.     ADC_InitStruct.ADC_Prescaler = ADC_Prescaler_16;     // 分频系数16  
  15.     ADC_InitStruct.ADC_Mode = ADC_Mode_Scan;             // 扫描模式  
  16.     ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;  // 数据右对齐  
  17.     ADC_Init(ADC1, &ADC_InitStruct);  
  18.   
  19.     // 配置ADC采样时间  
  20.     ADC_SampleTimeConfig(ADC1, ADC_Channel_1, ADC_SampleTime_240_5);  
  21.     ADC_SampleTimeConfig(ADC1, ADC_Channel_4, ADC_SampleTime_240_5);  
  22.     ADC_SampleTimeConfig(ADC1, ADC_Channel_5, ADC_SampleTime_240_5);  
  23.   
  24.     // 使能ADC通道  
  25.     ADC_ChannelCmd(ADC1, ADC_Channel_1, ENABLE);  
  26.     ADC_ChannelCmd(ADC1, ADC_Channel_4, ENABLE);  
  27.     ADC_ChannelCmd(ADC1, ADC_Channel_5, ENABLE);  
  28.   
  29.     // 使能GPIOA时钟,配置为模拟输入模式  
  30.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  
  31.     GPIO_StructInit(&GPIO_InitStruct);  
  32.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;  
  33.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;  
  34.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;  
  35.     GPIO_Init(GPIOA, &GPIO_InitStruct);  
  36.   
  37.     // 使能ADC  
  38.     ADC_Cmd(ADC1, ENABLE);  
  39. }
二、ADC通道值获取
初始化完成后,可以编写函数来获取ADC通道的值。这个函数通常包括启动ADC转换、等待转换完成和读取转换结果等步骤。一个ADC通道值获取的函数:
  1. void ADC_DifferentialConversion_Sample(void)
  2. {
  3.     uint16_t ADC_Value = 0, D_Value = 0;

  4.     printf("\r\nTest %s", __FUNCTION__);

  5.     ADC_Configure();

  6.     while (1)
  7.     {
  8.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  9.         while (RESET == ADC_GetFlagStatus(ADC1, ADC_IT_EOS))
  10.         {
  11.         }

  12.         ADC_ClearFlag(ADC1, ADC_IT_EOS);

  13.         ADC_Value = ADC_GetChannelConvertedValue(ADC1, ADC_Channel_4);

  14.         if (ADC_Value > 2048)
  15.         {
  16.             D_Value = ADC_Value - 2048;
  17.         }
  18.         else
  19.         {
  20.             D_Value = 2048 - ADC_Value;
  21.         }

  22.         printf("\r\nDifferential Conversion : %d, \tDelta Voltage : %0.2f", ADC_Value, (float)D_Value * (float)3.3 / (float)2048);

  23.         PLATFORM_DelayMS(500);
  24.     }
  25. }




guijial511 发表于 2024-7-23 19:16 来自手机 | 显示全部楼层
有三个ADC就好了,可以实现三相交流信号的采样。
shenxiaolin 发表于 2024-7-29 21:07 | 显示全部楼层
感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

104

主题

191

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部