aBoomest 0 10 января, 2021 Опубликовано 10 января, 2021 (изменено) · Жалоба Добрый день. 1. Необходимо сделать ФМ сигнал. Есть несущая частота f1. Есть описание формата импульса Sig = [0 1 0 0 1 1 0]. Т.е. при нуле на выходе сигнал f1, при 1 он же но инверсный. В общем простенькая фазовая модуляция. (никаких ЦАП, имеется ввиду 0 или 1 на выводе одного из портов stm32) Задается количество периодов основной частоты на один символ. Как реализовать генерацию такого сигнала на STM32? Я имею ввиду в целом какой должен быть организован красивый подход, красивая реализация. На плис делал такое, там как-то вроде проще, а тут надо что-ли несколько таймеров использовать? 2. Нюанс в том еще, что длительность строгая 5 мс. Если так вышло например, что задано [0 1 0 0 1 1 0] (7 символов), f1 = 33 кГц, то . . . - в 5 мс будет 165 периодов несущей. - на один символ будет 165/7 = 23,57 периодов, - т.е. реально будет 24 периода на 1 символ, - обратный пересчёт: 24*7 = 168 периодов = 5,1 мс - чуть больше, т.е. последний символ еще и обрезать надо при достижении 5 мс. Вот и вопрос как вообще это делается на микроконтроллерах? Изменено 10 января, 2021 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 11 января, 2021 Опубликовано 11 января, 2021 · Жалоба Как вы получаете обычный немодулированный сигнал? К примеру - если вы получаете обычный сигнал f1 = 33 кГц - с помощью таймера и ШИМ , то вы по прерыванию в регистр таймера записываете синусоиду по отчётам. Так вот когда у вас 0 - вы записываете синусоиду, когда у вас 1- пишете минус синусоиду. Иначе говоря инвертируете сигнал. Если у вас СТМ32 не формирует несущую а только выдаёт модуляцию - то надо придумать инвертор сигнала несущей частоты и коммутировать прямой и инверсный сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 13 января, 2021 Опубликовано 13 января, 2021 (изменено) · Жалоба В плис я делал так. 1. Формировал постоянно сигнал несущей f1 = 33 кГц. 2. Также с помощью делителя относительно f1 формировал сигнал 1 Гц (раз в секунду) - это был сиганл старта генератора. 3. Ну а после получения старта начинал считать импульсы f1 (значениие кол-ва импульсов в одном символе есть). И в соответствии с символом [0 1 0 0 1 1 0] инвертировал f1или не инвертировал и это сигнал выдавался наружу. 4. А параллельно есче считал общее кол-во импульсов и при достижении количества периодов соответствующее 5 милисикундам выходил из цикла - т.е. принудительно завершал генерацию. Поэтому в зависимости от того умещается ли целое кол-во периодов в данную последовательность последний символ мог быть слегка "урезаный". А вот как тут такое организовать - даже не представляю пока. 1. Основной клок 33 кГц допустим наверно логично сделать. 2. Получается надо запустить еще 1 таймер который будет отсчитывать 5 мс. А как их синхронизировать? Чтобы вронт 5 мс сигнала совпадал с фронтом 33 кГц сигнала. 3. Получается еще таймер на длительность симыола както надо запустить? Или как? Или просто также в памяти считать периоды основной частоты? А такое возможно? Надо както глобальную переменную для этого иметь чтоб она везде была видна и в обработчиках ПРВ и в других функциях? PS: А еще вопрос, а зачем тут ШИМ? Период несущей же постоянный вроде ШИМ не нужен? Изменено 13 января, 2021 пользователем aBoomest Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 января, 2021 Опубликовано 26 января, 2021 · Жалоба 13.01.2021 в 12:35, aBoomest сказал: PS: А еще вопрос, а зачем тут ШИМ? Период несущей же постоянный вроде ШИМ не нужен? За счёт ШИМ-а вы получите возможность в любой момент инвертировать выходной сигнал, а не только когда у вас фронт 5 мс совпадает с фронтом 3 кгц сигнала. Иначе говоря вам надо сделать шим который имитирует ваш импульсный сигнал f1 = 33 кГц. но с более высокочастотным заполнением. Например делаете ШИМ генератор на частоте 660 Кгц ,который считает до 10 . На выходе получаете ваш сигнал с частотой 33 кгц , но также получаете возможность инвертировать его не на полном периоде , а на частичном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 5 февраля, 2021 Опубликовано 5 февраля, 2021 · Жалоба On 1/10/2021 at 11:23 PM, aBoomest said: 1. Необходимо сделать ФМ сигнал. Есть несущая частота f1. Есть описание формата импульса Sig = [0 1 0 0 1 1 0]. Т.е. при нуле на выходе сигнал f1, при 1 он же но инверсный. В общем простенькая фазовая модуляция. 2. Нюанс в том еще, что длительность строгая 5 мс. Если так вышло например, что задано [0 1 0 0 1 1 0] (7 символов), f1 = 33 кГц, то . . . - в 5 мс будет 165 периодов несущей. - на один символ будет 165/7 = 23,57 периодов, - т.е. реально будет 24 периода на 1 символ, - обратный пересчёт: 24*7 = 168 периодов = 5,1 мс - чуть больше, т.е. последний символ еще и обрезать надо при достижении 5 мс. Вот и вопрос как вообще это делается на микроконтроллерах? Попробуйте сделать так. 1) Программируете один таймер1 на несимметричный шим с fШИМ=33 кГц с заполнением 50%. Для примера, если системная частота 56 МГц, то таймер должен считать до 56000/33=1697. Соответственно, регистр сравнения равен 848. Пока запускать в работу не надо. Примерный код настройки таймера1 ниже. Не забываем его включить и ноги настроить. TIM1->CCMR2=0x0068; //OC3S output TIM1->CCER=0x0400; //CC3N enable on PB1 TIM1->CNT=0x0000; //to be on the safe side TIM1->PSC=0; //48000/1=48MHz TIM1->ARR=1919; //48000/1920=25kHz TIM1->EGR=0x0001; //UG=1 TIM1->BDTR=0xD800; //moe=aoe=1 TIM1->CCR3=768; //value to compare-duty TIM1->CR1=0x0081; //APRE=1,CEN=1 2) Программируете таймер2 на 5 мс (200 Гц). Запускаете таймер2 по прерыванию. В первом прерывании запускаете таймер1 (после запуска таймер1 начнет генерить частоту 33 кГц) и начинаете подсчитывать прерывания. 3) При каждом следующем прерывании добавляете к таймеру1 половину периода таймера1 (естественно, по модулю 1697), если нужна инверсия частоты, и ничего не добавляете (для симметрии можно добавлять 0), если не нужна инверсия. 4) На последнем прерывании останавливаете таймер1, ну и таймер2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aBoomest 0 3 апреля, 2021 Опубликовано 3 апреля, 2021 · Жалоба Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 4 апреля, 2021 Опубликовано 4 апреля, 2021 · Жалоба 10.01.2021 в 23:23, aBoomest сказал: какой должен быть организован красивый подход Если в смысле чисто аппаратно, то вряд ли это красиво — при каждой смене полярности данных на входе, компаратор первого таймера запускает второй таймер, который создаёт одиночный импульс длительностью полпериода несущей на входе разрешения третьего таймера, работающего в режиме ШИМ 50%. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться