打印
[STM32C0]

【STM32C092RC 测评】ADC

[复制链接]
59|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 meiyaolei 于 2025-5-22 19:57 编辑

了解一下ADC先对ADC进行一定的认识分辨率,读出的数据的长度,如8位就是最大值为255的意思,即范围[0,255],12位就是最大值为4096,即范围[0,4096]
通道,ADC输入引脚,通常一个ADC控制器控制多个通道,如果需要多通道的话,就得进行每个通道扫描了。
ADC DMA功能,DMA是内存到内存或内存到存储的直接映射,数据不用经过单片机处理器而直接由硬件进行数据的传递。方便直接将读取的ADC值放到内存变量中。
ADC芯片通常有正参考电压和负参考电压,通常正参考电压连接到VCC,负参考电压连接到GND。


ADC 转换方式与工作模式
转换方式
单次转换:每次触发仅转换一个通道,需手动或通过中断/DMA重新启动。
连续转换:自动重复转换选定通道,适用于实时监测。
扫描模式:自动按顺序转换多个通道,适合多传感器系统。
工作模式
阻塞模式(查询模式):CPU轮询检查转换完成标志,效率较低但简单。
中断模式:转换完成后触发中断,CPU处理数据,平衡实时性与资源占用。
DMA模式:数据直接传输到内存,最节省CPU资源。

ADC 主要特性
高性能
可配置 12 位、10 位、8位或6 位分辨率
ADC 转换时间:12 位分辨率对应的转换时间为0.4us(2.5 Msps),若降低分辨率,可进一步缩短转换时间。
自校准
可编程采样时间
内置数据一致性,可确保数据对齐
支持 DMA低功耗
应用可降低 PCLK 频率从而以低功耗运行,同时仍可保持最优的 ADC 性能。例如,无论 PCLK 的频率如何,都会保持0.4us的转换时间
等待模式:防止 ADC 在低频PCLK应用中溢出
自动关闭模式:ADC 会自动断电,但正在进行转换时除外。这可大幅降低 ADC的功耗。
模拟输入通道
最多 19个外部模拟输入
1个用于内部温度传感器 (VSENSE)的通道
- 1个用于内部参考电压(VREFINT) 的通道
2 个用于监视内部电源(VDDAVSSA) 的通道可通过以下方式启动转换过程:
通过软件
通过极性可配置的硬件触发器(定时器事件或 GPIO 输入事件)转换模式
可转换单条通道,也可扫描一系列通道
单次模式会在每次触发时对选定的输入执行一次转换
连续模式可连续转换选定的输入
不连续模式
在采样结束、转换结束、序列转换结束以及发生模拟看门狗或溢出事件时产生中断
模拟看门狗
过采样器
16 位数据寄存器
过采样率可在 2x 到 256x之间进行调整可编程数据最多可移位 8位

ADC 输入范围:VSSA≤VIN≤VDDA

ADC框架:

ADC校准:

使用STM32CubeMX设置引脚:
使用ADC配置:

使用KEIL输出的ADC寄存器:
ADC输出结果:

代码
代码
  MX_GPIO_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */

  /* Initialize LED on board */
  BSP_LED_Init(LED1);

  /* Perform ADC calibration */
  if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK)
  {
    /* Calibration Error */
    Error_Handler();
  }


  while (1)
  {
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
      /* ADC conversion start error */
      Error_Handler();
    }

    /* Wait for ADC conversion completed */
    if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
    {

      Error_Handler();
    }

    uhADCxConvertedData_OVS_ratio16_shift4 = HAL_ADC_GetValue(&hadc1);
    HAL_ADC_Stop(&hadc1);
    hadc1.Init.OversamplingMode = ENABLE;
    hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
    hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
      Error_Handler();
    }

    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
      /* ADC conversion start error */
      Error_Handler();
    }

    /* Wait for ADC conversion completed */
    if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
    {
      /* End Of Conversion flag not set on time */
      Error_Handler();
    }

    uhADCxConvertedData_OVS_ratio16_shift0 = HAL_ADC_GetValue(&hadc1);


    HAL_ADC_Stop(&hadc1);
    hadc1.Init.OversamplingMode = DISABLE;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
      Error_Handler();
    }

    /* Start ADC group regular conversion */
    if (HAL_ADC_Start(&hadc1) != HAL_OK)
    {
      /* ADC conversion start error */
      Error_Handler();
    }

    /* Wait for ADC conversion completed */
    if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
    {
      /* End Of Conversion flag not set on time */
      Error_Handler();
    }

    uhADCxConvertedData_OVS_disabled = HAL_ADC_GetValue(&hadc1);


    HAL_ADC_Stop(&hadc1);
    hadc1.Init.OversamplingMode = ENABLE;
    hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16;
    hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
      Error_Handler();
    }
总结:
STM32C092RC ADC 特性详解
高性能与低功耗
分辨率与速度:12位分辨率下转换时间为0.4μs(2.5 Msps),降低分辨率可缩短转换时间。
低功耗设计:
等待模式:防止低频PCLK下的溢出。
自动关闭模式:无转换时自动断电,降低功耗。
高级功能
自校准:提升ADC精度,建议在初始化时执行。
过采样器:
过采样率范围:2x至256x,可提升信噪比(SNR)。
数据移位:右移8位可优化结果分辨率。
模拟看门狗:监测输入电压是否超出阈值,触发中断。
通道配置
外部通道:最多19个,支持多传感器接入。
内部通道:
温度传感器(VSENSE):用于系统温度监测。
参考电压(VREFINT):用于校准。
电源监视(VDDAVSSA):检测电源电压异常。


使用特权

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

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

227

主题

771

帖子

6

粉丝