硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4318|回复: 8
收起左侧

STM32F334 ADC 采样

[复制链接]

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2020-3-6 16:41:36 | 显示全部楼层 |阅读模式
一、遇到的问题:
1、输入电压小于52mv时,ADC采样值为0
2、输入电压高于52mv时,采样结果和输入呈线性关系。

二、环境:

1、代码使用 cubemx自动生成HAL库版本的代码。
2、配置ADC+DMA 循环采样的模式。
3、编译器 Keil 5.25.

三、初始化代码
static void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_MultiModeTypeDef multimode = {0};
  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 2;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  hadc1.Init.LowPowerAutoWait = ENABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.SamplingTime = ADC_SAMPLETIME_601CYCLES_5;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-3-7 09:06:41 | 显示全部楼层
单纯看你的代码,没啥问题。

用示波器测试你的稳压基准,看看是不是峰峰值比大。

另外就是直接测试板子上的GND是否正常
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2020-3-7 16:50:24 | 显示全部楼层
eric2013 发表于 2020-3-7 09:06
单纯看你的代码,没啥问题。

用示波器测试你的稳压基准,看看是不是峰峰值比大。

您好 eric
1、测试稳压基准,就是测试单片机VDDA到GND的电压,看看他的峰峰值是吧。
2、GND是否正常怎么测试?你是不是觉得单片机的GND被抬高了?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-3-7 18:33:04 | 显示全部楼层
风动影动 发表于 2020-3-7 16:50
您好 eric
1、测试稳压基准,就是测试单片机VDDA到GND的电压,看看他的峰峰值是吧。
2、GND是否正常怎 ...

仅测基准电压就行。

测基准的时候,示波器有个峰峰值展示,也就是最大值和最小值的差值
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2020-3-7 20:20:27 | 显示全部楼层
eric2013 发表于 2020-3-7 18:33
仅测基准电压就行。

测基准的时候,示波器有个峰峰值展示,也就是最大值和最小值的差值

我的板子是直接用仿真器供电,插在笔记本电脑上的,应该不会有什么电源影响吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-3-8 09:06:12 | 显示全部楼层
风动影动 发表于 2020-3-7 20:20
我的板子是直接用仿真器供电,插在笔记本电脑上的,应该不会有什么电源影响吧

仿真器容易供电不足,一般只有20mA左右。

回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2020-3-10 13:52:50 | 显示全部楼层
我测试了一下VDDA的纹波电压,34mv。这个值不大吧。



回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2020-3-10 14:07:33 | 显示全部楼层
下面分别是示波器测试VDDA和ADC引脚的截图:




回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2020-3-10 14:17:36 | 显示全部楼层
示波器测试的波形

TEK00002.PNG
TEK00001.PNG
TEK00000.PNG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 12:57 , Processed in 0.045228 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表