ai: команда SF <Гц> — частота синусоиды (защита от алиасинга f<=f_s/2); W S показывает частоту синуса

This commit is contained in:
mss
2026-10-26 16:58:52 +04:00
parent dd2c21c43b
commit 5087d1b348
2 changed files with 21 additions and 0 deletions
@@ -24,6 +24,7 @@
# #
# Протокол команд (ввод строкой в терминале, Enter = конец команды): # Протокол команд (ввод строкой в терминале, Enter = конец команды):
# F <Гц> — установить частоту (1..200000) # F <Гц> — установить частоту (1..200000)
# SF <Гц> — частота синусоиды (1..f_s/2, защита от алиасинга)
# W Q | W S — режим: Q — прямоугольник, S — синус # W Q | W S — режим: Q — прямоугольник, S — синус
# D <0..255> — скважность прямоугольника (128 = 50 %) # D <0..255> — скважность прямоугольника (128 = 50 %)
# M <0..127> — амплитуда синуса (127 = максимум) # M <0..127> — амплитуда синуса (127 = максимум)
@@ -168,6 +169,8 @@ def cmd_w(a):
else: else:
pwm_config(CARRIER_HZ) # выборки пишет dds_tick pwm_config(CARRIER_HZ) # выборки пишет dds_tick
print("OK W", state["mode"]) print("OK W", state["mode"])
if state["mode"] == "S":
print("# sine:", state["freq"], "Hz")
def cmd_d(a): def cmd_d(a):
@@ -182,6 +185,13 @@ def cmd_m(a):
print("OK M", state["amp"]) 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): def cmd_sweep_parts(a):
parts = a.split() parts = a.split()
if len(parts) != 4: if len(parts) != 4:
@@ -221,6 +231,8 @@ def handle(line, phase):
a = parts[1] if len(parts) > 1 else "" a = parts[1] if len(parts) > 1 else ""
if cmd == "F": if cmd == "F":
cmd_f(a) cmd_f(a)
elif cmd == "SF":
cmd_sf(a)
elif cmd == "W": elif cmd == "W":
cmd_w(a) cmd_w(a)
elif cmd == "D": elif cmd == "D":
+9
View File
@@ -51,6 +51,7 @@
* *
* Протокол команд (Serial, 115200, строка + \n): * Протокол команд (Serial, 115200, строка + \n):
* F <Гц> — установить частоту (1..500000) * F <Гц> — установить частоту (1..500000)
* SF <Гц> — частота синусоиды (1..SAMPLE_HZ/2, защита от алиасинга)
* W Q | W S — режим: Q — прямоугольник, S — синус * W Q | W S — режим: Q — прямоугольник, S — синус
* D <0..255> — скважность прямоугольника (128 = 50 %) * D <0..255> — скважность прямоугольника (128 = 50 %)
* M <0..127> — амплитуда синуса (127 = максимум) * M <0..127> — амплитуда синуса (127 = максимум)
@@ -277,6 +278,14 @@ static void handleLine(char *line) {
char *a = strtok(nullptr, " \t"); char *a = strtok(nullptr, " \t");
if (a) setFrequency((uint32_t)strtoul(a, nullptr, 10)); if (a) setFrequency((uint32_t)strtoul(a, nullptr, 10));
Serial.print("OK F "); Serial.println(g_freq); 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")) { } else if (!strcasecmp(cmd, "W")) {
char *a = strtok(nullptr, " \t"); char *a = strtok(nullptr, " \t");
if (a) setMode((!strcasecmp(a, "S")) ? MODE_SINE : MODE_SQUARE); if (a) setMode((!strcasecmp(a, "S")) ? MODE_SINE : MODE_SQUARE);