Например TDA7294

Форум РадиоКот • Просмотр темы - stm32f103c8 генератор частоты импульсов
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт янв 08, 2026 01:46:13

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Вт сен 29, 2020 17:28:44 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
Здравствуйте, необходимо создать генератор частоты на stm32f103c8 частота 72000000 Герца, столкнулся с тем что пытаясь задать частоту генерации сигналов таймеру через регистры TIMx_PSC (регистр предделителя) TIMx_ARR (регистр автоперегрузки), не все частоты можно задать точно, некоторые вообще не возможно, например: для того чтобы задать время работы таймера с частотой 1 сек нужно записать значения в TIMx_PSC = 7200 -1 и в TIMx_ARR = 10000 - 1, а для 2 герц нужно записать TIMx_PSC = 7200 -1
и в TIMx_ARR = 5000 - 1 можно и другими значениями это сделать, а вот чтобы задать частоту генерации 7 герц то самое точное значение можно получить только если записать в TIMx_PSC = 29138 -1 а в TIMx_ARR = 353 - 1 тогда частота генерации будет равна 7.0000001944 получается 0.0000001944 это погрешность, и чем выше частота, тем выше на некоторых частотах погрешность, а для например частоты 999999 Герц вообще не существует никаких чисел и для регистра предделителя TIMx_PSC и для регистра автоперегрузки TIMx_ARR
Вопрос собственно такой так какже создаются генераторы частоты на цифровых микросхемах для всех частот хотя бы до 1 мегагерца, заранее извините за может быть глупый вопрос просто в интернете пока внятного ответа не нашёл, хотя искал много. Заранее благодарю за ответы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Вт сен 29, 2020 17:43:50 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Вопрос собственно такой так какже создаются генераторы частоты

Вариантов ДВА.
1. PLL (ФАПЧ) с дробным ДПКД.
2. DDS (прямой цифровой синтез), точнее, для импульсов достаточно ядра DDS - NCO. ПЗУ формы сигнала и ЦАП не требуются.
При использовании обычных таймеров вы получите шаг ПЕРИОДА (а не частоты) равный периоду сигнала тактирования. Шкала частоты будет нелинейна и с достаточно большим шагом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Ср сен 30, 2020 11:39:49 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
Вопрос собственно такой так какже создаются генераторы частоты

Вариантов ДВА.
1. PLL (ФАПЧ) с дробным ДПКД.
2. DDS (прямой цифровой синтез), точнее, для импульсов достаточно ядра DDS - NCO. ПЗУ формы сигнала и ЦАП не требуются.
При использовании обычных таймеров вы получите шаг ПЕРИОДА (а не частоты) равный периоду сигнала тактирования. Шкала частоты будет нелинейна и с достаточно большим шагом.



1. PLL (ФАПЧ) с дробным ДПКД. Извените, а это как должно реализовываться, аппаратно или пожно програмно реализовать. Насколько я понимаю в stm32f103c8 нет аппаратного PLL дробным ДПКД

2. DDS (прямой цифровой синтез), точнее, для импульсов достаточно ядра DDS - NCO, я так понимаю что в stm32f103c8 аппаратно это не реализовано, а как тогда это реализовать програмно и возможно ли.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Ср сен 30, 2020 12:27:57 
Электрический кот
Аватар пользователя

Карма: 4
Рейтинг сообщений: 135
Зарегистрирован: Сб мар 09, 2013 11:29:22
Сообщений: 1029
Откуда: 40RUS, Жуков
Рейтинг сообщения: 0
Вам же здесь http://forum.easyelectronics.ru/viewtop ... 1c5e250efd все разжевали.

Добавлено after 1 minute 4 seconds:
Или Вы чуда ждете?

_________________
IVL ex UA6PJ


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Ср сен 30, 2020 16:46:54 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
1. Насколько я понимаю в stm32f103c8 нет аппаратного PLL дробным ДПКД
2. я так понимаю что в stm32f103c8 аппаратно это не реализовано, а как тогда это реализовать програмно и возможно ли.

1. Правильно понимаете. Программно не реализуется.
2. Тоже правильно понимаете, но программно реализовать можно. Правда это сожрет значительную часть ресурсов МК.
Аппаратный модуль NCO мне известен только в 8-битниках Микрочипа. От PIC10F322 до PIC18FxxQ43. У последнего даже ТРИ модуля NCO.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Чт окт 01, 2020 11:54:29 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 824
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 5777
Рейтинг сообщения: 0
1. PLL (ФАПЧ) с дробным ДПКД. Извените, а это как должно реализовываться, аппаратно или пожно програмно реализовать. Насколько я понимаю в stm32f103c8 нет аппаратного PLL дробным ДПКД

