stm32 adc 测量偏差的简单解决方案 hal库

最近用stm32 去检测电压发现会偏差70mv左右,而且上下波动20mv左右
于是找到了一些解决方法

1.最重要的一步
在初始化adc之后,进行校准

 MX_ADC1_Init();
 HAL_Delay(200);
 HAL_ADCEx_Calibration_Start(&hadc1);

关于延时本人经测试,并没有太大差别,但又帖子说明,可以减小误差,自行测试。

2.延长采样时间
(1)在配置中修改
在这里插入图片描述
(2)在代码中修改
找到下面代码中simplingtime,右键查找ADC_SAMPLETIME_71CYCLES_5的定义,选择你所需要的周期

//void MX_ADC1_Init(void)
//{
 //  ADC_ChannelConfTypeDef sConfig = {0};

    /** Common config
    */
  //  hadc1.Instance = ADC1;
  //  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  //  hadc1.Init.ContinuousConvMode = DISABLE;
  //  hadc1.Init.DiscontinuousConvMode = DISABLE;
  //  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  //  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  //  hadc1.Init.NbrOfConversion = 1;
  //  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  //  {
 //       Error_Handler();
    }
    /** Configure Regular Channel
    */
  //  sConfig.Channel = ADC_CHANNEL_0;
  //  sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
  //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  //  {
  //      Error_Handler();
 //   }

//}

计算公式:
采样时间=(12.5+采样周期)/时钟频率

3.进行软件滤波
这里采样最简单的方法
因为我测得数据中发现是围绕着目标值上下波动,且周期性出现尖峰,
直接采样多次测量,取平均值得方法。

 for(i=0; i<max; i++ )
        {   HAL_ADC_Start(&hadc1);
            while(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10))
            {
                HAL_ADC_Stop(&hadc1);
                sum+=HAL_ADC_GetValue(&hadc1);
            }
        }

        adc_Value=sum/max;
        sum=0;
        adc_Value=adc_Value*3300/4096;//采集到的out电压  mv

10种软件滤波得方法

4.其他原因导致的测量偏差
最主要的就是没有共地,或者多地。
测试中,实用的stm32f103rc8t6最小系统板,因为采样了usb转ttl模块供电,同时使用了,usb线,接在排插上供电,多地,导致测量数据大幅偏差。

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值