From 5087d1b348b7eec5c33c730d3bde63c1a857f5a6 Mon Sep 17 00:00:00 2001 From: mss Date: Mon, 26 Oct 2026 16:58:52 +0400 Subject: [PATCH] =?UTF-8?q?ai:=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=B0=20SF=20<=D0=93=D1=86>=20=E2=80=94=20=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D1=82=D0=B0=20=D1=81=D0=B8=D0=BD=D1=83=D1=81=D0=BE?= =?UTF-8?q?=D0=B8=D0=B4=D1=8B=20(=D0=B7=D0=B0=D1=89=D0=B8=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=20=D0=B0=D0=BB=D0=B8=D0=B0=D1=81=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=D0=B0=20f<=3Df=5Fs/2);=20W=20S=20=D0=BF=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D1=87=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=82=D1=83=20=D1=81=D0=B8=D0=BD=D1=83=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stub/01-dds-generator-rp2040-circuitpython.py | 12 ++++++++++++ stub/01-dds-generator-rp2040.ino | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/stub/01-dds-generator-rp2040-circuitpython.py b/stub/01-dds-generator-rp2040-circuitpython.py index deb8ce5..fe9e6c4 100644 --- a/stub/01-dds-generator-rp2040-circuitpython.py +++ b/stub/01-dds-generator-rp2040-circuitpython.py @@ -24,6 +24,7 @@ # # Протокол команд (ввод строкой в терминале, Enter = конец команды): # F <Гц> — установить частоту (1..200000) +# SF <Гц> — частота синусоиды (1..f_s/2, защита от алиасинга) # W Q | W S — режим: Q — прямоугольник, S — синус # D <0..255> — скважность прямоугольника (128 = 50 %) # M <0..127> — амплитуда синуса (127 = максимум) @@ -168,6 +169,8 @@ def cmd_w(a): else: pwm_config(CARRIER_HZ) # выборки пишет dds_tick print("OK W", state["mode"]) + if state["mode"] == "S": + print("# sine:", state["freq"], "Hz") def cmd_d(a): @@ -182,6 +185,13 @@ def cmd_m(a): print("OK M", state["amp"]) +def cmd_sf(a): + """Частота синусоиды (с защитой от алиасинга: f <= f_s/2).""" + hz = min(fs_eff // 2, max(1, int(float(a)))) + state["freq"] = hz + print("OK SF", hz) + + def cmd_sweep_parts(a): parts = a.split() if len(parts) != 4: @@ -221,6 +231,8 @@ def handle(line, phase): a = parts[1] if len(parts) > 1 else "" if cmd == "F": cmd_f(a) + elif cmd == "SF": + cmd_sf(a) elif cmd == "W": cmd_w(a) elif cmd == "D": diff --git a/stub/01-dds-generator-rp2040.ino b/stub/01-dds-generator-rp2040.ino index 49656c4..304f6bc 100644 --- a/stub/01-dds-generator-rp2040.ino +++ b/stub/01-dds-generator-rp2040.ino @@ -51,6 +51,7 @@ * * Протокол команд (Serial, 115200, строка + \n): * F <Гц> — установить частоту (1..500000) + * SF <Гц> — частота синусоиды (1..SAMPLE_HZ/2, защита от алиасинга) * W Q | W S — режим: Q — прямоугольник, S — синус * D <0..255> — скважность прямоугольника (128 = 50 %) * M <0..127> — амплитуда синуса (127 = максимум) @@ -277,6 +278,14 @@ static void handleLine(char *line) { char *a = strtok(nullptr, " \t"); if (a) setFrequency((uint32_t)strtoul(a, nullptr, 10)); Serial.print("OK F "); Serial.println(g_freq); + } else if (!strcasecmp(cmd, "SF")) { + // частота синусоиды: с защитой от алиасинга (f <= SAMPLE_HZ/2) + char *a = strtok(nullptr, " \t"); + uint32_t hz = a ? (uint32_t)strtoul(a, nullptr, 10) : g_freq; + if (hz < 1) hz = 1; + if (hz > SAMPLE_HZ / 2) hz = SAMPLE_HZ / 2; + setFrequency(hz); + Serial.print("OK SF "); Serial.println(g_freq); } else if (!strcasecmp(cmd, "W")) { char *a = strtok(nullptr, " \t"); if (a) setMode((!strcasecmp(a, "S")) ? MODE_SINE : MODE_SQUARE);