OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6333|回复: 9

最近用F103调试了个信号峰值检测程序,对于信号的实时处理有些疑问(贴了程序链接有需要的可以下载),恳请大神指点一二。

[复制链接]

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
发表于 2017-8-26 09:37:43 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 Rainday 于 2017-8-26 11:10 编辑

从信号源发出正弦波0<幅度<3.3V,频率在<100Hz。功能:实时检测正弦波出现波峰或者波谷立即输出一个单次脉冲。AD和TIME都已经配置好,峰值程序也有(后面有链接需要的也可以参考)。用VS测试的时候是给入一段数据,但是单片机AD不停的在转换,我只是很简单的把AD存入data[2000]然后计算查找。那么在信号处理时AD应该还在继续转换吧(AD是软件触发),如果这样处理完一段数据,这段时间会漏掉一部分数据吧,数据就不在完整。 QQ截图20170826092142.png QQ截图20170826093142.png
采集了四万多个点太密集了,贴出四千五百个点的波形,和四万个点检测后输出的峰值位置是一一对应的。程序链接http://cighao.com/2016/05/31/find-peaks-of-signal/
老铁门有什么方法可以实现实时采集处理不漏掉一个点。。。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-8-26 11:10:38 | 显示全部楼层
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-8-27 10:46:10 | 显示全部楼层
本帖最后由 Rainday 于 2017-8-27 10:54 编辑

[mw_shl_code=c,true]#include "led.h"
#include "sys.h"
#include "usart.h"         
#include "adc.h"
#include "find_peak.h"
#include "timer.h"

int sig[MAX_SIGNAL_LEN];  //原始数据
int peaks[MAX_SIGNAL_LEN];   //峰值点位置
int troughs[MAX_SIGNAL_LEN];   // 谷值点位置
int i,n1,n2,n3;
//u16 temp,num;

int main()
{
         i=0;
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         LED_Init ();
         uart_init(115200);
         Adc_Init();
         TIM_OPMGATE_Init();
         //TIM_Open();
         while(1)
                 {
                         for(i=0;i<MAX_SIGNAL_LEN;i++)
                         {
                          sig[2500]=Get_Adc_Average(ADC_Channel_1,10);
                         printf("%d \r\n",sig[2500]);
                         }
                        
        n1 = 2500;  //信号长度
        
        process(sig,n1);  //信号预处理
        
        n2=find_peaks(filter_sig,n1,peaks);  //
        n3=find_troughs(filter_sig,n1,troughs);   //

        printf("\n2波峰位置\n");
        for(i=0;i<n2;i++)
                         {
                                 printf("%d ",peaks+1);  //下标从1开始
                                 printf("\n");
                         }
        printf("\n2波谷位置\n");
        for(i=0;i<n3;i++)
                         {
                                 printf("%d ",troughs+1);
                                 printf("\n");
                         }
                 }
}
[/mw_shl_code]
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-8-27 10:55:42 | 显示全部楼层
这是我的主程序,请问信号处理是只处理2500个数据吗?
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-8-27 11:16:21 | 显示全部楼层
假如我设置两个数组存储信号,第一个数组存500个存满后立即转到第二个,同时立即处理第一个数据。这样应该可以吧
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-27 13:56:52 | 显示全部楼层
我帮楼主想一个办法.
这个问题应该用数学上的微分来解决.
你的程序也不用统计这么多的缓冲数据.
理论应该能解决你的问题.
你的程序只要把两相邻两次的ADC差值的绝对值来分析分析就好了.(这就是微分)
看波形.波峰和波谷都有一个特点.微分接近0.
当然,当有干扰信号到来时,也会有接近0的微分值.
代码想办法区别一下干扰信号. ADC的值不在最高和高低时.应该是干扰信号.可以轻松排除.
再调试一下.看看行得通不.
回复

使用道具 举报

6

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-6-18
在线时间
26 小时
 楼主| 发表于 2017-9-1 11:33:38 | 显示全部楼层
操作系统 发表于 2017-8-27 13:56
我帮楼主想一个办法.
这个问题应该用数学上的微分来解决.
你的程序也不用统计这么多的缓冲数据.

这个就是如何保证信号处理实时性问题,串口调试结果没问题程序可以用也可以找到峰值点位置。。非常感谢
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-24 10:51:13 | 显示全部楼层
标记一下,学习
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-8-24 13:52:37 | 显示全部楼层
一) 没有什么是什么绝对实事, 那怕你取样后不处理直接发送, 串口的发送不也耗时么, 也是非实时。 就算你用个正规的示波器, 所看到的波形也不是实事的
二) 一般取样, 解析 都是用这样的结构
a) ADC由TIM定时触发, 由于DMA保存数据到Buffer
b)当Buffer的一半满了, 程序开始处理Buffer前一半的数据, 同时ADC继续取样并经DMA把取样数据放于Buffer的后半部分
c) 当程序处理完Buffer的前半部分, 就等待DMA完成Buffer后半部分的数据, 程序再解析后半部分, 如此循环接收解析
发送同理

三) 为什么要找峰值?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-8-4
在线时间
3 小时
发表于 2020-10-7 22:24:44 | 显示全部楼层
楼主,可以参考下程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 10:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表