Jump to content
Yahont7

Входной каскад АЦП, для измерения переменного напряжения

Recommended Posts

Здравствуйте коллеги, друзья и единомышленики.
Вообще моя специфика это электротехника и электрооборудование. Поскольку нередко приходится проектировать и изготовлять различные щиты, управления различного электрооборудования, то есть необходимость в различных контроллерах, которые бы измеряя параметры сети предпринимали те или иные функциональные процедуры. Да сегодня существую различные ПЛК, и прочие устройства под дин рейку на которых можно реализовать все, что угодно. Но к сожалению, либо, они дороги, либо недоступнн. Кроме того вообще ПЛК умеющих "из коробки" измерять сетевое напряжение по всем фазам (не говоря про ток)  в природе пока не встречал. Поэтому к ПЛК, приходится покупать т.н. датчики или измерители сетевых параметров, стоимость которых сопоставима с ПЛК, к тому же растет габарит щита где все это будет стоять. Так или иначе я решил научится делать хотябы простейшие контроллеры, с обычной прошивкой, которые бы могли реализовать все мои предпочтения. 
Выбрав МК STM32, подобрав схемотехнику внешних интерфейсов и исполнительных устройств.
Пока, я остановился перед выбором каким образом измерять, сетевое напряжение переменного тока. На первый взгляд почти, все производители реле напряжений используют вот такую схему:
 1180672523_.png.3d82460100f5289b36001ec74bba1b7a.png
Но мнению специалистов, эта схема плоха наличия невысокого внутреннего сопротивления самого АЦП микроконтроллера.
Поэтому рекомендуют добавить ОУ в режиме буфера:
810833882_.png.d27c71de90f0b15afaaf507d2e932bc1.png
В обоих схемах, измеряемый сигнал смещают на половину питающего/опорного напряжения, в результате теряется один бит точности АЦП.
Поиск в интернете, навел на следующие материалы:
1. Диапазон преобразования АЦП микроконтроллера можно расширить вдвое без потери точности. В схеме используются два однопериодных выпрямителя на ОУ, соответственно необходимо два входа АЦП. Соответственно хочется схема по лучше.

2. Двухполупериодный активный выпрямитель без диодов. Все прекрасно и просто, но рекомендуется использовать дорогой и труднодоступный ОУ. Простые и дешевые ОУ типа МСP6002/4, при моделировании этой, схемы (в Multisim) ее работоспособность не подтвердили. Я был не один, кто хотел ее реализовать, у котов на форуме есть обсуждение этой схемы, но там тоже судя по всему тоже успехов не достигли. Поэтому я продолжил поиск и попал на третий вариант, это...
3. Учебный материал - Прецизионные выпрямители. Предложенная схема в идеальных условиях (когда на вход подключен генератор сигналов) показала работоспособность в среде Multisim. Однако когда я дочертил высоковольтный делитель, и подал высокое напряжение, то на выходе получил также модуль синусоиды, но его амплитуда была снижена на 35-40%, от того кот. был на выходе резист делителя. В итоге в эту схему я добавил буферный каскад ОУю В итоге, схема обрела следующий вид:

1085508225_.png.925e3a343aee21dfa77364c5dd77791c.png

В этот раз моделирование уже подтвердило ожидаемые результаты:
- на выходе имеем, модуль синусоиды, причем с той же амплитудой, которая имеется на входном резистивном делителе.
- если подать напряжение превышающее номинал резист делителя, то на входе МК оно будет срезанным на уровне 3вольт.
- теперь можно использовать все 12бит АЦП, для оцифровки
Но получилась схема какая-то громоздкая на один канал напряжения.
Можно ли ее упростить, и есть ли более простые схемы решающие данную проблему??
 

Share this post


Link to post
Share on other sites

В счетчиках используются специализированные МС. Я пробовал ADE7758 - 6 АЦП 24 бит, 3 на ток и 3 на напряжения. Выдает все что угодно.

Для обработки использовал STM32F030, для моих целей вполне хватало.

Share this post


Link to post
Share on other sites
12 часов назад, Yahont7 сказал:

Выбрав МК STM32, подобрав схемотехнику внешних интерфейсов и исполнительных устройств.

Нафига, если есть спец микрухи? И входные цепи у них выглядят примерно так

