Искаженный звук от mcp3002
Я настроил MCP3002 для преобразования аналогового сигнала в цифровой. Когда я читаю его напрямую через последовательный порт и конвертирую в wav-файл, он звучит относительно ясно. Серийный номер ограничен количеством выборок в секунду, я могу получить около 7000 выборок в секунду.
Когда я отправляю сигнал напрямую на сервер, я могу достичь скорости около 17 500 выборок в секунду. однако, когда я конвертирую это в файл wav, он также звучит относительно чисто, но с небольшим искажением / «голосом робота» через звук.
Есть ли простой способ предотвратить это или почему это происходит?
Код, как я читаю SPI, находится в этом вопросе: Чтение данных с MCP3002
@Revils, 👍-1
Обсуждение1 ответ
Из кода, на который вы ссылаетесь, видно, что порт SPI полностью управляется программным обеспечением:
void loop() {
...
msb = SPI.transfer(cmd);
lsb = SPI.transfer(0);
...
}
Это означает, что время транзакции SPI (когда именно она начинается) и, соответственно, время преобразования АЦП равно зависит от времени выполнения вашего кода. У вас нет хорошего контроля в это время. Это зависит от того, какие другие вещи могут быть в вашем цикле, и на другие источники прерываний (таймеры, сеть...).
По крайней мере, вы можете настроить прерывание по таймеру и запустить SPI из обработчик прерывания. Тогда ваши тайминги должны быть более последовательными. Ты все еще будет некоторое дрожание из-за задержки обработчика прерывания некоторыми критическими разделами, включая другие прерывания. Но это может быть достаточно хорошо для вашего приложения.
Для достижения наилучших результатов в идеале нужно, чтобы время было полностью управляется аппаратно. Может есть способ активировать порт SPI от таймера. Это зависит от конкретного MCU, который вы используете: вы придется копаться в таблице данных.
- Есть ли способ воспроизводить звуки с Arduino без использования звукового экрана?
- Хочу создать Bluetooth audio control (увеличение/уменьшение громкости, воспроизведение, пауза и т.д.) для смартфона
- Как подключить ардуино к разъему для наушников?
- Подключить Arduino к телефонной линии?
- DFPlayer Noise: исследован, испытан и бип бип бип бип
- Генерация белого шума звуковой частоты с помощью Arduino Mini Pro
- Транзисторный усилитель для управления динамиком с использованием ШИМ Arduino
- Как отправлять данные через I2C без проводной библиотеки?
Без какого-либо кода мы мало что можем сделать. Наличие голоса робота звучит как проблема с частотой дискретизации. Как вы устанавливаете частоту дискретизации и как вы измеряете частоту дискретизации?, @chrisl
Ваш АЦП достигает насыщения? Вы можете проверить, есть ли у вас образцы со значениями 0 или 1023. Вы уверены, что ваша частота дискретизации строго постоянна? Если ваш SPI не синхронизируется с таймером, вероятно, это не так., @Edgar Bonet
@chrisl код для чтения mcp добавлен в ссылку (из другого вопроса, где вы мне тоже помогли =)), @Revils
@EdgarBonet Я добавил код, как я его прочитал, АЦП находится в диапазоне от 100 до 200, поэтому насыщения нет. Мой SPI настроен на постоянную частоту, если вы это имеете в виду?, @Revils
И как вы отправляете сигнал напрямую на сервер? Этого нет в коде вашего предыдущего вопроса. Это может быть очень важно, так как это может испортить вашу синхронизацию, что приведет к нестабильной частоте измерения., @chrisl
Я могу добавить это сегодня вечером, это «оконный» буфер, который отправляется через UDP. Действительно хорошо, что вы на это посмотрели!, @Revils