2. DDS (прямой цифровой синтез), точнее, для импульсов достаточно ядра DDS - NCO, я так понимаю что в stm32f103c8 аппаратно это не реализовано, а как тогда это реализовать програмно и возможно ли.

Увы, но МК могут далеко не все. В вашем случае их разумно применять только для управления чипами синтезаторов PLL или DDS.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Чт окт 01, 2020 21:52:59 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
1. Насколько я понимаю в stm32f103c8 нет аппаратного PLL дробным ДПКД
2. я так понимаю что в stm32f103c8 аппаратно это не реализовано, а как тогда это реализовать програмно и возможно ли.

1. Правильно понимаете. Программно не реализуется.
2. Тоже правильно понимаете, но программно реализовать можно. Правда это сожрет значительную часть ресурсов МК.
Аппаратный модуль NCO мне известен только в 8-битниках Микрочипа. От PIC10F322 до PIC18FxxQ43. У последнего даже ТРИ модуля NCO.



А можете хотя бы в простой форме описать модуль NCO или аккумулятор фазы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Чт окт 01, 2020 22:06:17 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Легко.
Есть некий регистр, который выполняет функции аккумулятора (фазы), то есть содержит результат некоей суммы. К текущему значению аккумулятора суммируют значение другого регистра (назовем его инкрементным регистром) и результат сохраняют в том же аккумуляторе. Это суммирование производят с тактом опорной частоты. Переполнение аккумулятора будет происходить с частотой равной произведению опорной частоты и значения в инкрементном регистре деленному на два в степени разрядности аккумулятора.
Это все и есть модуль NCO. Он формирует события (синхронизации, триггера, прерывания) или выходной сигнал на пине с синтезируемой частотой. Если подключить этот модуль к каналу DMA в качестве реквестов транзакций, то можно с помощью таблицы формы сигнала получить полноценный DDS через DAC или PWM.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 10:37:10 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
Легко.
Есть некий регистр, который выполняет функции аккумулятора (фазы), то есть содержит результат некоей суммы. К текущему значению аккумулятора суммируют значение другого регистра (назовем его инкрементным регистром) и результат сохраняют в том же аккумуляторе. Это суммирование производят с тактом опорной частоты. Переполнение аккумулятора будет происходить с частотой равной произведению опорной частоты и значения в инкрементном регистре деленному на два в степени разрядности аккумулятора.
Это все и есть модуль NCO. Он формирует события (синхронизации, триггера, прерывания) или выходной сигнал на пине с синтезируемой частотой. Если подключить этот модуль к каналу DMA в качестве реквестов транзакций, то можно с помощью таблицы формы сигнала получить полноценный DDS через DAC или PWM.



Получается, что нужно создать глобальную переменную инициализировать её 0. Ну допустим int a = 0; - это и будет аккумулятор фазы, далее нужно создать другую переменную и инициализировать её, ну например 10, int inc = 10; это и будет инкрементным регистром, далее в обработчике прерывания нужно каждый раз, как он вызывается прибавлять к аккумулятор фазы инкрементный регистр то есть a = a + inc;
Если обработчик прерывания вызывается 1000000 раз в секунду, то переполнение аккумулятора будет происходить 1000000 * 10 = 10000000 то есть один раз в десять секунд или с частотой 0,1 Герца, хорошо, а если я хочу получить переполнение аккумулятора с частотой ну допустим 7 Герц то есть семь раз в секунду, тогда что нужно делать? Может нужно 1000000 / 7 = 142857,142857 взять ближайшее целое число делящееся на 7 это 142856 (142856 / 7 = 20408) тогда inc сделать равным 7 и тогда a = a + inc; будет a = a + 7; вызывая обработчик 1000000 раз в секунду нужно задать число для сравнения 20408/2 становясь равным которому будет инвертироваться выход микросхемы, тогда if (a == 10204) toggle // вывод микросхемы, но тогда получится большая погрешность.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 11:15:46 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 3
У вас НЕВЕРНЫЙ расчет.
При ваших условиях выходная частота будет равна 1000000*10/65536=152.587891 Гц Шаг частоты будет равен 15.2587891 Гц. А все потому, что разрядность аккумулятора мала.
Теперь возьмем uint32_t a=0;
Ситуация изменилась. Теперь шаг частоты стал 1000000/4294967296 = 0.00023283Гц
Код частоты 7 Гц = 7/0.00023283 = 30065
Реально получаем 1000000*30065/4294967296=7.0000533 Гц. Устраивает?
ЗЫ. И учтите, что вызов прерывания каждую 1 мкс при тактовой частоте МК 72МГц приведет к тому, что вы практически полностью блокируете остальные задачи МК. Из 72 машинных циклов между вызовами прерываний само прерывание будет занимать порядка 40...50 циклов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 13:38:44 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
У вас НЕВЕРНЫЙ расчет.
При ваших условиях выходная частота будет равна 1000000*10/65536=152.587891 Гц Шаг частоты будет равен 15.2587891 Гц. А все потому, что разрядность аккумулятора мала.
Теперь возьмем uint32_t a=0;
Ситуация изменилась. Теперь шаг частоты стал 1000000/4294967296 = 0.00023283Гц
Код частоты 7 Гц = 7/0.00023283 = 30065
Реально получаем 1000000*30065/4294967296=7.0000533 Гц. Устраивает?
ЗЫ. И учтите, что вызов прерывания каждую 1 мкс при тактовой частоте МК 72МГц приведет к тому, что вы практически полностью блокируете остальные задачи МК. Из 72 машинных циклов между вызовами прерываний само прерывание будет занимать порядка 40...50 циклов.