image.png.01ef3e6d48e54a6f11d82e8449ea5224.png

По току

image.png.f3308d06fb03d493d802a5c8530e5cfc.png

Они есть и однофазные. Причем МК можно применить самый дешманский, т.к. всю работу выполняет микруха.

Если же так хочется делать цифровку именно на МК, то вход должен быть гальванически отвязан от сети. Иначе отладка может стать довольно занимательной и искрящей. В принципе, это касается и спец микрух. Только развязку ставят на цифровые линии.

Share this post


Link to post
Share on other sites

Популярные пружинные клеммники Degson со склада Компэл

Пружинные разъемные клеммники Degson с технологией Push-In обеспечивают надежное и безопасное электрическое соединение. При их использовании исключается возможность короткого замыкания в точке контакта, что гарантирует надежное соединение. Электрическая безопасность клеммных блоков подтверждается соответствием мировым стандартам UL, IEC и VDE.
Подробнее

Posted (edited)
37 минут назад, snn_krs сказал:

В счетчиках используются специализированные МС. Я пробовал ADE7758 - 6 АЦП 24 бит, 3 на ток и 3 на напряжения. Выдает все что угодно.

Знакомая микросхема, я ее встречал когда ремонтировал устройство АВР, от портофранко, они использовали две такие микросхема для измерения напряжений (по одной на каждый ввод). Также изучал даташит к ним, с одной стороны все классно, удобно подключить, высокая точность измерений 24бита, причем оцифровка ведется на частоте 4кГц, с точностью там все в порядке. Короче Analog Device, хорошу микросхему предлагают, но в этой бочке с медом аж две ложки дегтя, одна столовая другая чайная. Во-первых цена такой микросхемы весьма велика чтото окогло 12 долл., с другой стороны доступность также проблематична. На Украине их можно купить только в одном магазине, и то в Харькове. 
Во-вторых, я хочу чтобы МК мерял именно мгновенное значение напряжения, для анализа аварийных режимов в реалтайме, во вторых для регистрации мгновенных напряжений на карту памяти, для возможности оффлайн анализа.

Тоже задумываюсь о использовании STM32F030 или более современного аналога от STM, для непосредственной оцифровки данных, с последующей передачей по SPI, на главный МК.

Поэтому хочется разработать простую схему измерения напряжений, но с максимальной точностью для МК типа STM.

Тема использования внешних АЦП для измерения, тоже стоит рассмотрения, но при условии, минимизации цены этих устройств, а то больно они дороги. 

Edited by Yahont7

Share this post


Link to post
Share on other sites

Приглашаем на вебинар "Как сделать эффективную антенну для устройств IoT. Решения Quectel" (29.07.2021)

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

Подробнее

52 минуты назад, snn_krs сказал:

Для обработки

Да там и обработки по сути нет. Просто запомнить значения нуля по каждому каналу, а дальше простейшая арифметика.

Share this post


Link to post
Share on other sites

Решения TE Connectivity для 112 Gbps архитектуры и серверов. Перспективные решения для серверов и дата-центров

В статье дается полный обзор серий высокоскоростных разъемов IMPACT и Z-PACK, соединителей SFP- QSFP и Mini-SAS, а также разъемов и кабельных сборок для организации питания. Раскрываются преимущества и отличительные особенности данных серий высокоскоростных разъемов и области их применения.
Подробнее

Только что, BARS_ сказал:

Нафига, если есть спец микрухи? И входные цепи у них выглядят примерно так

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

 

Share this post


Link to post
Share on other sites
7 минут назад, Yahont7 сказал:

Во-вторых, я хочу чтобы МК мерял именно мгновенное значение напряжения, для анализа аварийных режимов в реалтайме,

Так микруха и это умеет. А еще умеет выводы IRQ шевелить по заданным событиям.

 

8 минут назад, Yahont7 сказал:

Тоже задумываюсь о использовании STM32F030 или более современного аналога от STM, для непосредственной оцифровки данных, с последующей передачей по SPI, на главный МК.

Т.к. частота сети всего 50Гц, то можно успеть и оцифровать, и на карту сохранить и кофе попить. Одного МК там с головой. Тем более АЦП работает через DMA. Т.е. заводим два буфера, один накопили, переключили на второй. Пока второй набираем, обрабатываем первый.

 

11 минут назад, Yahont7 сказал:

а то больно они дороги. 

Но намного дешевле готовых девайсов.

 

4 минуты назад, Yahont7 сказал:

Невозможность получать данные "в сыром виде"

Можно вообще получить данные в виде сырых данных оцифровки, насколько я помню. Ну да ладно. По поводу организации входных цепей. Логичнее всего поставить готовый датчик напряжения, той же фирмы LEM. Питание +/-15В, на выходе переменка. Ее достаточно привести к желаемому уровню и сместить по напряжению.

Share this post


Link to post
Share on other sites
Только что, BARS_ сказал:

Так микруха и это умеет. А еще умеет выводы IRQ шевелить по заданным событиям.

В описании регистров на стр. 60 нет параметров тока и напряжения мгновенного значения, только RMS.
Микруха действительно хороша, особенно для счетчиков, но надо мерить и реагировать на мгновенные величины, на три канала по напряжению, на четыре по току с частотой дискретизации до 10кГц (если идет речь о регистрации данных, полной или частичной).
Микруха эта стоит столько скольо все остальное железо вместе взятое (для среднего гаджета на 2-3 дин места), это не приемлемо. 
потому стоит зачала из простых и доступных компонентов создать схемотехнику, измерения, регистрации и реагирования на происходящее в сети.
Я еще забыл упомянуть о том что есть планы, реализации гармонического анализа до 40-64гарм. Так что надо искать пути в плане схемотехники попроще.

Точность АЦП в 12бит, как по мне способна реализовать измерения параметров промышленной сети на уровне 1% точности (при хорошей схемотехники драйвера АЦП). Во многих сферах приложений этого достаточно, если же использовать внешний АЦП разрядностью 14-16бит можно достичь точность измерений на порядок выше до 0,1%. Использовать АЦП в 24бита уже избыточно, и безполезно ибо класс точнсоти резисторов в  делителях более 0,1%, я не встречал (точнее говоря есть прецизионные резист. более высокого класса, но это труднодоступная и дорогая тема).

Потому для меня вопрос, реализации схемы драйвера АЦП, актуальна.

PS: Для измерений с точностью 14бит, можно использовать МК EFM8LB1 (от Silicon Labs) пример реализации точного вольтметра там же. Но пока нет желаний изучать детали программирования и его, довольно мне STM32 изучать.

Share this post


Link to post
Share on other sites
1 минуту назад, Yahont7 сказал:

Точность АЦП в 12бит, как по мне способна реализовать измерения параметров промышленной сети на уровне 1% точности

Ну так ставить датчики напряжения и не морочить голову. Выход у него токовый, амплитуда задается сопротивлением нагрузочного резистора. Плюс сразу получаем гальваноразвязку от сети. Если по размерам не подходят, то можно взять ОУ с развязкой. Но они, как правило, дороже.

 

3 минуты назад, Yahont7 сказал:

STM32

Огромный плюс STM32 в наличии возможности набирать буфер отсчетов АЦП в фоне, без участия ядра МК. А та же G серия умеет еще и сразу простенькую арифметику при этом производить. Плюс имеет блоки цифровых фильтров. 

Share this post


Link to post
Share on other sites
Posted (edited)
7 минут назад, BARS_ сказал:

Ну так ставить датчики напряжения и не морочить голову. Выход у него токовый, амплитуда задается сопротивлением нагрузочного резистора. Плюс сразу получаем гальваноразвязку от сети. Если по размерам не подходят, то можно взять ОУ с развязкой. Но они, как правило, дороже.

 

Огромный плюс STM32 в наличии возможности набирать буфер отсчетов АЦП в фоне, без участия ядра МК. А та же G серия умеет еще и сразу простенькую арифметику при этом производить. Плюс имеет блоки цифровых фильтров. 

Не знаю таких датчиков. Если опираться на последнюю схему драйвера указанную в первом посту. То, можно все три фазы мониторить одним МК непосредственно. Следующим образом.
1401281865_.thumb.png.db542e150767c37199bd2754fab7ffdb.png

Громоздко однако, хотелось бы по компактнее. А вот ток мониторить по трем фазам уже надо раздельно, хотя если использовать измерительные трансформаторы тока на плату, то можно одним МК мерить все напряжения по-фазно вместе с токами. 

Edited by Yahont7

Share this post


Link to post
Share on other sites
1 минуту назад, Yahont7 сказал:

Не знаю таких датчиков.

Фирма LEM.

 

1 минуту назад, Yahont7 сказал:

можно все три фазы мониторить одним МК непосредственно

Пока не отвалится нейтраль. Опять же, схема гальванически связана с сетью, т.е. программатор уже не ткнешь в нее. Плюс, иногда, измеряют напряжения между фазами без нейтрали.

 

4 минуты назад, Yahont7 сказал:

Громоздко однако,

Не особо, 3 микрухи в SOIC корпусах и горсть SMD резисторов.

Share this post


Link to post
Share on other sites
Только что, BARS_ сказал:

Фирма LEM.

Знаю такую контору, это продукты класса премиум, они дороги и очень труднодоступны, в Украине ни один магазин такое не продает, даже самые крупные. В схеме ИБП Riello SDL 3300 видел в цепях измерения тока, конкретно, это LAH 50-P, которые можно купить на диджикеи, 23 доллара за штуку! Но этот датчик может мерять высокочастотные токи, в цепях инверторов и приводе они необходимы.

 

Только что, BARS_ сказал:

Пока не отвалится нейтраль. Опять же, схема гальванически связана с сетью, т.е. программатор уже не ткнешь в нее. Плюс, иногда, измеряют напряжения между фазами без нейтрали.

Да я конечно же это учитываю. Может и монтажник перепутать клеммы, и N подать фазу..
Для отладки системы в целом, можно пойти на хитрость - использовать трехфазный тр-р, или тройки мелких однофазных, на каждом из них подмотать пару витков провода поверх обмоток, потом конца их подать прямо в схему на выход резистивного делителя, а первичное напряжение плавно регулировать ЛАТРОм. Для отладки ПО МК пойдет и так, без искр и огня. Если же придется подключать свой гаджет, к сети RS485 и/или Ethernet, тогда внутри схемы надо применять драйверы этих интерфейсов на опто развязке.Для этого надо делать БП гаджета на изолированном обратноходе с питанием от линейного напряжения (тогда не страшно отвал нейтрали). Есть у меня уже одна идейка на этот счет, но это уже другая тема для обсуждения может создам ее отдельно в другой ветки форума.  

5 минут назад, BARS_ сказал:

Не особо, 3 микрухи в SOIC корпусах и горсть SMD резисторов.

Значит можно смело реализовать эту идею в железе?

Share this post


Link to post
Share on other sites
Только что, Yahont7 сказал:

они дороги и очень труднодоступны

Ну не знаю, у нас в том же чипдип свободно продаются. Серия LV стоит в районе 2000р.

 

1 минуту назад, Yahont7 сказал:

драйверы этих интерфейсов на опто развязке

Опторазвязка - прошлый век. Смотреть надо в сторону Si86xx и аналогичных. Для RS вообще есть драйвера со встроенной развязкой.

 

3 минуты назад, Yahont7 сказал:

тогда не страшно отвал нейтрали

А как питание повлияет на нейтраль?

 

4 минуты назад, Yahont7 сказал:

можно смело реализовать эту идею в железе?

Как минимум проверить в виде макета. Только резисторы входного делителя ставить размером не менее 1206.

Share this post


Link to post
Share on other sites
Только что, BARS_ сказал:

А как питание повлияет на нейтраль?

Если питание МК идет от отдельной обмотки обратноходового тр-ра, то по идеи для МК фиолетово заходит ли фаза или нейтраль на клемму N. Единственное, но.. будет выделена мощность на резистивных делителях 160мВт, что есть аварийным режимом эксплуатации. Ничего не сгорит.

Только что, BARS_ сказал:

Опторазвязка - прошлый век. Смотреть надо в сторону Si86xx и аналогичных. Для RS вообще есть драйвера со встроенной развязкой.

А если сделать так:
1366744266_.png.00a900e80e8c034f9e78c900f49feea3.png

Share this post


Link to post
Share on other sites

Adum хуже по параметрам, чем Si. Да и транзистор там непонятно зачем.

Я раньше делал так

image.png.97b867cd3b8e14aadf18b51e93934ee7.png

Сейчас перешел на вот такие микрухи

