这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » GIGA_R1_WiFi开发指南【ADC/DAC功能使用】

共2条 1/1 1 跳转至

GIGA_R1_WiFi开发指南【ADC/DAC功能使用】

助工
2026-01-31 22:26:01   被打赏 50 分(兑奖)     打赏

一、硬件介绍

1、产品特点

Arduino GIGA R1 WiFi 开发板,提供76个GPIO引脚(其中12个为模拟端口、12个PWM、4个串行端口、3个I2C、2个SPI、1个FDCAN、1个SAI);

采用双核STM32H747XI微控制器(480MHz的Cortex-M7内核和240 MHz的Cortex-M4内核);

配备2MB闪存、1MB内存,以及6MB外部闪存和8MB SDRAM;

通过板载Murata 1DX模块实现WiFi和低功耗蓝牙连接;

还有输入/输出3.5mm音频插孔、JTAG连接器、20Pin的Arducam相机连接器等;


image-20260125205601548

image-20260125205601548.png



主要特性



  • 微控制器:STMicro STM32H747XI Cortex-M7@480 MHz + M4 @ 240 MHz MCU(2MB 双组闪存、1MB RAM)

  • 内存:8MB SDRAM

  • 存储:16MB QSPI NOR 闪存

  • 无线功能:2.4GHz WiFi 802.11b/g/n和蓝牙 5.1 BR/EDR/LE(Murata 1DX 模块)


接口

  • 显示屏:20pin接口

  • 摄像头:20pin Arducam摄像头接口

  • USB1x USB Type-C 端口用于编程和 HID1x USB 2.0 主机 Type-A 端口

  • 音频:3.5 毫米音频插孔

  • 调试:JTAG 连接器

  • 电源:通过VIN引脚提供6 ~ 24V输入

  • VRT(为RTC供电)和 OFF(关闭电路板电源)引脚


  • 复位按钮、BOOT0按钮、RGB_LED、电源LED

  • 安全功能:Microchip ATECC608A

  • 每个 I/O 引脚 8mA




二、功能实现

1、硬件介绍


GIGA R1的微控制器为STM32H747XI,其ADC分辨率最高16位(可配置为 16/14/12/10/8位);



DAC的分辨率12位;


通过相关支持库,可以实现STM32H7许多ADC / DAC的高级功能(DMA、参数配置、通道采集等)


image-20260127235729348.png

原理图


image-20260128001457299.png


摇杆模块


摇杆模块,随着摇杆方向的变化,阻值也会随着变化,从而改变输出的值;

初始状态下X,Y读出电压为供电电压的1/2左右( 1.65V / 2.5V );

当随着X、Y方向移动时,读出电压值减小(0V) / 增大(VCC);


image-20260130185206390

image-20260130185206390.png




实物搭建效果


image-20260130184254223.png



2、功能效果



1、ADC功能效果:通过开发板的ADC功能,当移动摇杆X、Y轴方向时,串口输出当前移动方向的ADC以及其映射的数值;

(摇杆模块输出的是模拟信号 / 映射的数值(-100 ~ 100)具有正负方向性)




2、DAC功能效果:通过开发板的DAC功能,通过串口读取不同的指令,然后在DAC0引脚上生成不同的波形(1kHz),并通过示波器进行波形的显示;



三、代码编写

1、安装ADC / DAC支持库

Arduino_AdvancedAnalog:适配H7_ADC / DAC的硬件DMA等高级功能;



image-20260128000458772.png

image-20260128000458772



2、ADC功能

主要相关代码


#include <Arduino_AdvancedAnalog.h>

AdvancedADC adc(A0, A1);
uint64_t last_millis = 0;

void setup() {
    Serial.begin(115200);

    // 16位 采样率16kHz 缓冲区大小32  队列深度128
    if (!adc.begin(AN_RESOLUTION_16, 16000, 32, 128)) {
        Serial.println("ADC 功能初始失败!");
        while (1);
    }
}