Извините, не пойму, а откуда взялась цифра 65536 в выражении 1000000*10/65536=152.587891 Гц и почему ошибка в расчёте, если если действие (изменение состояния вывода) осуществляется на 10 000 000 счёт при частоте самого счёта 1 000 000 раз в секунду получается 0,1 Герц. По поводу "вызова прерывания каждую 1 мкс при тактовой частоте МК 72МГц" полностью согласен, это я для примера можно и с частотой 10 000 Герц вызывать прерывания, просто генератор будет максимум на 10 000 Герц, мне больше и не нужно лижбы максимально точно получилась.

"Реально получаем 1000000*30065/4294967296=7.0000533 Гц. Устраивает?" - В полне устраивает, лижбы такая погрешнасть была для всех частот
Ещё вопрос разве тип данных int - 65536 он же вроде от −2 147 483 648 до 2 147 483 647;
uint32_t а что если использовать uint64_t ещё будет лучше, или для этого обязательно нужен 64 битный контроллер?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 14:31:40 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Извините, не пойму, а откуда взялась цифра 65536

Это два в степени разрядности аккумулятора. Чтобы переполнить 16-разрядный аккумулятор, нужно суммировать инкрементный регистр 65536/b раз, где b - значение инкрементного регистра. Именно во столько раз понизится частота тактирования NCO на его выходе.

Добавлено after 10 minutes 3 seconds:
а что если использовать uint64_t ещё будет лучше, или для этого обязательно нужен 64 битный контроллер?

Контроллер может вычислить практически любую разрядность операндов. Просто времени на это уйдет больше, чем при нативной разрядности.
Однако при повышении разрядности аккумулятора фазы быстро уменьшается шаг частоты, но вместе с ним уменьшается частота выходного сигнала по отношению к частоте накачки при равном коде частоты. При том условии, что вы не в состоянии поднять частоту накачки из-за софтовой реализации, это становится неразрешимой проблемой. Так что не увлекайтесь разрядностью. Плюс к этому все это не гарантирует абсолютной точности синтезируемой частоты, поскольку:
1. Кварц формирующий тактирование сам имеет неточную номинальную частоту
2. Софтовая реализация добавляет джиттер переменной латентности прерываний
3. У DDS есть собственный джиттер, определяемый коэффициентом понижения частоты относительно тактирования.
Не думаю, что есть смысл увеличивать разрешение по частоте выше семи...восьми десятичных разрядов.

Добавлено after 21 minute 49 seconds:
разве тип данных int - 65536 он же вроде от −2 147 483 648 до 2 147 483 647;

Во первых, мы не обсуждали int. Речь постоянно шла об unsigned int. Во вторых, int не означает конкретной разрядности. Чаще всего - это НАТИВНАЯ разрядность контроллера. Чтобы код был переносим и читаем, ввели переопределяемый стандартный беззнаковый тип uintXX_t, где ХХ-разрядность.
Я только о нем и говорил. В 32 разрядном варианте я расчет приводил. 2^32=4294967296


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 21:31:20 
Родился

Зарегистрирован: Вс авг 08, 2010 17:04:51
Сообщений: 18
Рейтинг сообщения: 0
Извините, не пойму, а откуда взялась цифра 65536

Это два в степени разрядности аккумулятора. Чтобы переполнить 16-разрядный аккумулятор, нужно суммировать инкрементный регистр 65536/b раз, где b - значение инкрементного регистра. Именно во столько раз понизится частота тактирования NCO на его выходе.

