Загрузка...

Делаю генератор аналогово сигнала под arduino duo, ОЧЕНЬ нужна помощь

Тема в разделе C/C++ создана пользователем ndv123456 25 сен 2024. 121 просмотр

Загрузка...
  1. ndv123456
    ndv123456 Автор темы 25 сен 2024 2 10 мар 2018
    Неделю назад начал знакомиться с С и arduino duo, сейчас пытаюсь сделать функцию генерации аналогового сигнала(синусоиды) но нужны формулы(скорее всего они не верные),завтра защита))), нейронки выдают хуйню, цап у нас 12-ти битный и максимальное напряжение 3.3v может выдать на dac0, вот код на проверку, добрые люди помогите чем сможете:
    C
    #include <math.h>

    #define DAC_PIN A3
    volatile uint16_t angle = 0;
    const int amplitude = 4095;
    const int BAUD_RATE = 9600;

    void setup() {
    pinMode(DAC_PIN, OUTPUT);
    analogWrite(DAC_PIN, 0);

    Serial.begin(BAUD_RATE);
    while (!Serial) {}
    Serial.println("Available modes: 1 (Sine), 2 (Triangle), 3 (Sawtooth)");
    }

    void loop() {
    if (Serial.available()) {
    int mode = Serial.parseInt();
    if (mode >= 1 && mode <= 3) {
    switch (mode) {
    case 1:
    generateSineWave();
    break;
    case 2:
    generateTriangleWave();
    break;
    case 3:
    generateSawtoothWave();
    break;
    }
    } else {
    Serial.println("Invalid mode. Available modes: 1 (Sine), 2 (Triangle), 3 (Sawtooth)");
    }
    }
    }

    void generateSineWave() {
    while (true) {
    float level = (sin(angle * PI / 180) + 1) * amplitude / 2;
    analogWrite(DAC_PIN, level);
    delayMicroseconds(10);
    angle++;
    if (angle > 360) {
    angle = 0;
    }
    }
    }

    void generateTriangleWave() {
    while (true) {
    float level = (angle * amplitude / 180) - amplitude / 2 * 4095 / 3.3;
    analogWrite(DAC_PIN, level);
    delayMicroseconds(10);
    angle++;
    if (angle > 360) {
    angle = 0;
    }
    }
    }

    void generateSawtoothWave() {
    while (true) {
    float level = amplitude * angle / 360 * 4095 / 3.3;
    analogWrite(DAC_PIN, level);
    delayMicroseconds(10);
    angle++;
    if (angle > 360) {
    angle = 0;
    }
    }
    }
     
    25 сен 2024 Изменено
    1. panacea
      ndv123456, оформи код через: Вставить -> Код
Top