Перейти к содержанию
    

Генерация ФМ сигнала

Добрый день.

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 мс.

Вот и вопрос как вообще это делается на микроконтроллерах?

Изменено пользователем aBoomest

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вы получаете обычный немодулированный сигнал? 

К примеру - если вы получаете обычный сигнал f1 = 33 кГц - с помощью таймера и ШИМ , то вы по прерыванию в регистр таймера записываете синусоиду по отчётам.

Так вот когда у вас 0 - вы записываете синусоиду, когда у вас 1- пишете минус синусоиду.

Иначе говоря инвертируете сигнал. 

Если у вас СТМ32 не формирует несущую а только выдаёт модуляцию - то надо придумать инвертор сигнала несущей частоты и коммутировать прямой и инверсный сигнал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В плис я делал так.
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: А еще вопрос, а зачем тут ШИМ? Период несущей же постоянный вроде ШИМ не нужен?

Изменено пользователем aBoomest

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13.01.2021 в 12:35, aBoomest сказал:

PS: А еще вопрос, а зачем тут ШИМ? Период несущей же постоянный вроде ШИМ не нужен?

За счёт ШИМ-а вы получите возможность в любой момент инвертировать выходной сигнал, а не только когда у вас фронт 5 мс совпадает с фронтом 3 кгц сигнала.

Иначе говоря вам надо сделать шим который имитирует ваш импульсный сигнал   f1 = 33 кГц. но с более высокочастотным заполнением.

Например делаете ШИМ генератор на частоте 660 Кгц ,который считает до 10 . На выходе получаете  ваш сигнал с частотой 33 кгц , но также получаете возможность инвертировать его не на полном периоде , а на частичном.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10.01.2021 в 23:23, aBoomest сказал:

какой должен быть организован красивый подход

Если в смысле чисто аппаратно, то вряд ли это красиво — при каждой смене полярности данных на входе, компаратор первого таймера запускает второй таймер, который создаёт одиночный импульс длительностью полпериода несущей на входе разрешения третьего таймера, работающего в режиме ШИМ 50%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...