Добавлено after 10 minutes 3 seconds:
а что если использовать uint64_t ещё будет лучше, или для этого обязательно нужен 64 битный контроллер?

Контроллер может вычислить практически любую разрядность операндов. Просто времени на это уйдет больше, чем при нативной разрядности.
Однако при повышении разрядности аккумулятора фазы быстро уменьшается шаг частоты, но вместе с ним уменьшается частота выходного сигнала по отношению к частоте накачки при равном коде частоты. При том условии, что вы не в состоянии поднять частоту накачки из-за софтовой реализации, это становится неразрешимой проблемой. Так что не увлекайтесь разрядностью. Плюс к этому все это не гарантирует абсолютной точности синтезируемой частоты, посколькурное
1. Кварц формирующий тактирование сам имеет неточную номинальную частоту
2. Софтовая реализация добавляет джиттер переменной латентности прерываний
3. У DDS есть собственный джиттер, определяемый коэффициентом понижения частоты относительно тактирования.
Не думаю, что есть смысл увеличивать разрешение по частоте выше семи...восьми десятичных разрядов.

Добавлено after 21 minute 49 seconds:
разве тип данных int - 65536 он же вроде от −2 147 483 648 до 2 147 483 647;

Во первых, мы не обсуждали int. Речь постоянно шла об unsigned int. Во вторых, int не означает конкретной разрядности. Чаще всего - это НАТИВНАЯ разрядность контроллера. Чтобы код был переносим и читаем, ввели переопределяемый стандартный беззнаковый тип uintXX_t, где ХХ-разрядность.
Я только о нем и говорил. В 32 разрядном варианте я расчет приводил. 2^32=4294967296



Спасибо большое за разъяснения и за потраченное время, пока я не всё понимаю, видимо нужно ещё поучится, почитать книги. Просто трудно понять что вы пытаетесь объяснить не зная, наверное элементарных понятий, таких как "шаг частоты" "частота накачки" "код частоты""джиттер" буду дальше подбирать эту тему, как только получится обязательно выложу код для stm32f103c8, ещё раз спасибо.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пт окт 02, 2020 21:42:42 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
"шаг частоты" "частота накачки" "код частоты""джиттер"

Шаг частоты - величина изменения частоты при изменении кода частоты на единицу.
Частота накачки - тактовая частота DDS/NCO с которой происходит суммирование в аккумуляторе.
Код частоты - значение в инкрементном регистре (величина, на которую увеличивается значение аккумулятора фазы за один такт).
Джиттер - дрожание фронта сигнала (паразитная частотная модуляция) относительно идеального положения в стабильном сигнале.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Сб окт 03, 2020 09:48:36 
Мучитель микросхем

Карма: 5
Рейтинг сообщений: 50
Зарегистрирован: Ср янв 04, 2012 11:57:40
Сообщений: 411
Откуда: Алчевск
Рейтинг сообщения: 0
Если контроллер используется только для генерации можно накопление и вывод делать в основном цикле, а в прерываниях обеспечивать управление-настройку. Да, при управлении будет ломаться сигнал, но при обычной работе все будет чисто. При 72МГц можно попробовать получить частоту выдачи на ЦАП 2-3 МГц (за 24-36 тактов).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Сб окт 03, 2020 17:56:03 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
за 24-36 тактов

Как в основном цикле обеспечить тактирование?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Вс окт 04, 2020 19:53:35 
Мучитель микросхем

Карма: 5
Рейтинг сообщений: 50
Зарегистрирован: Ср янв 04, 2012 11:57:40
Сообщений: 411
Откуда: Алчевск
Рейтинг сообщения: 0
Я думал. Написать основной цикл, измерить время выполнения и к нему привязаться. Для пробы можно сгенерить 1 кГц и измерить частотомером, определить коррекцию. Думаю время выполнения основного while(1) не изменится от параметров задания частоты. Пробовать надо. Хотел на G071 одновременно с работой АЦП выдавать на ЦАП генерацию, не взлетело. Но это другая история.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: stm32f103c8 генератор частоты импульсов
СообщениеДобавлено: Пн окт 05, 2020 04:39:29 
Друг Кота
Аватар пользователя

Карма: 139
Рейтинг сообщений: 2919
Зарегистрирован: Чт янв 10, 2008 22:01:02
Сообщений: 24679
Откуда: Московская область, Фрязино
Рейтинг сообщения: 0
Поскольку во время основного цикла будут изменяться условия, достичь стабильности принципиально невозможно. Джиттер будет огромным.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y