image.png.890fef7014d1caa7c06f5319beabce9b.png

 

Share this post


Link to post
Share on other sites

Вы используете более дорогие микросхемы таже АДМ2486 стоит в три дороже.
Дороговизна этой микрухи очевидно обусловлена пропускной способность в 20Мбит/с. Для сетей RS485 при протоколе Modbus RTU, обычно используют скорость не более 115кБит/сек, потому там подойдет самый дешевый драйвер RS485, с пропускной способностью в 1Мбит/с.
 

Если же говорить про SI8641EC-B-IS1, то это вообще крутая микруха, хотябы скоростью в 150Мбит/сек, но в нашем случае см. выше, тоже может быть заменена (без ухудшения всей системы в целом) на более дешевые решения. Как то так.

Share this post


Link to post
Share on other sites
59 минут назад, Yahont7 сказал:

подойдет самый дешевый драйвер RS485, с пропускной способностью в 1Мбит/с.

Как правило, более скоростные драйвера обеспечивают больший ток на выходе, а значит имеют меньше проблем на длинных линиях.

 

1 час назад, Yahont7 сказал:

таже АДМ2486 стоит в три дороже.

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

 

1 час назад, Yahont7 сказал:

SI8641EC-B-IS1, то это вообще крутая микруха

Если взять 8631 (41 у меня избыточна, 1 канал не используется), то при тех же параметрах она стоит сопоставимо с ADUM, имея при этом лучшие параметры и меньший корпус.

Share this post


Link to post
Share on other sites
1 час назад, BARS_ сказал:

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

Это сильный аргумент, который круто меняет всю раскладку в пользу ADM2486.
Зашел на их сайт, почитал документацию из интересного:
1. AN-960 RS-485/RS-422 Circuit Implementation Guide там на стр 9. привлекла внимание схема включения микросхемы ADM2485. Согласно которой в выводам D1 и D2, подключается внешний развязывающий трансформатор, который через выпрямитель и стабилизатор запитывает второую половину микросхемы. Элегантное и красивое решение. Так и хочется его использовать. Но ценник  ADM2485 в три раза выше ADM2486 еще и трансформатор КоилКрафт тоже под 4 у.е. стоит но вроде можно такие и изготавливать на заказ, дешевле выйдет.

2. AN-1179: Junction Temperature Calculation for Analog Devices RS-485/RS-422, CAN, and LVDS/M-LVDS Transceivers здесь насчет тепловых расчетов и потребляемой мощности, полезная инфа.

Но документа по рекомендациям насчет обвязки нет, да и гугл както мало чего дает.
По их документам создается впечатление, что ни каких защит выходного интерфейса RS485 делать не надо..
Или все-же надо, как обычно на супрресорах и самовосстанавливающихся предохранителях?

Share this post


Link to post
Share on other sites

