Неделю назад начал знакомиться с С и arduino duo, сейчас пытаюсь сделать функцию генерации аналогового сигнала(синусоиды) но нужны формулы(скорее всего они не верные),завтра защита))), нейронки выдают хуйню, цап у нас 12-ти битный и максимальное напряжение 3.3v может выдать на dac0, вот код на проверку, добрые люди помогите чем сможете: #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; } } } 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; } } }