stm32进行ADC采集时有关于滤波的技巧 您所在的位置:网站首页 STM32ADC采集的电压会跳 stm32进行ADC采集时有关于滤波的技巧

stm32进行ADC采集时有关于滤波的技巧

2024-06-27 02:06| 来源: 网络整理| 查看: 265

        当我们利用stm32制作电压表时,需要利用stm32单片机内置12位的ADC进行AD采集然后转换成电压值来显示,但是此时我们遇到了一个问题——stm32单片机进行AD采集到的数据总是在个位十位数跳变,转换成电压值时也会显示一直变化,那我们该如何解决这个问题呢?

        首先来看我对ADC进行的配置。

void ADC1_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6);//六分频 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//单次转换 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; ADC_InitStructure.ADC_NbrOfChannel=1; ADC_InitStructure.ADC_ScanConvMode=DISABLE;//非扫描模式 ADC_Init(ADC1,&ADC_InitStructure); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)==SET); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)==SET); } u16 Get_ADValue(u8 ADC_Channel)//用哪个通道采集就填哪个ADC通道 { ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_239Cycles5);//规则组通道配置 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//开启软件转换 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//等待AD转换 return ADC_GetConversionValue(ADC1); }

        这里我们想到的是利用取平均值消出AD采集值的抖动,每采集一百次时用一百次采集到的AD值的总和减去100次采集中的最大值和最小值再除以98来实现,代码如下。

u32 AD_Counter=0; u16 AD_MAX=0; u16 AD_MIN=4095;//为什么AD_MIN最大,AD_MAX最小呢?后文会为你解释明白 u32 AD_SUM=0; u8 AD_Value; float Voltage; char ADC_Strings[]; void Get_Voltage(u8 ADC_Channel) { AD_Value=Get_ADValue(ADC_Channel); if(AD_Value>AD_MAX) AD_MAX=AD_Value; if(AD_Value


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有