Всем привет!
Пожалуй, стоит представиться немного — я обычный инженер-схемотехник, который интересуется также программированием и некоторыми другими областями электроники: ЦОС, ПЛИС, радиосвязь и некоторые другие. В последнее время с головой погрузился в SDR-приемники. Первую свою статью (надеюсь, не последнюю) я сначала хотел посвятить какой-то более серьезной теме, но для многих она станет лишь чтивом и не принесет пользы. Поэтому тема выбрана узкоспециализированная и исключительно прикладная. Также хочу отметить, что, наверное, все статьи и вопросы в них будут рассматриваться больше со стороны схемотехника, а не программиста или кого-либо еще. Ну что же — поехали!
Не так давно у меня заказывали проектирование «Система мониторинга энергоснабжения жилого дома», заказчик занимается строительством загородных домов, так что кто-то из вас, возможно, даже уже видел мое устройство. Данный девайс измерял токи потребления на каждой вводной фазе и напряжение, попутно пересылая данные по радиоканалу уже установленной системе «Умный дом» + умел вырубать пускатель на вводе в дом. Но разговор сегодня пойдет не о нем, а о его небольшой, но очень важной составляющей — датчике тока. И как вы уже поняли из названия статьи, это будут «бесконтактные» датчики тока от компании Allegro — ACS758-100.
________________________________________________________________________________________________________________________
Даташит, на датчик о котором я буду рассказывать, можно посмотреть тут. Как несложно догадаться, цифра «100» в конце маркировки — это предельный ток, который датчик может измерить. Скажу честно — есть у меня сомнения по этому поводу, мне кажется, выводы просто не выдержат 200А долговременно, хотя для измерения пускового тока вполне подойдет. В моем устройстве датчик на 100А без проблем пропускает через себя постоянно не менее 35А + бывают пики потребления до 60А.
Рисунок 1 — Внешний вид датчика ACS758-100(50/200)
Перед тем, как перейду к основной части статьи, я предлагаю вам ознакомиться с двумя источниками. Если у вас есть базовые знания по электронике, то они будут избыточными и смело пропускайте этот абзац. Остальным же советую пробежаться для общего развития и понимания:
1) Эффект Холла. Явление и принцип работы
2) Современные датчики тока
________________________________________________________________________________________________________________________
Ну что же, начнем с самого важного, а именно с маркировки. Покупаю комплектующие в 90% случаев на www.digikey.com. В Россию компоненты приезжают через 5-6 дней, на сайте есть пожалуй все, также очень удобный параметрический поиск и документация. Так что полный список датчиков семейства можно посмотреть там по запросу "ACS758". Датчики мои были куплены там же — ACS758LCB-100B.
Внутри даташита по маркировке все расписано, но я все равно обращу внимание на ключевой момент "100В":
1) 100 — это предел измерения в амперах, то есть мой датчик умеет измерять до 100А;
2) "В" — вот на эту букву стоит обратить внимание особо, вместо нее может быть также буква "U". Датчик с буквой B умеет измерять переменный ток, а соответственно и постоянный. Датчик с буквой U умеет измерять только постоянный ток.
Также в начале даташита есть отличная табличка на данную тему:
Рисунок 2 — Типы датчиков тока семейства ACS758
Еще в данной таблицы появился еще один важный параметр — зависимости выходного напряжения от тока. Прелесть данного типа датчиков в том, что у них выход напряжения, а не тока как у классических трансформаторов тока, что очень удобно. Например, выход датчика можно подсоединить напрямую ко входу АЦП микроконтроллера и снимать показания.
У моего датчика данное значение равно 20 мВ/А. Это означает, что при протекании тока 1А через выводы 4-5 датчика напряжение на его выходе увеличится на 20 мВ. Думаю логика ясна.
Следующий момент, какое же напряжение будет на выходе? Учитывая, что питание «человеческое», то есть однополярное, то при измерение переменного тока должна быть «точка отсчета». В данном датчике эта точка отсчета равна 1/2 питания (Vcc). Такое решение часто бывает и это удобно. При протекании тока в одну сторону на выходе будет "1/2 Vcc + I*0.02V", в другом полупериоде, когда ток протекает в обратную сторону напряжение на выходе будет уже "1/2 Vcc — I*0.02V". На выходе мы получаем синусоиду, где «ноль» это 1/2Vcc. Если же мы измеряем постоянный ток, то на выходе у нас будет "1/2 Vcc + I*0.02V", потом при обработке данных на АЦП просто вычитаем постоянную составляющую 1/2 Vcc и работаем с истинными данными, то есть с остатком I*0.02V.
Теперь пришло время проверить на практике то, что я описал выше, а вернее вычитал в даташите. Чтобы поработать с датчиком и проверить его возможности, я соорудил вот такой «мини-стенд»:
Рисунок 3 — Площадка для тестирования датчика тока
Первым делом я решил подать на датчик питание и измерить его выход, чтобы убедиться в том, что за «ноль» у него принято 1/2 Vcc. Схему подключения можно взять в даташите, я же, желая лишь ознакомиться, не стал тратить время и лепить фильтрующий конденсатор по питанию + RC цепочку ФНЧ на выводе Vout. В реальном же устройстве без них никуда! Получил в итоге такую картинку:
Рисунок 4 — Результат измерения «нуля»
При подаче питания 5В с моей платки STM32VL-Discovery я увидел вот такие результаты — 2.38В. Первый же вопрос, который возник: "Почему 2,38, а не описанные в даташите 2.5?" Вопрос отпал практически мгновенно — измерил я шину питания на отладке, а там 4.76-4.77В. А дело все в том, что питание идет с USB, там уже 5В, после USB стоит линейный стабилизатор LM7805, а это явно не LDO с 40 мВ падением. Вот на нем это 250 мВ примерно и падают. Ну да ладно, это не критично, главное знать, что «ноль» это 2.38В. Именно эту константу я буду вычитать при обработке данных с АЦП.
А теперь проведем первое измерение, пока лишь с помощью осциллографа. Измерять буду ток КЗ моего регулируемого блока питания, он равен 3.06А. Это и встроенный амперметр показывает и флюка такой же результат дала. Ну что же, подключаем выходы БП к ногам 4 и 5 датчика (на фото у меня витуха брошена) и смотрим, что получилось:
Рисунок 5 — Измерение тока короткого замыкания БП
Как мы видим, напряжение на Vout увеличилось с 2.38В до 2.44В. Если посмотреть на зависимость выше, то у нас должно было получиться 2.38В + 3.06А*0.02В/А, что соответствует значению 2.44В. Результат соответствует ожиданиям, при токе 3А мы получили прибавку к «нулю» равную 60 мВ. Вывод — датчик работает, можно уже работать с ним с помощью МК.
Теперь необходимо подключить датчик тока с одному из выводов АЦП на микроконтроллере STM32F100RBT6. Сам камушек очень посредственный, системная частота всего 24 МГц, но данная платка у меня пережила очень много и зарекомендовала себя. Владею ею уже, наверное, лет 5, ибо была получена нахаляву во времена, когда ST их раздавали направо и налево.
Сначала по привычке я хотел после датчика поставить ОУ с коэф. усиления «1», но, глянув на структурную схему, понял, что он внутри уже стоит. Единственное стоит учесть, что при максимальном токе выходное питание будет равно питанию датчика Vcc, то есть около 5В, а STM умеет измерять от 0 до 3.3В, так что необходимо в таком случае поставить делитель напряжения резистивный, например, 1:1,5 или 1:2. У меня же ток мизерный, поэтому пренебрегу пока этим моментом. Выглядит мое тестовое устройство примерно так:
Рисунок 6 — Собираем наш «амперметр»
Также для визуализации результатов прикрутил китайский дисплей на контроллере ILI9341, благо валялся под рукой, а руки до него никак не доходили. Чтобы написать для него полноценную библиотеку, убил пару часов и чашку кофе, благо даташит на удивление оказался информативным, что редкость для поделок сыновей Джеки Чана.
Теперь необходимо написать функцию для измерения Vout с помощью АЦП микроконтроллера. Рассказывать подробно не буду, по STM32 уже и так море информации и уроков. Так что просто смотрим:
Далее, чтобы получить результаты измерения АЦП в исполняемом коде основного тела или прерывания, надо прописать следующее:
Предварительно объявив переменную data_adc:
В итоге мы получаем переменную data_adc, которая принимает значение от 0 до 4095, т.к. АЦП в STM32 идет 12 битный. Далее нам необходимо превратить полученный результат «в попугаях» в более привычный для нас вид, то есть в амперы. Поэтому необходимо для начала посчитать цену деления. После стабилизатора на шине 3.3В у меня осциллограф показал 3.17В, не стал разбираться, с чем это связано. Поэтому, разделив 3.17В на 4095, мы получим значение 0.000774В — это и есть цена деления. То есть получив с АЦП результат, например, 2711 я просто домножу его на 0.000774В и получу 2.09В.
В нашей же задачи напряжение лишь «посредник», его нам еще необходимо перевести в амперы. Для этого нам надо вычесть из результата 2.38В, а остаток поделить на 0.02 [В/А]. Получилась вот такая формула:
Ну что же, пора залить прошивку в микроконтроллер и посмотреть результаты:
Рисунок 7 — Результаты измерения данных с датчика и их обработка
Измерил собственное потребление схемы как видно 230 мА. Измерив тоже самое поверенной флюкой, оказалось, что потребление 201 мА. Ну что же — точность в один знак после запятой это уже очень круто. Объясню, почему… Диапазон измеряемого тока 0..100А, то есть точность до 1А это 1%, а точность до десятых ампера это уже 0,1%! И прошу заметить, это без каких либо схемотехнических решений. Я даже поленился повесить фильтрующие кондеры по питанию.
Теперь необходимо замерить ток короткого замыкания (КЗ) моего источника питания. Выкручиваю ручку на максимум и получаю следующую картину:
Рисунок 8 — Измерения тока КЗ
Ну и собственно показания на самом источнике с его родным амперметром:
Рисунок 9 — Значение на шкале БП
На самом деле там показывало 3.09А, но пока я фотографировал, витуха нагрелась, и ее сопротивление выросло, а ток, соответственно, упал, но это не так страшно.
В заключение даже и не знаю, чего сказать. Надеюсь, моя статья хоть как-то поможет начинающим радиолюбителям в их нелегком пути. Возможно, кому-то понравится моя форма изложения материала, тогда могу продолжить периодически писать о работе с различными компонентами. Свои пожелания по тематике можно высказать в комментариях, я постараюсь учесть.
Ну и конечно же прилагаю исходники программки, глядишь, кому понадобится библиотека для работы с дисплеем или АЦП. Сам проект в Keil 5.
Пожалуй, стоит представиться немного — я обычный инженер-схемотехник, который интересуется также программированием и некоторыми другими областями электроники: ЦОС, ПЛИС, радиосвязь и некоторые другие. В последнее время с головой погрузился в SDR-приемники. Первую свою статью (надеюсь, не последнюю) я сначала хотел посвятить какой-то более серьезной теме, но для многих она станет лишь чтивом и не принесет пользы. Поэтому тема выбрана узкоспециализированная и исключительно прикладная. Также хочу отметить, что, наверное, все статьи и вопросы в них будут рассматриваться больше со стороны схемотехника, а не программиста или кого-либо еще. Ну что же — поехали!
Не так давно у меня заказывали проектирование «Система мониторинга энергоснабжения жилого дома», заказчик занимается строительством загородных домов, так что кто-то из вас, возможно, даже уже видел мое устройство. Данный девайс измерял токи потребления на каждой вводной фазе и напряжение, попутно пересылая данные по радиоканалу уже установленной системе «Умный дом» + умел вырубать пускатель на вводе в дом. Но разговор сегодня пойдет не о нем, а о его небольшой, но очень важной составляющей — датчике тока. И как вы уже поняли из названия статьи, это будут «бесконтактные» датчики тока от компании Allegro — ACS758-100.
________________________________________________________________________________________________________________________
Даташит, на датчик о котором я буду рассказывать, можно посмотреть тут. Как несложно догадаться, цифра «100» в конце маркировки — это предельный ток, который датчик может измерить. Скажу честно — есть у меня сомнения по этому поводу, мне кажется, выводы просто не выдержат 200А долговременно, хотя для измерения пускового тока вполне подойдет. В моем устройстве датчик на 100А без проблем пропускает через себя постоянно не менее 35А + бывают пики потребления до 60А.
Рисунок 1 — Внешний вид датчика ACS758-100(50/200)
Перед тем, как перейду к основной части статьи, я предлагаю вам ознакомиться с двумя источниками. Если у вас есть базовые знания по электронике, то они будут избыточными и смело пропускайте этот абзац. Остальным же советую пробежаться для общего развития и понимания:
1) Эффект Холла. Явление и принцип работы
2) Современные датчики тока
________________________________________________________________________________________________________________________
Ну что же, начнем с самого важного, а именно с маркировки. Покупаю комплектующие в 90% случаев на www.digikey.com. В Россию компоненты приезжают через 5-6 дней, на сайте есть пожалуй все, также очень удобный параметрический поиск и документация. Так что полный список датчиков семейства можно посмотреть там по запросу "ACS758". Датчики мои были куплены там же — ACS758LCB-100B.
Внутри даташита по маркировке все расписано, но я все равно обращу внимание на ключевой момент "100В":
1) 100 — это предел измерения в амперах, то есть мой датчик умеет измерять до 100А;
2) "В" — вот на эту букву стоит обратить внимание особо, вместо нее может быть также буква "U". Датчик с буквой B умеет измерять переменный ток, а соответственно и постоянный. Датчик с буквой U умеет измерять только постоянный ток.
Также в начале даташита есть отличная табличка на данную тему:
Рисунок 2 — Типы датчиков тока семейства ACS758
Также одной из важнейших причин использования подобного датчика стала — гальваническая развязка. Силовые выводы 4 и 5 не связаны электрически с выводами 1,2,3. В данном датчике связь лишь в виде наведенного поля.
Еще в данной таблицы появился еще один важный параметр — зависимости выходного напряжения от тока. Прелесть данного типа датчиков в том, что у них выход напряжения, а не тока как у классических трансформаторов тока, что очень удобно. Например, выход датчика можно подсоединить напрямую ко входу АЦП микроконтроллера и снимать показания.
У моего датчика данное значение равно 20 мВ/А. Это означает, что при протекании тока 1А через выводы 4-5 датчика напряжение на его выходе увеличится на 20 мВ. Думаю логика ясна.
Следующий момент, какое же напряжение будет на выходе? Учитывая, что питание «человеческое», то есть однополярное, то при измерение переменного тока должна быть «точка отсчета». В данном датчике эта точка отсчета равна 1/2 питания (Vcc). Такое решение часто бывает и это удобно. При протекании тока в одну сторону на выходе будет "1/2 Vcc + I*0.02V", в другом полупериоде, когда ток протекает в обратную сторону напряжение на выходе будет уже "1/2 Vcc — I*0.02V". На выходе мы получаем синусоиду, где «ноль» это 1/2Vcc. Если же мы измеряем постоянный ток, то на выходе у нас будет "1/2 Vcc + I*0.02V", потом при обработке данных на АЦП просто вычитаем постоянную составляющую 1/2 Vcc и работаем с истинными данными, то есть с остатком I*0.02V.
Теперь пришло время проверить на практике то, что я описал выше, а вернее вычитал в даташите. Чтобы поработать с датчиком и проверить его возможности, я соорудил вот такой «мини-стенд»:
Рисунок 3 — Площадка для тестирования датчика тока
Первым делом я решил подать на датчик питание и измерить его выход, чтобы убедиться в том, что за «ноль» у него принято 1/2 Vcc. Схему подключения можно взять в даташите, я же, желая лишь ознакомиться, не стал тратить время и лепить фильтрующий конденсатор по питанию + RC цепочку ФНЧ на выводе Vout. В реальном же устройстве без них никуда! Получил в итоге такую картинку:
Рисунок 4 — Результат измерения «нуля»
При подаче питания 5В с моей платки STM32VL-Discovery я увидел вот такие результаты — 2.38В. Первый же вопрос, который возник: "Почему 2,38, а не описанные в даташите 2.5?" Вопрос отпал практически мгновенно — измерил я шину питания на отладке, а там 4.76-4.77В. А дело все в том, что питание идет с USB, там уже 5В, после USB стоит линейный стабилизатор LM7805, а это явно не LDO с 40 мВ падением. Вот на нем это 250 мВ примерно и падают. Ну да ладно, это не критично, главное знать, что «ноль» это 2.38В. Именно эту константу я буду вычитать при обработке данных с АЦП.
А теперь проведем первое измерение, пока лишь с помощью осциллографа. Измерять буду ток КЗ моего регулируемого блока питания, он равен 3.06А. Это и встроенный амперметр показывает и флюка такой же результат дала. Ну что же, подключаем выходы БП к ногам 4 и 5 датчика (на фото у меня витуха брошена) и смотрим, что получилось:
Рисунок 5 — Измерение тока короткого замыкания БП
Как мы видим, напряжение на Vout увеличилось с 2.38В до 2.44В. Если посмотреть на зависимость выше, то у нас должно было получиться 2.38В + 3.06А*0.02В/А, что соответствует значению 2.44В. Результат соответствует ожиданиям, при токе 3А мы получили прибавку к «нулю» равную 60 мВ. Вывод — датчик работает, можно уже работать с ним с помощью МК.
Теперь необходимо подключить датчик тока с одному из выводов АЦП на микроконтроллере STM32F100RBT6. Сам камушек очень посредственный, системная частота всего 24 МГц, но данная платка у меня пережила очень много и зарекомендовала себя. Владею ею уже, наверное, лет 5, ибо была получена нахаляву во времена, когда ST их раздавали направо и налево.
Сначала по привычке я хотел после датчика поставить ОУ с коэф. усиления «1», но, глянув на структурную схему, понял, что он внутри уже стоит. Единственное стоит учесть, что при максимальном токе выходное питание будет равно питанию датчика Vcc, то есть около 5В, а STM умеет измерять от 0 до 3.3В, так что необходимо в таком случае поставить делитель напряжения резистивный, например, 1:1,5 или 1:2. У меня же ток мизерный, поэтому пренебрегу пока этим моментом. Выглядит мое тестовое устройство примерно так:
Рисунок 6 — Собираем наш «амперметр»
Также для визуализации результатов прикрутил китайский дисплей на контроллере ILI9341, благо валялся под рукой, а руки до него никак не доходили. Чтобы написать для него полноценную библиотеку, убил пару часов и чашку кофе, благо даташит на удивление оказался информативным, что редкость для поделок сыновей Джеки Чана.
Теперь необходимо написать функцию для измерения Vout с помощью АЦП микроконтроллера. Рассказывать подробно не буду, по STM32 уже и так море информации и уроков. Так что просто смотрим:
uint16_t get_adc_value()
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
Далее, чтобы получить результаты измерения АЦП в исполняемом коде основного тела или прерывания, надо прописать следующее:
data_adc = get_adc_value();
Предварительно объявив переменную data_adc:
extern uint16_t data_adc;
В итоге мы получаем переменную data_adc, которая принимает значение от 0 до 4095, т.к. АЦП в STM32 идет 12 битный. Далее нам необходимо превратить полученный результат «в попугаях» в более привычный для нас вид, то есть в амперы. Поэтому необходимо для начала посчитать цену деления. После стабилизатора на шине 3.3В у меня осциллограф показал 3.17В, не стал разбираться, с чем это связано. Поэтому, разделив 3.17В на 4095, мы получим значение 0.000774В — это и есть цена деления. То есть получив с АЦП результат, например, 2711 я просто домножу его на 0.000774В и получу 2.09В.
В нашей же задачи напряжение лишь «посредник», его нам еще необходимо перевести в амперы. Для этого нам надо вычесть из результата 2.38В, а остаток поделить на 0.02 [В/А]. Получилась вот такая формула:
float I_out = ((((float)data_adc * presc)-2.38)/0.02);
Ну что же, пора залить прошивку в микроконтроллер и посмотреть результаты:
Рисунок 7 — Результаты измерения данных с датчика и их обработка
Измерил собственное потребление схемы как видно 230 мА. Измерив тоже самое поверенной флюкой, оказалось, что потребление 201 мА. Ну что же — точность в один знак после запятой это уже очень круто. Объясню, почему… Диапазон измеряемого тока 0..100А, то есть точность до 1А это 1%, а точность до десятых ампера это уже 0,1%! И прошу заметить, это без каких либо схемотехнических решений. Я даже поленился повесить фильтрующие кондеры по питанию.
Теперь необходимо замерить ток короткого замыкания (КЗ) моего источника питания. Выкручиваю ручку на максимум и получаю следующую картину:
Рисунок 8 — Измерения тока КЗ
Ну и собственно показания на самом источнике с его родным амперметром:
Рисунок 9 — Значение на шкале БП
На самом деле там показывало 3.09А, но пока я фотографировал, витуха нагрелась, и ее сопротивление выросло, а ток, соответственно, упал, но это не так страшно.
В заключение даже и не знаю, чего сказать. Надеюсь, моя статья хоть как-то поможет начинающим радиолюбителям в их нелегком пути. Возможно, кому-то понравится моя форма изложения материала, тогда могу продолжить периодически писать о работе с различными компонентами. Свои пожелания по тематике можно высказать в комментариях, я постараюсь учесть.
Ну и конечно же прилагаю исходники программки, глядишь, кому понадобится библиотека для работы с дисплеем или АЦП. Сам проект в Keil 5.