Как показывает практика, если блоки стоят в пределах одной-двух стоек, то защита для RS особо и не требуется. По крайней мере, у меня ADM3078 ни разу не сгорали. Максимум, что было замечено - периодические ошибки при приеме длинных пакетов, когда много силовухи работало. Сейчас для надежности ставлю USBLC6-2SC6 на линию RS. Это сборка TVS диодов. И синфазный дроссель.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Это точно. Наверно у людей очень много свободного времени, чтобы тратить его на всю эту воду.  Спасибо за резисторы, тоже вариант, от сварок как раз есть.  Но уже токовые клещи в пути)). Скоро все будет)). 
    • круто,фулл сетап.  экран на трансе радует. ями тож норм)) теперь бы пластинок с любимыми остами)
    • Ну не знаю... По моему, пока не нарисовали ничего достойнее "Ежика в тумане"!! Или я мало смотрю мультиков. Из последнего понравившегося -  мульт "Кин дза дза" (мультиплицированая экранизация). Но таки ощущается некоторый диссонанс восприятия, поскольку ранее просмотреный одноимёный фильм тоже весьма  хорош,  и по сценарию и по работе актёров!!! С уважением, Сергей
    • Руслан, привет. Тестовый режим решил запустить, чтобы точно знать, где собака зарыта. Не хочется лишний раз разбирать морозилку, она, к приезду детей с внуками, забита битком. Знаю, что проблема в заслонке, её вообще не слышно, а вот что в этой системе заглючило, моторредуктор, геркон, или сам модуль, буду разбираться. Удивляет, что модуль этого типа холодосов, никак не реагирует на отсутствие импульсов от геркона и не выдаёт никакой ошибки. Видимо производитель решил убрать из новых модулей индикацию ошибок, чтобы не провоцировать наших рукастых и головастых "Кулибиных" на самостоятельный ремонт, а то их АСЦ, из-за таких как я людей, остаются без работы. Я бы не стал заморачиваться с ремонтом своей СБТ и СБТ друзей и родственников, если бы в нашей Лазаревской имелся бы хоть какой-то СЦ, или хотя бы мало-мальски грамотный спец по её ремонту. Но ведь ближайший СЦ находится в центральном районе г. Сочи, а это 86 км от меня. На дом,  сюда в Лазаревское, никто из мастеров из этого СЦ приезжать не будет, предлагают везти этот "шкаф" к ним туда. Ну очень дорогой ремонт получится, с учётом того, что ехать туда 2,5 часа по сплошной пробке, а в легковушку этот гаджет не поставишь. В ринципе, я этот алгоритм входа в тестовый режим нашёл, но проверить так это, или нет, смогу только разобрав морозилку. Если работа в тестрежиме подтвердится, сообщу сюда, а заодно опишу симптомы неисправности и что же, всё-таки, за неисправность это была. 
    • У вас плохой день? В 1978 году один из основателей Apple Рональд Уэйн продал 10% акций компании за 800 долларов. Сегодня они стоят $58 млрд.
  • Similar Content

    • By yakutyonok7
      Нужен аналог индикатора ИЖЦ4-14/7 и АЦП КР572ПВ13. Кто-нибудь может подсказать? Нужно для курсового проекта 
    • By Ivarrr
      Помогите понять где ошибка... не получается реализовать попеременный опрос 2ух каналов АЦП. Данные с одного канала должны передаваться на первый индикатор как напряжение, а со второго, соответственно на второй индикатор как сила тока.
       
      #define F_CPU 8000000U
      #include <avr/io.h>
      #include <avr/interrupt.h>
      #include <stdlib.h>
      #include <util/delay.h>
      #define INDICATOR PORTD
      #define RANK PORTB
      unsigned int UR1=0, UR2=0, UR3=0, UR4=0; //переменные для деления на разряды значения напряжения
      unsigned int IR1=0, IR2=0, IR3=0, IR4=0; //переменные для деления на разряды значения силы тока
      int GainControl=1;
      int current_ch=0;
      float I, U;
      unsigned char voltage, current;
      unsigned int NUMS [10] = {0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000}; // от 0 до 9
      int main(void)
      {
          DDRB=0xFF; PORTB=0x00; //ножки порта B для разряда
          DDRC=0x00; PORTC=0x00; //ножки порта C для АЦП
          DDRD=0xFF; PORTD=0xFF; //ножки порта D для индикаторов
          
          TCCR0 |= (1<<CS01); TCCR0 &= ~((1<<CS00) | (1<<CS02)); //настройка частоты таймера f/8
          TIMSK |= (1<<TOIE0); //разрешение прерываний по переполнению таймера
          TCNT0=0; // обнуление счетчика
          
          ADCSRA |= ((1<<ADEN) | (1<<ADSC) | (1<<ADPS2)); // запуск АЦП, запуск преобразования, предделитель 16
          ADCSRA &= ~((1<<ADFR) | (1<<ADIF) | (1<<ADPS1) | (1<<ADPS0)); // режим преобразвания прерывестый, флаг перобразования опущен, предделитель 16
          ADMUX |= ((1<<REFS0) | (1<<REFS1)); //источник опорного напряжения 2.56В
          ADMUX &= ~((1<<ADLAR) | (1<<MUX0) | (1<<MUX1) | (1<< MUX2) | (1<<MUX3)); // направление записи, измерительная ножка ADC0;
          
          sei(); // вкл прерывания
          while (1) 
          {
              if (ADCSRA & (1<<ADIF))
              {
                          U_Convert((U*5.00/1024)*100);
                          I_convert((I*5.00/1024)*100);
              }
          }
      }
      void U_Convert (unsigned int U_num)  //деление на разряды напряжения
      {
          UR1=U_num/100;
          UR2=U_num%100/10;
          UR3=U_num%10;
      }
      void I_convert (unsigned int I_num) //деление на разряды тока
      {    IR1=I_num/100;
          IR2=I_num%100/10;
          IR3=I_num%10;
      }
      ISR (TIMER0_OVF_vect)
      {        
          if (GainControl == 1) {INDICATOR = 0b11111110; RANK = NUMS[UR1];} //отображение 1ого разряда напряжения
          if (GainControl == 2) {INDICATOR = 0b11111101; RANK = NUMS[UR2];} //отображение 2ого разряда напряжения
          if (GainControl == 3) {INDICATOR = 0b11111011; RANK = NUMS[UR3];} //отображение 3ого разряда напряжения    
          if (GainControl == 4) {INDICATOR = 0b11110111; RANK = NUMS[IR1];} //отображение 1ого разряды силы тока
          if (GainControl == 5) {INDICATOR = 0b11101111; RANK = NUMS[IR2];} //отображение 2ого разряды силы тока
          if (GainControl == 6) {INDICATOR = 0b11011111; RANK = NUMS[IR3];} //отображение 3ого разряды силы тока
          GainControl++;
          if (GainControl > 6) GainControl=0; //  мониторинг переменной для управления затворами    
      }
      ISR (ADC_vect) 
      {
          if (current_ch == 0)
            {
                U = ADC;
                voltage = (U*2.56/1024)*100;
                ADMUX |= (1<<MUX0);
                current_ch = 1;
                ADCSRA |= (1<<ADSC);
            }
            else
            {
                I = ADC;
                current = (I*2.56/1024)*100;
                ADMUX &= ~(1<<MUX0);
                current_ch = 0;
                ADCSRA |= (1<<ADSC);
            }
      }
    • By Александр Шилин
      Помогите, пожалуйста, со схемой подключения ПЗС-линейки к микроконтроллеру. Задача заключается в том, чтобы определить координату падения светового пятна, сформированного линзой, в пределах линейки.
      Модель линейки TCD132D на 1024 пикселя.
      Согласно даташиту необходимо три управляющих частоты - M, CCD, SH, питающее напряжение 12 В и опорное 5 В. Все эти условия были выполнены. Данные считываются.
      Выход данных с линейки пока просто выведен на осциллограф (красный канал). 
      Я плохо понимаю физические основы работы ПЗС-линейки, но ее работа кажется мне очень странной и нелогичной.
      1) При равномерной фоновой засветке при считывании получается равномерное низкое напряжение на всех пикселях. (Рисунок 1).
      2) При закрытии части линейки чем-либо напряжение на закрытых пикселях возрастает (Рисунок 2).
      3) При включении фонарика или лазерной указки все пиксели зашкаливают, определить максимум не удается (Рисунок 3).
      Если поместить линейку в темное место и светить очень тусклым лазером, то общий уровень напряжения на пикселях высокий, а в месте попадания света наблюдается едва заметный минимум. Возможно так и должно быть и нужно просто инвертировать и усилить сигнал?
      В чем может заключаться проблема? Как грамотно снимать выходной сигнал с линейки и заводить его на АЦП МК?
      Даташит приложен снизу.




      tcd132d.pdf
    • By NicksonWer
      Доброго времени!
      Суть дальнейшего моего повествования связана с наводками на прототипе фотометрического оборудования. Вот фото данного прототипа:


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


      Далее 6 ножка ОУ подаётся на вход ацп микроконтроллера.
      Печатные платы сделаны таким образом, что схема ОУ и фотодиод расположены на одной плате, а микроконтроллера на другой – основной плате. Плата фотодиода разведена таким образом, что вход ОУ имеет земляную петлю, нижняя сторона является общей землёй:

      В целом, эта плата работает нормально. Я ее проверял питая от аккумулятора и сигнал на выходе хороший и чистый.
       
      Проблема сама вот в чём. Что когда всё собрано во едино, а точнее, прототип запитан от внешнего сетевого адаптера от ноутбука, то сигнал превращается в бороду:

      Судя даже по этому показометру, размах равен около 35-40 мв при частоте в 50 Гц.  И когда я просто подношу ладонь к плате фотодиода на расстояние в 20-50 мм, то размах увеличивается уже за 100 мв.
      Тут нужно пояснить вот какой факт. Сейчас я питаю схему ОУ и фотодиода от отдельного аккумулятора (его видно на фото ниже), Так я думал, что питая от общего источника аналоговую часть и цифровую, даёт такой результат.

      Но как показала практика, что питать от аккумулятора, что от общего источника, результат одинаковый.
       
      Как выяснилось, даже если отключить питание от цифровой части (тумблер по положительному полюсу питания), а аналоговая питается от аккумулятора, то на показометре картина остаётся той же, видна та же борода.
      Но если выдернуть провод питания от этой конструкции, то результат на показометре следующий:

      Размах снизился до менее 10 мв и частота увеличилась примерно до 400 Гц. Вероятно тут уже собственные шумы показометра + незначительные наводки на схеме ОУ. Пока писал этот текст включил приборчик, чтобы посмотреть на его показания с отключённым щупом, вот результат:

      Вердикт.
      Проблему в том, что устройство питается от сети. Как побороть эту беду?
      P.s. Есть еще один интересный момент. Когда я пальцем дотрагиваюсь до полигона, но борода исчезает, как будто я действую как-то своей ёмкостью на схему.

      Документ Microsoft Word (2).pdf
    • By artos5
      Приветствую всех на этом форуме!
      Есть необходимость измерять сигнал при помощи данного АЦП. С помощью этого АЦП можно измерять 4 аналоговых не дифференциальных сигнала . Схема следующая:
      Schematic_Temp_opto_sens_V2_20190817124112.pdf
      Картинками с более низким разрешением:
      библиотеку за основу взял эту:
      https://github.com/nsaspook/nidaq700/blob/master/supermoon/example/ADS1220.c
      Путем незначительного допиливания, получилась такая библиотека:
       
      Поправил только эти функции:
      void ADS1220SendByte(unsigned char Byte) { unsigned char Result = 0x01, i=0, flg=0; MOSI_LO; Delay_us(1); for(i=0;i<8;i++) { SCK_LO; //ADC_CLK=0 Delay_us(4); if (flg) MOSI_LO; Delay_us(1); SCK_HI; //ADC_CLK=1 Delay_us(1); if (Byte&Result){ MOSI_HI; flg=1; } else MOSI_LO; Delay_us(4); Result<<=1; } SCK_LO; //ADC_CLK=0 } unsigned char ADS1220ReceiveByte(void) { unsigned char Result = 0, i=0; for(i=0;i<8;i++) { Result<<=1; SCK_LO; //ADC_CLK=0 Delay_us(5); //Delay_us(5); SCK_HI; //ADC_CLK=1 Delay_us(3); if (MISO) Result++; Delay_us(2); } SCK_LO; //ADC_CLK=0 return Result; } И добавил эту функцию:
      void ADS1220Config_MUX_GAIN(uint8_t mux, uint8_t gain) { unsigned Temp; ADS1220ReadRegister(ADS1220_0_REGISTER, 0x01, &Temp); // clear prev value; Temp &= 0x0f; Temp |= gain; Temp |= mux; // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_0_REGISTER, 0x01, &Temp); ADS1220ReadRegister(ADS1220_1_REGISTER, 0x01, &Temp); // clear prev DataRate code; Temp &= 0x1f; Temp |= (ADS1220_DR_600 + ADS1220_CC); // Set default start mode to 600sps and continuous conversions // write the register value containing the new value back to the ADS ADS1220WriteRegister(ADS1220_1_REGISTER, 0x01, &Temp); } ADS1220.h :
      в результате получаю такую осциллограмму :

      То есть , постоянно считывается 0.
      А вот регистры конфигурации:
      Задаю номер входа MUX и усиление :
       

       
      Читаю данные так:
      ADS1220Config_MUX_GAIN(ADS1220_MUX_0_G, ADS1220_GAIN_1); HAL_Delay(10); temp_[0] = ADS1220ReadData(); Это для 0 канала. 
      Пробовал и так:
      ADS1220SetChannel(ADS1220_MUX_0_G); ADS1220SetGain(ADS1220_GAIN_1); temp_[0] = ADS1220ReadData(); Результат аналогичный. Кто что подскажет? Может кто заметит какой косяк в коде? Уже голова дымит ..
×
×
  • Create New...