озадачился я написанием программы, которая имитирует работу PPM-кодера для 8-ми канального радиопередатчика (входные данные идут с обычного джойстика) и выдает сигнал на звуковую карту. далее он снимается и передается в передающий модуль. с железом проблем нет, передатчик есть в наличии, ждет PPM-сигнал. джойстик есть, и даже есть часть программы, которая опрашивает джой и выдает цифровые значения согласно положению осей.
а вот с созданием синтезатора подобного типа в hiasm-е не сталкивался. может кто подскажет, хотя бы на примере одного канала, как сгенерировать прямоугольный звуковой сигнал с изменяемой длительностью импульса, и какое разрешение получится на обычной звукой карточке?
p.s.
немного о самом формате:
В PPM-кодере каждый канал задается импульсом, длительностью от 700 до 2200 мкс. Границы могут немного варьироваться, в зависимости от конкретной модели аппаратуры. Среднему положению рулевой машинки соответствует импульс длительностью около 1500 мкс. Все канальные импульсы объединяются в последовательность и передаются каждые 18-20 мс. Пауза между передачей служит для синхронизации.
а вот здесь более детальная картинка PPM-фрейма: http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
Этот топик читают: Гость
Ответов: 499
Рейтинг: 1
|
|||
карма: 0 |
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
соединяем BASS_StreamCreate с обычной ячейкой памяти - Menory - и через нужные промежутки времени пеняем значение с 1 на 0 и наоборот.
|
|||
карма: 27 |
|
Ответов: 8930
Рейтинг: 823
|
|||
HikeR, небольшие задержки на пути джойстик-выход звука неизбежны, не будут-ли мешать?
|
|||
карма: 19 |
|
Ответов: 499
Рейтинг: 1
|
|||
Леонид писал(а): небольшие задержки на пути джойстик-выход звука неизбежныну, принцип такой. один раз в 20мс (период одного фрейма) опрашивается джойстик или иное устройство, положения осей запоминаются. далее простая математика, пересчитать положения в значения от 1 до 2 мс. в этих процедурах задержки настолько малы, что в миллисекундах не измеряются. компонент TimeCounter на весь цикл опроса джоя, пересчета и вывода значений на форму дает что-то около 500-900 мкс, но выводить цифры на экран с такой частотой совершенно не нужно. при отключении вывода совсем и опроса таймера раз в секунду получается 20-30 мкс. возможно дальше что-то и изменится (после добавления схемы синтезатора), но не думаю, что это будет больше времени реакции человека ;) ------------ Дoбавленo в 06.10: Dilma писал(а): через нужные промежутки времени пеняем значение с 1 на 0 и наоборот.1 - это очень мало, как я понял из описания точки Data компонента BASS_StreamCreate. он просит 2-х байтовой число, то есть 0-65535. однако чем генерировать управляющие переключением импульсы в одну микросекунду? то есть максимальная длительность одного импульса - одна миллисекунда, но разрешение у аппаратуры 512-1024, нужно передавать минимум 1 мкс сигнал. вот такая схема работает пару секунд и закрывается, даже если запускать в отдельном потоке, почему? Sleep дает задержку в 100 мкс (меньше просто сразу вылетает), Switch содержит 2 значения, 0 и 32767. |
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
[b]HikeR[/b], задержку в такой схеме надо делать
|
|||
карма: 19 |
|
Ответов: 2125
Рейтинг: 159
|
|||
HikeR писал(а): однако чем генерировать управляющие переключением импульсы в одну микросекунду?Ни одна программа, выводящая звук, не генерирует его синхронно. Сначала генерируется буфер, а потом он передаётся посредством используемого API звуковой карте. Главное - вовремя передавать подготовленные данные, т.е. когда используемое API (например BASS в нашем случае) проинформирует о том, что данные кончаются. Одна микросекунда - слишком малое время. Если каждую микросекунду менять сигнал с 1 на 0 и наоборот, то получишь частоту 500КГц. Вывод сигнала такой частоты через звуковую карту не имеет смысла (да и невозможно). Если тебе нужно вывести импульс длинной 700 мкс, то при частоте дискретизации 44100Гц это будет соответствовать приблизительно 30 сэмплам в буфере (30/44100Гц ~ 680мкс). Данные нужно готовить для всех импульсов в одном буфере. Т.е. твоя задача каждые 20мс передавать на воспроизведение буфер с подготовленными таким образом данными. |
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2025-01-10 04:30:04 |
|||
карма: 0 |
|
Ответов: 2125
Рейтинг: 159
|
|||
HikeR писал(а): библиотека bass справится с таким?Это надо у пользователей этой библиотеки спросить HikeR писал(а): каждые 2 байта описывают уровень сигнала (то есть высокий или низкий уровень). это так?Да, 2 байта это моно 16 бит или стерео 8 бит. Если у тебя есть синхропауза, то наверное можно и более короткий пакет передавать. А девайс не может цифровые данные принимать? |
|||
карма: 1 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2025-01-10 04:30:04 |
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
HikeR, я так и не смог в HiAsm-е получить 24-битный звук, хотя карта и BASS версии 2.4 его потдерживает. Ткое управление, как Вам надо, через звук, легче нарисовать в IC. Но мне кажется (тьфу, тьфу ) проще через LPT, в простых схемах он может работать с частотой обращения аж 1 МГц и свои миллисекунды там сделаете просто (если перед включением компьютера по совету Galkov-а заземлите Error )
|
|||
карма: 19 |
|
Гость
Ответов: 17029
Рейтинг: 0
|
|||
Редактировалось 2 раз(а), последний 2025-01-10 04:30:05 |
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
HikeR, 0 и 5 вольт при не очень больших нагрузках, до 5-10 мА.
|
|||
карма: 19 |
|
Ответов: 499
Рейтинг: 1
|
|||
привести напряжение к требуемому конечно не проблема, но вот к удивлению своему не обнаружил дома ни одного компа с LPT-портом
а учитывая то, что юзать собирался с ноутом, в которых lpt довольно давно нет совсем, остается только usb-lpt переходники. а как у них со скростью передачи? |
|||
карма: 0 |
|
Ответов: 8930
Рейтинг: 823
|
|||
HikeR, никогда не пользовал
|
|||
карма: 19 |
|
Ответов: 3851
Рейтинг: 159
|
|||
складывается примерно такая картинка:
1. по таймеру 20 мс опрашивается джой и формируемая по его состоянию байтовая последовательность (без синхропаузы) посылается в FTCG-контейнер для модуляции.. 2. FTCG побайтно подставляет принятую последовательность до её окончания, а затем подставляет "1" (это и есть синхропауза) до получения новой последовательности.. |
|||
карма: 0 |
|