[应用相关] stm32 adc 测量偏差的简单解决方案 hal库

[复制链接]
793|19
 楼主| t60yz 发表于 2022-4-30 20:03 | 显示全部楼层 |阅读模式
最近用stm32 去检测电压发现会偏差70mv左右,而且上下波动20mv左右
于是找到了一些解决方法
1.最重要的一步
在初始化adc之后,进行校准
  1. MX_ADC1_Init();
  2. HAL_Delay(200);
  3. HAL_ADCEx_Calibration_Start(&hadc1);




 楼主| t60yz 发表于 2022-4-30 20:05 | 显示全部楼层
关于延时本人经测试,并没有太大差别,但又帖子说明,可以减小误差,自行测试。
 楼主| t60yz 发表于 2022-4-30 20:05 | 显示全部楼层
2.延长采样时间
(1)在配置中修改
76760626d261b695ca.png
 楼主| t60yz 发表于 2022-4-30 20:06 | 显示全部楼层
(2)在代码中修改
找到下面代码中simplingtime,右键查找ADC_SAMPLETIME_71CYCLES_5的定义,选择你所需要的周期
 楼主| t60yz 发表于 2022-4-30 20:09 | 显示全部楼层
  1. //void MX_ADC1_Init(void)
  2. //{
  3. //  ADC_ChannelConfTypeDef sConfig = {0};

  4.     /** Common config
  5.     */
  6.   //  hadc1.Instance = ADC1;
  7.   //  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  8.   //  hadc1.Init.ContinuousConvMode = DISABLE;
  9.   //  hadc1.Init.DiscontinuousConvMode = DISABLE;
  10.   //  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  11.   //  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  12.   //  hadc1.Init.NbrOfConversion = 1;
  13.   //  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  14.   //  {
  15. //       Error_Handler();
  16.     }
  17.     /** Configure Regular Channel
  18.     */
  19.   //  sConfig.Channel = ADC_CHANNEL_0;
  20.   //  sConfig.Rank = ADC_REGULAR_RANK_1;
  21.     sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
  22.   //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  23.   //  {
  24.   //      Error_Handler();
  25. //   }

  26. //}
 楼主| t60yz 发表于 2022-4-30 20:11 | 显示全部楼层
计算公式:
采样时间=(12.5+采样周期)/时钟频率
 楼主| t60yz 发表于 2022-4-30 20:12 | 显示全部楼层
3.进行软件滤波
这里采样最简单的方法
因为我测得数据中发现是围绕着目标值上下波动,且周期性出现尖峰,
直接采样多次测量,取平均值得方法。

  1. for(i=0; i<max; i++ )
  2.         {   HAL_ADC_Start(&hadc1);
  3.             while(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10))
  4.             {
  5.                 HAL_ADC_Stop(&hadc1);
  6.                 sum+=HAL_ADC_GetValue(&hadc1);
  7.             }
  8.         }

  9.         adc_Value=sum/max;
  10.         sum=0;
  11.         adc_Value=adc_Value*3300/4096;//采集到的out电压  mv
 楼主| t60yz 发表于 2022-4-30 20:14 | 显示全部楼层
10种软件滤波得方法

4.其他原因导致的测量偏差
最主要的就是没有共地,或者多地。
测试中,实用的stm32f103rc8t6最小系统板,因为采样了usb转ttl模块供电,同时使用了,usb线,接在排插上供电,多地,导致测量数据大幅偏差。
littlelida 发表于 2022-5-1 17:32 来自手机 | 显示全部楼层
确实adc校准在有些时候很重要
Bblythe 发表于 2022-10-7 08:06 | 显示全部楼层

根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。
Pulitzer 发表于 2022-10-7 11:05 | 显示全部楼层

计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。
Uriah 发表于 2022-10-7 18:06 | 显示全部楼层

图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。
帛灿灿 发表于 2023-6-1 07:03 | 显示全部楼层

在实际的项目应用当中,单片机引脚的复用相当厉害
Bblythe 发表于 2023-6-1 08:06 | 显示全部楼层

但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。
童雨竹 发表于 2023-6-1 10:02 | 显示全部楼层

时间片轮的设计思想
Pulitzer 发表于 2023-6-1 11:05 | 显示全部楼层

事实上很多做项目的工程师本身自己也会在用
公羊子丹 发表于 2023-6-1 12:08 | 显示全部楼层

结构化模块化的程序设计的思想,使最基本的要求
公羊子丹 发表于 2023-6-1 13:01 | 显示全部楼层

需要在做项目的过程中经历磨难
Wordsworth 发表于 2023-6-1 14:04 | 显示全部楼层

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得
Clyde011 发表于 2023-6-1 15:07 | 显示全部楼层

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

189

主题

1191

帖子

0

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