打印

ADC采样后的周期数据如何找出最大或最小值?

[复制链接]
6910|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
thefly|  楼主 | 2010-4-23 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,小弟最近又遇到新问题,一个通过ADC采样的周期信号,现在需要找到他的最值(拐点)并且在这一时刻触发一个中断,请问应采用何种思路来实现呢?十分感谢指点!!
沙发
IJK| | 2010-4-23 17:02 | 只看该作者
通过软件编程,可以很容易找到他的最值(拐点),只是稍有延迟

使用特权

评论回复
板凳
IJK| | 2010-4-23 17:05 | 只看该作者
用比较器完全用硬件实现应该也不是太难,1路直接接比较器,另1路通过RC电路进行延迟再接比较器

使用特权

评论回复
地板
thefly|  楼主 | 2010-4-23 17:20 | 只看该作者
请问这个比较器是要外接运放么?STM32的MCU有没有集成比较器功能的?

使用特权

评论回复
5
IJK| | 2010-4-23 17:33 | 只看该作者
STM32的MCU目前没有集成比较器,刚发布的STM32L集成了比较器

使用特权

评论回复
6
xsgy123| | 2010-4-23 20:16 | 只看该作者
自己在外围搭一个也很简单,按3楼的方法就可以很好实现

使用特权

评论回复
7
hsbjb| | 2010-4-23 21:02 | 只看该作者
如果硬件已定,那最好就使用软件了,软件就是一个比较排序

使用特权

评论回复
8
sinadz| | 2010-4-23 21:59 | 只看该作者
看楼主的意思,只能选择软件方式解决了

使用特权

评论回复
9
QuakeGod| | 2010-4-24 02:22 | 只看该作者
软件处理很简单,看是要找极值还是找最值,极值可以即可找到,最值会有一定的延时
先说找极值,找极大值的办法就是,这次的采样如果比上次的小,那么上次采样就是极大值。
极小值同理,
找最值的办法就是,先设定一个阈值
两个变量,一个是最大值,一直是最小值,都赋值为0(有正负的情况),或者,将最大值赋值为最小的数,将最小值赋值为最大的数。
如果这个采样比最大值大,那么最大值等于这个采样,不中断,
如果这个采样值比最小值小,那么最小值等于这个采样,不中断,
如果这个采样比最大值小,小多少,看阈值,差值超过阈值,认为已经找到最值,中断。
视乎波形的纹波情况来定阈值的大小。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
thefly + 1
10
thefly|  楼主 | 2010-5-4 20:42 | 只看该作者
谢谢各位的指点,很受启发。我想在采样到最大值时在一GPIO管脚(如PB6)实时产生一个脉冲,这个脉冲要能在示波器看到,如何实现?目前我只能改变管脚整体的电平,无法产生多个脉冲的形状。关于比较最值的方法,因为采样波并不十分纯净,相当于在寻找包络的最值,所以单纯拿采样值和上一次比较不能满足要求,各位能否再给点建议十分感谢

使用特权

评论回复
11
txcy| | 2010-5-4 20:54 | 只看该作者
先判断再给脉冲,分开进行,不知道是否滞后

使用特权

评论回复
12
thefly|  楼主 | 2010-5-6 18:05 | 只看该作者
我现在有个疑问,如何能在GPIO的管脚上给一个脉冲呢?又如何设置脉冲的长度?

使用特权

评论回复
13
香水城| | 2010-5-6 18:10 | 只看该作者
我现在有个疑问,如何能在GPIO的管脚上给一个脉冲呢?又如何设置脉冲的长度?
thefly 发表于 2010-5-6 18:05


输出"高",等一会儿再输出"低"。

使用特权

评论回复
14
thefly|  楼主 | 2010-5-6 18:25 | 只看该作者
本帖最后由 thefly 于 2010-5-6 20:37 编辑

老大,这样输出只能设置管脚电平一会高一会低,无法显示成脉冲的信号。要怎样才能类似这样___-___-___-___-___

使用特权

评论回复
15
txcy| | 2010-5-6 20:59 | 只看该作者
怎么不能显示脉冲信号呢,LS需要什么样的脉冲

使用特权

评论回复
16
香水城| | 2010-5-6 21:00 | 只看该作者
老大,这样输出只能设置管脚电平一会高一会低,无法显示成脉冲的信号。要怎样才能类似这样___-___-___-___-___
thefly 发表于 2010-5-6 18:25


脉冲的本质不就是电平一会高一会低吗?

使用特权

评论回复
17
thefly|  楼主 | 2010-5-10 16:11 | 只看该作者
香版大大,我现在的问题是如何能找到波峰,如果能找到波峰就可以触发脉冲,请问有类似的例程吗?感谢!!

使用特权

评论回复
18
香水城| | 2010-5-10 16:54 | 只看该作者
香版大大,我现在的问题是如何能找到波峰,如果能找到波峰就可以触发脉冲,请问有类似的例程吗?感谢!!
thefly 发表于 2010-5-10 16:11


这个问题不复杂吧?看看9楼的提示。

使用特权

评论回复
19
thefly|  楼主 | 2010-5-10 17:08 | 只看该作者
9楼的原理可以理解,可是程序不知如何入手,我这样拿(ACD1->DR)直接比较可以么?
u16 Max=0;
if ((ADC1->DR) > Max)
      {
     Max = (ADC1->DR);
      }
  else{
      GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
      delay(10);
      GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
试过了只能没有规律的产生个把脉冲而且不是在波峰位置,老大帮帮我把小弟实在是新手

使用特权

评论回复
20
lxyppc| | 2010-5-10 18:37 | 只看该作者
你需要比较两次差值是否符号相反,从而得出最值
比如说:
void GenPulse(void)
{
    static s16 lastDeltaAD = 0;
    static s16 lastAD = 0;
    s16 curAD = (s16)ADC1->DR;
    s16 deltaAD = lastAD - curAD;
    if(deltaAD > 0){
        if(lastDeltaAD<=0){
            GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
            delay(10);
            GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
        }
    }else{
        if(lastDeltaAD>0){
            GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
            delay(10);
            GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
        }
    }
    lastDeltaAD = deltaAD;
    lastAD = curAD;
}

其实这样也不太可行的,AD采样的结果本来就有毛刺,需要滤波后处理,但这样一来实时性也跟不上
具体要看你的应用是什么

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
thefly + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

1

粉丝