You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用for循环生成可灵活调整平坦段长度的DAC波形数组?

解决方案

核心思路

原波形结构可拆解为:起始平坦段 → 峰值 → N个中间平坦段 → 谷值,其中N就是输入参数x。我们需要根据x动态生成对应长度的波形数组,再通过DAC_DMA输出。

示例代码

// 定义中间平坦段的最大数量,根据实际需求调整
#define MAX_FLAT_SEGMENTS 100
// 计算波形数组的最大长度:起始1 + 峰值1 + 最大平坦段数 + 谷值1
#define MAX_WAVE_LENGTH (3 + MAX_FLAT_SEGMENTS)

// 预先分配足够大的静态数组(嵌入式环境推荐用静态数组,避免动态内存分配风险)
uint32_t Wave_LUT[MAX_WAVE_LENGTH];

void GenerateAdjustableWave(uint32_t x) {
    // 确保x不超过最大限制,避免数组越界
    if (x > MAX_FLAT_SEGMENTS) {
        x = MAX_FLAT_SEGMENTS;
    }
    
    uint32_t waveLength = 3 + x;
    
    // 填充起始平坦段
    Wave_LUT[0] = 2048;
    // 填充峰值
    Wave_LUT[1] = 4026;
    // 填充x个中间平坦段
    for (uint32_t i = 0; i < x; i++) {
        Wave_LUT[2 + i] = 2048;
    }
    // 填充谷值
    Wave_LUT[2 + x] = 0;
    
    // 启动DAC_DMA和定时器(先停止之前的传输避免冲突)
    HAL_DAC_Stop_DMA(&hdac, DAC_CHANNEL_1);
    HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, Wave_LUT, waveLength, DAC_ALIGN_12B_R);
    HAL_TIM_Base_Start(&htim4);
}

使用方式

调用GenerateAdjustableWave(x)即可生成对应波形:

  • 当x=1时,数组为{2048,4026,2048,0}(与原数组一致)
  • 当x=3时,数组为{2048,4026,2048,2048,2048,0}

关键修改点

  1. 将固定长度数组改为预分配的静态大数组,适配不同x的需求,嵌入式环境下优先用静态内存,避免动态内存分配的碎片化或异常风险
  2. 通过for循环批量填充中间平坦段,无需手动逐个添加元素
  3. 每次生成波形前停止之前的DMA传输,防止资源冲突
  4. 增加x的范围检查,避免数组越界

内容的提问来源于stack exchange,提问作者Meria Rajagukguk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 00:37:37