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);