为什么硬件编码总是碰到下载不了的问题 2023-04-30 20:34 采纳率: 0%
浏览 18

串口接收ADC数据发送到上位机,串口代码如和写

有会用英飞凌ADS写串口函数接收ADC数据之后发送到电脑上位机查看的吗?串口方面的函数实在不会写,求个注释详细的例程,蟹蟹了

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-01 12:16
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7778782
    • 你也可以参考下这篇文章:ADC知识(2)——直流参数(输入电压参考,参考电流输入,积分非线性误差,差分非线性误差)
    • 除此之外, 这篇博客: 单片机ADC采样算法之卡尔曼滤波中的 单片机ADC采样算法 之 卡尔曼滤波 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

      算法的核心思想是,根据当前的仪器"测量值" 和上一刻的 “预测量” 和 “误差”,计算得到当前的最优量.

      再预测下一刻的量, 里面比较突出的是观点是. 把误差纳入计算, 而且分为预测误差和测量误差两种.通称为 噪声. 还有一个非常大的特点是,误差独立存在, 始终不受测量数据的影响。

      下来先了解一个卡尔曼滤波中几个参数的含义:概率(Probability),随即变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。

      关于卡尔曼公式的含义及推导,网上已经有很多文章了,这里不在赘述,直接看C代码的实现。

      /*

      R值固定,Q值越大,代表越信任测量值,Q值无穷大,代表只用测量值。
      
               Q值越小,代表越信任模型预测值,Q值为0,代表只用模型预测值。
      

      */

      //参数一

      float KalmanFilter( float 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;                                             //返回估计值
      

      }

      现在测试一下卡尔曼滤波的效果,通过函数发生器产生一个锯齿波,送到单片机的AD口,单片机读取采集到的AD数据后,经过卡尔曼滤波算法,然后将采样的数据和滤波后的数据通过串口发生出来,并在串口波形显示软件上显示。
      在这里插入图片描述

      void main( void )

      {

      while( 1 )
      
      {
      
          val1 = ReadVol_CH3();            //读取AD采样数据
      
          dat = ( float )val1;
      
          dat =    KalmanFilter( dat );    //卡尔曼滤波
      
          printf("A%drn",val1);          //打印结果
      
          printf("B%2frn",dat);
      
      }
      

      }

      现在看一下滤波的结果
      在这里插入图片描述

      蓝色曲线为原始采样的数据曲线,橙色曲线为经过卡尔曼滤波后的曲线。

      下面改变Q和R的值在测试一下滤波效果。

      修改后的参数如下

      //参数二

      unsigned long kalman_filter( unsigned long ADC_Value )

      {

      float LastData;
      
      float NowData;
      
      float kalman_adc;
      
      static float kalman_adc_old = 0;
      
      static float P1;
      
      static float Q = 0.0003;
      
      static float R = 5;
      
      static float Kg = 0;
      
      static float P = 1;
      
      NowData = ADC_Value;
      
      LastData = kalman_adc_old;
      
      P = P1 + Q;
      
      Kg = P / ( P + R );
      
      kalman_adc = LastData + Kg * ( NowData - kalman_adc_old );
      
      P1 = ( 1 - Kg ) * P;
      
      P = P1;
      
      kalman_adc_old = kalman_adc;
      
      return ( unsigned long )( kalman_adc );
      

      }

      测试波形

      锯齿波数据变直线

      蓝色曲线为原始采样的数据曲线,橙色曲线为经过卡尔曼滤波后的曲线。

      和第一次测试的波形图对比后可以发现,第二次经过卡尔曼滤波后的波形变化非常大,参数改变后锯齿波被滤成接近于直线了。

      可以看到不同的R、Q值会对测量结果有很大的影响。

      Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏

      R:测量噪声,R增大,动态响应变慢,收敛稳定性变好

      具体各个参数的如何选择,只有在应用中根据测量结果,自己慢慢调整。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 4月30日

悬赏问题

  • ¥60 用r语言进行数据分析
  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。