Каталог файлов
Главная » Файлы » » На микроконтроллере

Универсальный вольтметр - амперметр на PIC16F676 с открытым программным кодом
28.01.2013, 16:22

Статья предназначена для широкого круга радиолюбителей, желающих освоить азы работы и программирования микроконтроллеров (МК), а также тех, кто желает «облагородить» свои радиолюбительские устройства. Конструкция базируется на PIC16F676, легко повторяется, изучается и видоизменяется.

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

Первый мой опыт. После радостей от первой победы возник вопрос, на который не было ответа: а как сделать вольтметр на 50 Вольт или на 300 Вольт или амперметр?
В сети я находил только готовые конструкции с откомпиллированными прошивками, которые подходили их авторам, но часто совсем не подходили мне. Хотелось понять, как оно работает изнутри.

В то время решить подобные вопросы мне было не под силу, но желание где-то «застряло» в моем подсознании. Дополнительным стимулом разобраться в теме и написать статью стало множество писем с вопросами от читателей моих предыдущих статей. Предлагаю изучить и повторить известную в Сети конструкцию широкого применения — вольтметр на микроконтроллере фирмы Microchip PIC16F676. Хочу сразу предупредить, что данные разработки проверялись мной только на макетке, по сему привычных всем фоток не будет, только знания. В данном случае это не главное. Здесь главное – получение практических навыков программирования и симуляции того что наваяли.

Микросхема PIC16F676 отлично подходит для целей создания компактного вольтамперметра. Имея всего 14 ног, даже в наипростейшем исполнении, чип способен выдать стабильный результат на 3-разрядный светодиодный индикатор.

Во всемирной сети таких наработок несколько, но, в большинстве случаев, радиолюбителю редко подходит то, что подошло кому-то другому. Всегда есть какой-то нюанс, который не устраивает, да и просто ”попугайничать” далеко не всем интересно. Хочется все приспособить для своих, как всегда уникальных, условий. При этом в свободном доступе, за редким исключением, нет полных исходных текстов программ. Либо они написанные в стиле не всегда понятном для понимания начинающих осваивать программирование радиолюбителей. То немногое, что есть, написано на языке Ассемблер, которым на практике владеют ограниченный круг специалистов (да и не прост он в процессе отладки), либо СИ, но со сложными лексемами, структурами и прерываниями. То есть смотришь на программу… она такая маленькая, компактная, но чтобы понять, где что-то изменить/использовать для своих нужд, нужны хорошие знания языка, особенно в части годами накатанных эмбедерами всевозможных сокращений, а тем более тонкостей работы структур и массивов.

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

Схема 1

Для начала за основу возьмем наипростейшую схему вольтметра на МК PIC16F676, предложенную в (3).

Переделывать ее на свой лад нет смысла. Она отлажена и способна в динамическом режиме индицировать значение входного напряжения на 3 разряда светодиодных индикаторов. Здесь важно понимать, что из-за отсутствия буферных транзисторов не удастся подключить индикаторы с большим током потребления. В принципиальную схему заведомо заложено использования небольших индикаторов с малым током потребления. То есть во «главу угла» поставлена компактность готового изделия. От нее и оттолкнемся. Особенно в случае использования деталей в SMD исполнении. При желании, сможем конструктивно ”уложить” МК под сам гибридный индикатор на односторонней плате, даже если он в DIP корпусе.

Описание принципиальной электрической схемы вольтметра и логики его работы

Схема в целом стандартная и особых пояснений не требует. Как видно из рисунка, вольтметр состоит из микроконтроллера IС1, трехразрядного индикатора с общим анодом, ”кучки” резисторов, транзистора, конденсаторов по питанию и стабилитрона.

IС1 выполняет две основные функции:
 — измерения входного напряжения с помощью встроенного аналогово-цифрового преобразователя (АЦП);
 — формирование динамической индикации для вывода результата измерения.

