HAL STM32G4 +ADC手动触发采集+各种滤波算法实现

HAL STM32G4 +ADC手动触发采集++各种滤波算法实现


✨本篇内容也是继欧拉电子相关无刷电机驱动控制学习的相关基础内容。仅作为个人笔记记录使用。

链接:https://pan.baidu.com/s/1CnhBREQ2-iRqjImH-ZAaGQ?pwd=9d37 
提取码:9d37
  • 🔖VOFA+波形显示ADC数据可以参考上面的文章介绍。

📙ADC采用各种滤波算法实现

  • 🔖来源于上面参考内容源码。
  • 🌿算术均值滤波算法
int averageFilter(int N)
{
   int sum = 0;
   short i;
   for(i = 0; i < N; ++i)
   {
        sum += HAL_ADC_GetValue(&hadc1);	
   }
   return sum/N;
}
  • 🌿中值滤波算法
int middleValueFilter(int N)
{
    int value_buf[N];
    int i,j,k,temp;
    for( i = 0; i < N; ++i)
    {
        value_buf[i] = HAL_ADC_GetValue(&hadc1);					
    }
    for(j = 0 ; j < N-1; ++j)
    {
        for(k = 0; k < N-j-1; ++k)
        {
            //从小到大排序,冒泡算法
            if(value_buf[k] > value_buf[k+1])
            {
                temp = value_buf[k];
                value_buf[k] = value_buf[k+1];
                value_buf[k+1] = temp;
            }
        }
    }
		
    return value_buf[(N-1)/2];
}

  • 🌿一阶互补滤波
int firstOrderFilter(int newValue, int oldValue, float a)
{
	return a * newValue + (1-a) * oldValue;
}
  • 🌿平滑均值滤波
#define N 10
int value_buf[N];
int sum=0;
int curNum=0;
int moveAverageFilter()
{
    if(curNum < N)
    {
        value_buf[curNum] = HAL_ADC_GetValue(&hadc1);
        sum += value_buf[curNum];
			  curNum++;
        return sum/curNum;
    }
    else
    {
        sum -= sum/N;
        sum += HAL_ADC_GetValue(&hadc1);
        return sum/N;
    }
}

  • 🌿限幅平均滤波
//限幅平均滤波
#define A 50
#define M 12
int data[M];
int First_flag=0;
int LAverageFilter()
{
  int i;
  int temp,sum,flag=0;
  data[0]=HAL_ADC_GetValue(&hadc1);
	for(i=1;i<M;i++)
	{
		temp=HAL_ADC_GetValue(&hadc1);
		if((temp-data[i-1])>A||((data[i-1]-temp)>A))
		{
		  i--;flag++;
		}
		else
		{
			data[i]=temp;
		}
	}
  for(i=0;i<M;i++)
  {
    sum+=data[i];
  } 
  return  sum/M;
}

  • 🌿卡尔曼滤波
int KalmanFilter(int inData)
{
		static float prevData = 0;                                 //先前数值
		static float p = 10, q = 0.001, r = 0.001, kGain = 0;      // q控制误差  r控制响应速度 
	
		p = p + q;
		kGain = p / ( p + r );                                     //计算卡尔曼增益
		inData = prevData + ( kGain * ( inData - prevData ) );     //计算本次滤波估计值
		p = ( 1 - kGain ) * p;                                     //更新测量方差
		prevData = inData;
		return inData;                                             //返回滤波值
}
  • 📝main函数
int main(void)
{
  /* USER CODE BEGIN 1 */
	float temp[2];
uint8_t TempData[12]={0,0,0,0,0,0,0,0,0,0,0x80,0x7F} ;//vofa float数据流显示格式
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  /* USER CODE BEGIN 2 */

    //HAL_UART_Receive_IT(&huart3,(uint8_t *)&aRxBuffer,1);
    HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);//ADC自校验
    HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    while(1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
					HAL_ADC_Start(&hadc1); 
					HAL_ADC_Start(&hadc2);
			//Vstep = Vref(3.3) / 4095=8.056mV	
					temp[0]=HAL_ADC_GetValue(&hadc1)*8.056f;//AIN11->PB12
					temp[1]=HAL_ADC_GetValue(&hadc2)*8.056f;//*0.02094726f; //ADC2.AIN1->PA0
					memcpy(TempData,(uint8_t*)temp,sizeof(temp));
					HAL_UART_Transmit_DMA(&huart1,(uint8_t *)TempData,12); 
					HAL_Delay(100);
    }
  /* USER CODE END 3 */
}
  • 📚程序源码:
  • 🔖采用的STM32G431
链接:https://pan.baidu.com/s/1iIzQpNHDAG-XTEMcmXUIlA?pwd=7gs0 
提取码:7gs0

相关推荐

  1. HAL STM32G4 +ADC手动触发采集+各种滤波算法实现

    2024-03-25 12:34:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 12:34:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 12:34:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 12:34:04       87 阅读
  4. Python语言-面向对象

    2024-03-25 12:34:04       96 阅读

热门阅读

  1. [小程序开发] 消息提示模块封装

    2024-03-25 12:34:04       34 阅读
  2. 云主机下搭建网页爬虫

    2024-03-25 12:34:04       33 阅读
  3. 3.21 ARM day5

    2024-03-25 12:34:04       37 阅读
  4. C++中类和对象其他内容

    2024-03-25 12:34:04       31 阅读
  5. springboot 整合 Caffine(springboot3.2)

    2024-03-25 12:34:04       42 阅读
  6. 完全背包,LeetCode322. 零钱兑换

    2024-03-25 12:34:04       34 阅读
  7. QT 常用模块介绍以及使用说明

    2024-03-25 12:34:04       39 阅读
  8. 小程序配置服务器域名

    2024-03-25 12:34:04       42 阅读