Искаженный звук от mcp3002

Я настроил MCP3002 для преобразования аналогового сигнала в цифровой. Когда я читаю его напрямую через последовательный порт и конвертирую в wav-файл, он звучит относительно ясно. Серийный номер ограничен количеством выборок в секунду, я могу получить около 7000 выборок в секунду.

Когда я отправляю сигнал напрямую на сервер, я могу достичь скорости около 17 500 выборок в секунду. однако, когда я конвертирую это в файл wav, он также звучит относительно чисто, но с небольшим искажением / «голосом робота» через звук.

Есть ли простой способ предотвратить это или почему это происходит?

Код, как я читаю SPI, находится в этом вопросе: Чтение данных с MCP3002

, 👍-1

Обсуждение

Без какого-либо кода мы мало что можем сделать. Наличие голоса робота звучит как проблема с частотой дискретизации. Как вы устанавливаете частоту дискретизации и как вы измеряете частоту дискретизации?, @chrisl

Ваш АЦП достигает насыщения? Вы можете проверить, есть ли у вас образцы со значениями 0 или 1023. Вы уверены, что ваша частота дискретизации строго постоянна? Если ваш SPI не синхронизируется с таймером, вероятно, это не так., @Edgar Bonet

@chrisl код для чтения mcp добавлен в ссылку (из другого вопроса, где вы мне тоже помогли =)), @Revils

@EdgarBonet Я добавил код, как я его прочитал, АЦП находится в диапазоне от 100 до 200, поэтому насыщения нет. Мой SPI настроен на постоянную частоту, если вы это имеете в виду?, @Revils

И как вы отправляете сигнал напрямую на сервер? Этого нет в коде вашего предыдущего вопроса. Это может быть очень важно, так как это может испортить вашу синхронизацию, что приведет к нестабильной частоте измерения., @chrisl

Я могу добавить это сегодня вечером, это «оконный» буфер, который отправляется через UDP. Действительно хорошо, что вы на это посмотрели!, @Revils


1 ответ


1

Из кода, на который вы ссылаетесь, видно, что порт SPI полностью управляется программным обеспечением:

void loop() {
    ...
    msb = SPI.transfer(cmd);
    lsb = SPI.transfer(0);
    ...
}

Это означает, что время транзакции SPI (когда именно она начинается) и, соответственно, время преобразования АЦП равно зависит от времени выполнения вашего кода. У вас нет хорошего контроля в это время. Это зависит от того, какие другие вещи могут быть в вашем цикле, и на другие источники прерываний (таймеры, сеть...).

По крайней мере, вы можете настроить прерывание по таймеру и запустить SPI из обработчик прерывания. Тогда ваши тайминги должны быть более последовательными. Ты все еще будет некоторое дрожание из-за задержки обработчика прерывания некоторыми критическими разделами, включая другие прерывания. Но это может быть достаточно хорошо для вашего приложения.

Для достижения наилучших результатов в идеале нужно, чтобы время было полностью управляется аппаратно. Может есть способ активировать порт SPI от таймера. Это зависит от конкретного MCU, который вы используете: вы придется копаться в таблице данных.

,