Сигналы для сегментов индикатора формируются на порте RC0 — RC5. К сожалению, в данном МК он не полон. На него невозможно возложить всю задачу формирования индицируемой цифры. Не хватает одной лини. Выход один: использование возможностей порта RA. Возьмем для этой цели RА2, как физически наиболее близко расположенного к соответствующей ножке индикатора в случае плотного монтажа. Формирование цикла последовательного ”зажигания” разрядов выполняют порты RА0, RА1 и RА5. Немного в разброс, но при монтаже самое то. Для формирования запятой в среднем разряде используется инверсия сигнала включения второго разряда индикатора с помощью отдельного транзистора, ибо свободных портов в микроконтроллере способных выполнить такую задачу уже не осталось. Порт RA3 – работает только на вход, о нем еще расскажем.

Измеряемое напряжение подается на порт RA4 МК, к которому подключен аналоговый вход с АЦП. В РIС16F676 модуль аналого-цифрового 10 разрядного преобразователя имеет восемь каналов, входы которых совмещены с портами ввода/вывода AN0/RA0, AN1/RA1, AN2/RA2, AN3/RA4. AN4/RС0, AN5/RС1, AN6/RС2, AN7/RС3. Физически в микроконтроллере преобразователь АЦП один, но он может поочередно коммутироваться к указанным входам. Модуль АЦП преобразует входное напряжение методом последовательного приближения, при этом возможно использовать опорное напряжение с вывода, совмещенного с портом Vref+/RA2 либо шиной питания Vdd. В нашем случае воспользуемся именно последним вариантом.

Помните, что на вход нельзя подавать напряжение больше 5 Вольт положительной полярности и ни в коем случае — отрицательной. Посему используется ограничительная цепь, состоящая из делителя напряжения на R14, R15, R16, сглаживающего конденсатора С2 и защитного стабилитрона VD1 на 5,1 вольт. Предложенные на схеме номиналы резисторов рассчитаны на входное напряжение до 50 Вольт. В случае других измеряемых напряжений их надо соответственно пересчитать. По сравнению со схемой в (2) немного изменены номиналы резисторов делителя напряжения в сторону увеличения. Это уменьшит влияние вольтметра на измеряемую цепь в результате большего входного сопротивления.

Следует помнить о свойствах порта RA4 по причине его многофункциональности. Он не может устанавливать на своем выходе высокий уровень сигнала (выход с открытым коллектором). Конечно, опытные специалисты-программисты не видят в этом никаких проблем, ибо все это можно учесть либо изменить схемотехнически. Скажем, подключить к ножке RA4 внешний подтягивающий резистор к положительной линии питания и сымитировать сигнал высокого уровня либо поставить дополнительный буферный транзистор, который также умощнит выход МК в целом.

На порт RA3 подсоединен резистор на плюсовую шину питания. Микроконтроллер имеет возможность вместо него присоединять так называемый внутренний резистор подтяжки, подключаемый программным способом, но учитывая, что мы идем от простоты понимания, пока ставим обычный резистор. О третьей причине такого решения станет понятно, когда захочется детально изучить работу схемы в симуляторе. Я указал оба варианта, а какой из них использовать, — решение за Вами в зависимости от уровня практических навыков и знаний. Важно помнить, что к нему по умолчанию подключена цепь VPP – входа напряжения программирования микроконтроллера, а значит, он играет важную роль в т.ч. при внутрисхемном программировании. Если сказать все это коротко – пока не используйте этот порт без крайней на то необходимости.

Не малым преимуществом микроконтроллера является встроенный тактовый генератор, возможностями которого мы и воспользуемся из-за малого количества ног МК.

В заключение данного раздела хочется сказать, что нет необходимости всё это сразу детально запоминать, все встанет на свои места по мере практического освоения микроконтроллера.

Программная часть проекта

Самый важный и сложный для начинающих раздел. Не буду перечислять все виды существующих компиляторов и трансляторов разных языков программирования, а также их слабые и сильные стороны. Исходя из поставленных задач, предлагаю воспользоваться возможностями продукта фирмы MikroElektronika — ”MikroC PRO” любой доступной версии. При этом акцентирую внимание именно с окончанием ”PRO”. Ибо она имеет встроенную возможность автоматически формировать командный файл для симулятора с расширением типа «*.cof». Для этого необходимо выставить галочку в основных настройках компилятора. Поскольку объем памяти данного МК всего 1Кбайт, на законных основаниях воспользуйтесь бесплатной версией на официальном сайте (3).

