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

RC генератор на STM32 (генератор с переменным конденсатором)

Hei!

 

Помогите пожалуйста с идеями, как реализовать генератор на STM(8,32 - не важно) с внешним переменным конденсатором.

 

блок схема примерно такая:

 

Untitled_1.png

 

конденсатором определяется частота генератора, которая, в свою очередь, измеряется таймерами и пр.

Сделать RC цепочку - запускать и останавливать таймер или сбрасывать его по прерыванию весьма нестабильный вариант, я уже пробовал.

использовать внешние элементы для генератора - оно уже так работает, хочу убрать всю схему внутрь процессора.

Спасибо!

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

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


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

Тактирование системной шины SYSCLK можно настроить от встроенного генератора HSI (8МГц). К генератору HSЕ вместо кварцевого резонатора подключить по схеме замещения внешний переменный конденсатор с индуктивностью.

 

В Clock configuration register (RCC_CFGR) настроить MCO: Microcontroller clock output на HSE clock select. Это будет выход генератора. Его можно соединить со входом таймера, чтобы мерить частоту.

 

Кроме того, RTC может тактироваться от внешнего HSE (с делителем /128) и выдавать частоту делённую на 64 на выход CCO: Calibration clock output.

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


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

Это лишено практического смысла.

 

Есть вариант внешнего гуна на несколько диапазонов, с классическим управлением через два таймера с накоплением и одновременным сбросом. Вариант имеет право на жизнь в случае использования stm32f105-107 и кварца OXCO. Получится прибор с рыночной стоимостью около 500к рубликов, и запредельной точностью фазы и частоты. Выше только атомный стандарт.

Но зачем такое дома? После постановки задачи и условий - можно начинать закупаться детальками.

Можно сделать всё то-же самое из подножного хлама, качество будет соответствующим, но программное обеспечение практически инцидентным с дорогим вариантом.

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


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

Есть вариант внешнего гуна на несколько диапазонов,

Как я понял - ТС-у нужно просто изучить таймеры своего МК. Для этого есть юзермануал на сайте STM.

Плюс - изучить работу PLL.

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


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

Тактирование системной шины SYSCLK можно настроить от встроенного генератора HSI (8МГц). К генератору HSЕ вместо кварцевого резонатора подключить по схеме замещения внешний переменный конденсатор с индуктивностью.

 

В Clock configuration register (RCC_CFGR) настроить MCO: Microcontroller clock output на HSE clock select. Это будет выход генератора. Его можно соединить со входом таймера, чтобы мерить частоту.

 

Кроме того, RTC может тактироваться от внешнего HSE (с делителем /128) и выдавать частоту делённую на 64 на выход CCO: Calibration clock output.

 

трогать тактовую нет резона - она нужна для измерения измеряемого параметра.

Таймер перепускать я пробовал, но, стабильность такого варианта оказалась хуже, чем измерять внешний генератор на двух инверторах:

повторяемость результата измерения процентов 70, а с генератором около 95%.

Изменение частоты внешнего генератора у меня 10-50kHz.

предполагаемый процессор - stm8f003 или stm32f030.

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

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


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

трогать тактовую нет резона - она нужна для измерения измеряемого параметра.

Вместо внешнего генератора на двух инверторах можно использовать встроенный генератор микроконтроллера. Для частот 10-50kHz подойдёт LSE. Вместо часового кварца между выв. OSC32_IN и OSC32_OUT включить контур с внешним переменным конденсатором и катушкой. Мерить частоту относительно тактовой, как описано в «Calibration of the HSI» Reference manual, только наоборот, частоту HSI принять константой и вычислять частоту LSE.

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


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

Вместо внешнего генератора на двух инверторах можно использовать встроенный генератор микроконтроллера. Для частот 10-50kHz подойдёт LSE. Вместо часового кварца между выв. OSC32_IN и OSC32_OUT включить контур с внешним переменным конденсатором и катушкой. Мерить частоту относительно тактовой, как описано в «Calibration of the HSI» Reference manual, только наоборот, частоту HSI принять константой и вычислять частоту LSE.

 

Спасибо!

катушки у меня нет за ненадобностью - только RC генератор, где конденсатор (емкость и ESR) зависит от измеряемого параметра. генератор конечно можно сократить до пары транзисторов.

Ваш вариант вполне годный для stm32, где RTC есть, но и тогда часы перестанут работать, что тоже плохо, энергопотребление сложнее снизить будет.

