STM32 HAL ADC DMA学习笔记

本文介绍了在嵌入式系统中如何使用HAL_ADCEx_Calibration进行ADC校准,以及如何通过卡尔曼滤波处理ADC采集的数据,最终在上位机上展示ADC3通道的电压值和正弦波形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、CUBEMA配置

 

2、配置代码

//  HAL_ADCEx_Calibration_Start(&hadc1);
//  HAL_ADCEx_Calibration_Start(&hadc2);
  HAL_ADCEx_Calibration_Start(&hadc3);//校准ADC

main里面添加任务:

//       ADC1_Process();//未测试      
//       ADC2_Process();//未测试     
       ADC3_Process();//测试成功
//卡尔曼滤波
int KalmanFilter4(int inData4)
{
    static float prevData4 = 0;                                 //先前数值
    static float p4 = 20.0f, q4 = 0.0001f, r4 = 0.005f, kGain4 = 0.001f;      // q控制误差  r控制响应速度 

    p4 = p4 + q4;
    kGain4 = p4 / ( p4 + r4 );                                     //计算卡尔曼增益
    inData4 = prevData4 + ( kGain4 * ( inData4 - prevData4 ) );     //计算本次滤波估计值
    p4 = ( 1 - kGain4 ) * p4;                                     //更新测量方差
    prevData4 = inData4;
    return inData4;                                             //返回滤波值
}
// ADC执行程序
#define chanle3 4
uint16_t ADC3_Value[chanle3] ;

float ADC3_1 =0.0f;
float ADC3_2 =0.0f;
float ADC3_3 =0.0f;
float ADC3_4 =0.0f;

int ADC_value_buf[4];
void ADC3_Process(void)//已经准确获取电压
{
    HAL_ADC_Start_DMA(&hadc3,(uint32_t *)ADC3_Value,chanle3);
//     Usart1Printf("%d\r  %d\r  %d\r  %d\r\n",ADC3_Value[0],ADC3_Value[1],ADC3_Value[2],ADC3_Value[3]);

     //卡尔曼滤波
    ADC3_Value[0]= KalmanFilter1(ADC3_Value[0]);
    ADC3_4 =ADC3_Value[0]/ 4095.0f * 3.3f   ;

    ADC3_Value[1]= KalmanFilter2(ADC3_Value[1]);
    ADC3_3 =ADC3_Value[1]/ 4095.0f * 3.3f   ;

    ADC3_Value[2]= KalmanFilter3(ADC3_Value[2]);
    ADC3_2 =ADC3_Value[2]/ 4095.0f * 3.3f   ;

    ADC3_Value[3]= KalmanFilter4(ADC3_Value[3]);
    ADC3_1 =ADC3_Value[3]/ 4095.0f * 3.3f   ;
    
    Usart1Printf(" %.6f,%.6f,%.6f,%.6f\n",ADC3_4,ADC3_3,ADC3_2,ADC3_1);
    
}

3、上位机显示效果

参考电源直接一条直线!!!

DAC输出的正弦波形也非常平滑!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂北研猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值