Итак, запускаем компилятор, открываем файл проекта (см. раздел «Файлы»). Смотрим текст программы в листинге №1.
Листинг №1
Как видите, в программе нет сложных команд. Все числа и регистры в двоичном формате, который мысленно легко переносится прямо на выводы портов, в отличие от других систем исчисления чисел.

В начале объявлены функции подпрограмм (строки 1-3) и глобальные переменные (4-6). Сроки 7-15 – выведенные в отдельную функцию/подпрограмму команды настройки всех портов и регистров МК. Такая организация подготовки программы дает возможность искать либо изменять начальные команды только здесь, в одном месте, а не по всему телу программы. Практически всю работу с настройки внутренних регистров взял на себя компилятор.

Для удобочитаемости задача формирования динамической индикации выполнена с помощью двух взаимосвязанных функций. Первая – (16-40) генерирует цикл активации соответствующих портов RA (разряды индикатора). Строки 19-20 каждый раз инвертируют полярность выходного напряжения для четкого гашения индицируемой цифры. 25, 29 и 33 строчка — связующее звено с иной подпрограммой: ”void Cod_to_PORT (char DIGIT_NUMBER)”. Отвечает за вывод кода на порт RC для подключения соответствующих сегментов индикатора (формируются цифры измеряемого напряжения).

Самый сложный для понимания остался формат изменения конкретного значения бита в регистре порта в ”ноль”, например:
PORTA &= (~(1<<2)); //0 -> А2
и чуть попроще конструкция для формирования логической единицы. Смотри строку 26 и ей подобные. Используйте их на практике как готовый шаблон. Чтобы понять, как изменить конкретный разряд регистра, не вникая в суть происходящих логических операций, смотрите приложенное схематическое пояснение в ремарке.

Поскольку все операции циклические, а функция вывода кода сегментов шаблонна, последующих детальных объяснений не требуется. Присмотритесь только к способу подключения сегмента ”G” через отдельный порт порта RA с соблюдением временных интервалов.
Главная функция (62-74) в 64 строке обращается к подпрограмме инициализации портов и регистров. После чего переходит в цикл постоянного измерения и индикации полученного результата.

С помощью усилий программистов от фирмы MikroElektronika, в компиляторе работа с АЦП организована «скрытно», по умолчанию, и представлена всего одной строчкой — №66. Очень удобно для начинающих. Строки 67-71 демонстрируют принцип укладки полученных данных регистра АЦП в шкалу вольтметра, а также отделения каждой конкретной цифры из полученного результата для последующей их индикации.

В архивах вы также найдете файлы проекта для симуляции работы цифровых систем ”PROTEUS” от Labcenter Electronics. Используйте его возможности для пошаговой симуляции. При этом просматривайте исполняемую строчку на языке Си, а также выходной потенциал на нужном вам порте. (Смотрите папку «no_тр_ОE_50V»).

Вот в этом случае и станет понятно, зачем порт RA3 подтянут резистором на плюсовую шину питания и не использован внутренний подтягивающий резистор. Проблема кроется в том, что симулятор не станет симулировать работу данного МК, пока к указанному порту не будет приложено положительное напряжение. Чтобы акцентировать на этом внимание и не тратить время на поиски причин неверных сигналов симулятора, при макетировании этот элемент оставлен на схеме. В дальнейшем при желании, можете учесть внутренний резистор в программе (см. даташит).

При желании поставить крупные индикаторы, придется решать вопрос ограничения тока потребления через порты МК. В данном случае необходимо ставить буферные транзисторы на каждый разряд индикатора.
Источник http://datagor.ru
Категория: На микроконтроллере | Добавил: DontMoO | Теги:
Просмотров: 9242 | Загрузок: 0 | Комментарии: 1 | Рейтинг: 4.5/2
Помоги сайту, кликни на рекламу
Всего комментариев: 0

Добавить комментарий
(