основной кандидат - stm8s003: я уже пробовал STM8S touch sensing key lib - там интересный алгоритм измерения емкости, но тоже не смог добиться более-менее повторяемых результатов (емкость конденсатора у меня на порядки больше, чем для touch key). как-то модифицировать эту библиотеку сил я в себе не нашел, т.к. результат не понятен, а методика с частотой генератора уже работает.

Работасть с таймерами и прерываниями тоже не получилось с годным результатом.

 

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


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

Timer в STM32 может одновременно генерировать сигнал и измерять частоту. Один канал настраиваете на генерирование, а на другой

канал поступают импульсы для измерения пропущенные через RC цепочку. Импульсы пропускаете через RC цепочку, через триггер Шмидта и измеряете длительность импульса. Вообще вариантов может быть много.

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


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

Hei!

 

Самогенерация (RC генератор на логических инверторах). Частота изменяется примерно 5..100кГц, рабочий режим примерно 10..50.

image.png

в этом режиме все работает приемлемо, стабильность генерации достаточная, девиация частоты 5% в в течение минуты меня устраивает.

 

Таже RC цепочка - интегратор, подключенная к генератору - для примера достаточно крайние значения частот.

image.png

image.png

 

очевидно, что добротность фильтра крайнее низкая. Это собственно и есть один из параметров измерения (меняется емкость и ESR).

Поэтому измерение длительности импульса счетчиком получается плохо.

при низкой частоте импульсов (примерно 5..10кГц) длительность импульса плавает на 20% между повторными измерениями.

при высокой частоте, уровень сигнала низкий, усиливать его - поставить теже внешние элементы.

Хочу также пояснить, что я не являюсь программистом или специалистом по однокристальным МК.

Как запустить таймер управляемый от RC, желательно без прерываний?

Спасибо!

 

 

 

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


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

Помогите пожалуйста с идеями

 

Я что-то не пойму, Вам что измерить надо? Емкость датчика? Так есть более вменяемые методы, чем генератор заводить. И на современных микроконтроллерах очень удобно реализуются, нужен будет только один внешний операционник (правда быстродействующий и с полевиками на входе) плюс пара-тройка резисторов/конденсаторов.

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


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

Я что-то не пойму, Вам что измерить надо? Емкость датчика? Так есть более вменяемые методы, чем генератор заводить. И на современных микроконтроллерах очень удобно реализуются, нужен будет только один внешний операционник (правда быстродействующий и с полевиками на входе) плюс пара-тройка резисторов/конденсаторов.

Покажите пожалуйста, очень интересно!

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


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

Покажите пожалуйста, очень интересно!

 

Запросто.

post-6610-1496056581_thumb.png

 

На картинке:

 

Cx - собственно датчик.

 

С2 - опорный конденсатор, его емкость для простоты можно выбрать как 2*Cxmax.

 

V2R4 - ну типа ножка порта GPIO, среднепотолочная. Там сигнал возбуждения, для простоты - меандр от таймера.

 

Вывод OUT подключается ко входу АЦП контроллера. Запуск преобразования производится в моменты времени 0.25Т (половина времени нуля на выводе EXC) и 0.75Т (половина времени единицы на выводе EXC) (см. положение курсоров).

 

Потом берем разность между двумя измерениями, результат будет такой:

 

V(0.25T)-V(0.75T)=V(EXC)*Cx/C2 => Cx=C2*(V(0.25T)-V(0.75T))/V(EXC).

 

Усреднения и прочие пироги добавлять по вкусу.

 

Прелести такой схемы в том, что левую по схеме обкладку Cx можно подключать к схеме хоть просто куском МГТФа, а правую - через экранированный кабель почти любой длины, его емкость не влияет на результат измерения.

 

Ну и плюс такой способ измерения нечувствителен к утечкам в конденсаторе (в разумных пределах).

 

 

 

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


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

Rst7, спасибо за развернутый ответ. Непременно на досуге опробую! В реальных применениях какой операционник использовали если не секрет?

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


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

Rst7, спасибо за развернутый ответ. Непременно на досуге опробую! В реальных применениях какой операционник использовали если не секрет?

 

Очень давно - 574УД3.

 

Потом AD8065 (правда там питание 5В было).

 

Вообще подходящих валом нынче. Я бы выбирал по параметрическому поиску у любого вменяемого производителя с 3.3В Rail-To-Rail I/O, полевики на входе, полоса единичного усиления не меньше 50-100МГц.

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


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

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

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

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

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

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

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

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

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

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