硬汉嵌入式论坛

 找回密码
 立即注册
查看: 199|回复: 1
收起左侧

[ADC] 外部adc采样

[复制链接]

11

主题

16

回帖

49

积分

初级会员

积分
49
发表于 2025-11-28 16:51:01 | 显示全部楼层 |阅读模式
使用h750的片子产生一个10m的pwm波给到外部的adc采样芯片,以10m的update出发dma读取端口数据,每次采10000个点,没半中断与全中断时处理五千个点一直不停,目的是为了检测并且录播,但是目前遇到了一个问题,每次遍历比较5000个点的时间居然需要1.6ms,导致根本就遍历不完,请问一下问题出在哪里,主频时钟为480m,理论上来说应该是够用的。

主要的运行时间集中在下面这个函数


int        Capture_First_Peak()
{
    static enum { IDLE, POS_TRACKING, NEG_TRACKING } state = IDLE;
                static int num=0;
    int16_t normal = sys_state.ADC3_IDLE_LEVEL;
                sys_state.peak_value = sys_state.ADC3_IDLE_LEVEL;
    for(uint32_t i = 0; i < TOTAL_SAMPLES; i++)
                {
                         int16_t current = (int16_t)((adcbuffer[i+sys_state.head]&0x3fff) | ((adcbuffer[i+sys_state.head] & 0x2000) ? 0xC000 : 0));       
                                        switch(state)
                                                {
                                                                case IDLE:
                                                                                if (current > (normal + POS_THRESHOLD))
                                                                                {
                                                               
                                                                               
                                                                                                sys_state.polarity = 1;
                                                                                                state = POS_TRACKING;
                                                                                       
                                                                                }
                                                                        else if(current < (normal - NEG_THRESHOLD))
                                                                                {
                                                       
                                                                                                sys_state.polarity = -1;
                                                                                                state = NEG_TRACKING;
                                                                       
                                                                                }
                                                                break;
                                                        case POS_TRACKING:
                                                                                // 更新峰值
                                                                                if (current > sys_state.peak_value)
                                                                                {
                                                                                                sys_state.peak_value = current;
                                                                                                sys_state.peak_position = i+sys_state.head;  // 更新峰值位置                                                                       
                                                                                }
                                                                               
                                                                                // 检查回落条件
                                                                                else if (current < (normal + POS_THRESHOLD - HYSTERESIS))
                                                                                {
                                                                                               
                                                                                                sys_state.amplitude = sys_state.peak_value;
                                                                                                Process_Peak_Detected();
                                                                                        state = IDLE;
                                                                                       
                                                                                }
                                                                                break;
                                                                               
                                                                case NEG_TRACKING:
                                                                                // 更新峰值
                                                                                if (current < sys_state.peak_value)
                                                                                {
                                                                                                sys_state.peak_value = current;
                                                                                }
                                                                               
                                                                                else if (current > (normal + HYSTERESIS))
                                                                                {
                                                                                                // 峰值跟踪完成
                                                                                               
                                                                                                sys_state.amplitude = sys_state.peak_value;
                                                                                                Process_Peak_Detected();
                                                                                        state = IDLE;
                                                                               
                                                                                }

                                                                                break;
                                        }
                }
                return 0;
}

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120448
QQ
发表于 2025-11-29 10:04:54 | 显示全部楼层
从你发的代码来来看5000次是合理的,每次循环才320ns。

三个地方可以改进下
1、注释掉 Process_Peak_Detected(),看看速度多少。
2、for循环改成8个一组展开执行。可以稍微节省点。
3、如果使用MDK AC6,开始ofast优化
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-10 17:22 , Processed in 0.056738 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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