Jump to content

    

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

Hei!

 

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

 

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

 

Untitled_1.png

 

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

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

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

Спасибо!

Edited by rtype

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

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

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

Share this post


Link to post
Share on other sites
Есть вариант внешнего гуна на несколько диапазонов,

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

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

Share this post


Link to post
Share on other sites
Тактирование системной шины 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.

Edited by rtype

Share this post


Link to post
Share on other sites
трогать тактовую нет резона - она нужна для измерения измеряемого параметра.

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

Share this post


Link to post
Share on other sites
Вместо внешнего генератора на двух инверторах можно использовать встроенный генератор микроконтроллера. Для частот 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). как-то модифицировать эту библиотеку сил я в себе не нашел, т.к. результат не понятен, а методика с частотой генератора уже работает.

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

А почему до сих пор не прозвучало заветное ключевое слово "capture"?

Share this post


Link to post
Share on other sites

Hei!

 

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

image.png

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

 

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

image.png

image.png

 

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

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

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

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

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

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

Спасибо!

 

 

 

Share this post


Link to post
Share on other sites
Помогите пожалуйста с идеями

 

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

Share this post


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

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

Share this post


Link to post
Share on other sites
Покажите пожалуйста, очень интересно!

 

Запросто.

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 можно подключать к схеме хоть просто куском МГТФа, а правую - через экранированный кабель почти любой длины, его емкость не влияет на результат измерения.

 

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

 

 

 

Share this post


Link to post
Share on other sites

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

Share this post


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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this