void loop() {
    if (adc.available()) {
        SampleBuffer buf = adc.read();
        if ((millis() - last_millis) > 200) {        
            // 获取原始数据 (范围 0 - 65535)
            uint16_t rawX = buf[0]; // A0
            uint16_t rawY = buf[1]; // A1

            // -100 到 100 (映射正负方向)
            long mapX = map(rawX, 0, 65535, -100, 100);
            long mapY = map(rawY, 0, 65535, -100, 100);

            Serial.print("Raw X: ");
            Serial.print(rawX);
            Serial.print(" | Map X: ");
            Serial.print(mapX);
            
            Serial.print("   ||   "); 

            Serial.print("Raw Y: ");
            Serial.print(rawY);
            Serial.print(" | Map Y: ");
            Serial.println(mapY);

            last_millis = millis();
        }
        // 释放缓冲区
        buf.release();
    }
}



3、DAC功能

主要相关代码


#include <Arduino_AdvancedAnalog.h>

// 输出频率 = SAMPLE_RATE / N_SAMPLES ≈  1000 Hz
#define N_SAMPLES           (2048)      // 采样点数
#define SAMPLE_RATE         (2048000)     // 采样率 (Hz) 

// 使用 DAC0引脚
AdvancedDAC dac0(DAC_0);
// 缓冲区
uint16_t SAMPLES_BUFFER[N_SAMPLES]; 

// 波形生成
void generate_waveform(int cmd) 
{   
    Serial.println(); 
    switch (cmd) {
        case 't':
            // 三角波
            Serial.print("当前波形: 三角波");
            for (int i = 0; i < N_SAMPLES; i++) {
                float position = (float)i / N_SAMPLES;
                float val_norm;
                if (position < 0.5) {
                    val_norm = position * 2.0; // 0 -> 1
                } else {
                    val_norm = (1.0 - position) * 2.0; // 1 -> 0
                }
                SAMPLES_BUFFER[i] = (uint16_t)(val_norm * 4095);
            }
            break;

        case 'q':
            // 方波
            Serial.print("当前波形: 方波");
            for (int i = 0; i < N_SAMPLES; i++) {
                if (i < (N_SAMPLES / 2)) {
                    SAMPLES_BUFFER[i] = 4095;
                } else {
                    SAMPLES_BUFFER[i] = 0;
                }
            }
            break;

        case 's':
            // 正弦波
            Serial.print("当前波形: 正弦波");
            for (int i = 0; i < N_SAMPLES; i++) {
                SAMPLES_BUFFER[i] = (uint16_t)(sin(2 * PI * i / N_SAMPLES) * 2047 + 2048);
            }
            break;

        case 'r':
            // 锯齿波
            Serial.print("当前波形: 锯齿波");
            for (int i = 0; i < N_SAMPLES; i++) {
                SAMPLES_BUFFER[i] = map(i, 0, N_SAMPLES, 0, 4095);
            }
            break;
            
        default:
            // 无效字符
            return; 
    }
}


void setup() {
    Serial.begin(115200);
    while (!Serial) {} 
    
    Serial.println("输入指令: t(三角), q(方波), s(正弦), r(锯齿)");
    // 默认波形 (正弦波)
    generate_waveform('s');
    
    // DAC 初始化
    // 分辨率 / 采样率 / 缓冲区大小 / 缓冲区数量
    if (!dac0.begin(AN_RESOLUTION_12, SAMPLE_RATE, N_SAMPLES, 32)) {
        Serial.println("启动 DAC 失败 !");
        while (1);
    }
}


void loop() {
    // 处理串口指令
    if (Serial.available() > 0) {
        int cmd = Serial.read();
        if (cmd != '\n' && cmd != '\r') {
          generate_waveform(cmd);
        }
    } 
    
    // 填充 DAC 缓冲区
    if (dac0.available()) {
        SampleBuffer buf = dac0.dequeue();
        // 复制到DMA缓冲区中
        for (size_t i = 0; i < buf.size(); i++) {
            buf[i] = SAMPLES_BUFFER[i % N_SAMPLES];
        }
        dac0.write(buf);
    }
}



四、程序烧录

1、连接USB数据线至开发板;

2、选择端口号对应的开发板;

3、点击 上传 烧录程序到开发板上;


image-20260105170611018.png


image-20260105170611018

五、效果演示



ADC功能演示

移动摇杆时,串口输出此时的ADC以及其映射的数值;


GIGA_ADC.gif





DAC功能演示

生成4种不同的波形;


GIGA_DAC.gif




GIGA_DAC




关键词: GIGA R1 WiFi    

专家
2026-02-02 08:10:09     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]