Шкальный индикатор на основе МК.

Автор - ARV.
Опубликовано 22.04.2008.
Микросхемы шкальных индикаторов типа К1003ПП1...ПП3 и их импортные аналоги известны всем, и, казалось бы, полностью должны удовлетворить любые потребности любителей мастерить индикаторы в виде линейки светодиодов. Ан нет, иной раз хочется чего-то более изысканного, например, побольше светодиодов в шкале или не одну, а две а то и три шкалы, или индикацию не просто в виде столбика или точки, а более экзотическую - в виде 2-х или 3-х точек: В общем, всегда что-то найдется такое. Для чего эти микросхемы не очень подходят. Какой же выход? Буду не оригинален - тут поможет микроконтроллер, как обычно, семейства AVR.
Опубликовать схему и прошивку - дело плевое, однако это удовлетворит лишь небольшую группу любителей, а остальные будут недовольны - то одно в прошивке или схеме не так, то другое: Это мы проходили, и знаем лекарство: не нравится готовое - сделай сам! Но знаем мы и другое: знаешь сам - научи другого! И потому эта статья будет посвящена теории и практике написания программы для шкального индикатора. Программа будет писаться на Си (советую запасаться компиляторами) WinAVR, с минимальными переделками пойдет и на других диалектах (CodeVision и др.). Основная цель - обучение характерным приемам, освоив которые каждый желающий должен быть в состоянии разработать индикатор под свои конкретные нужды, во всяком случае, я в это искренне верю.
Очень рекомендую сначала прочитать все до самого конца, и только потом начинать что-то делать в AVR Studio.
Итак, первый этап - постановка задачи. Начинать будем с простого - сделаем шкалу из двух линеек по 8 светодиодов, которые "столбиком" будут показывать уровень входного напряжения на двух входах МК, т.е. сделаем "стерео" индикатор. Обязательно применим динамическую индикацию, т.к. иначе выводов МК может и не хватить (пока не задумываемся о конкретном типе МК). Сначала добьемся линейного соответствия количества светящихся светодиодов и входного напряжения, т.е. наша шкала будет иметь динамический диапазон примерно 18 dB. Напомню, что динамический диапазон определяется как 20log(dU), где dU - отношение максимального уровня индикации к минимальному. Так как у нас всего 8 светодиодов в шкале, то dU=8, это очевидно. Кстати, если шкала будет индицировать мощность, то динамический диапазон автоматически уменьшится вдвое.
Этап второй - схема.
Пока что схему нарисуем безотносительно к конкретным выводам конкретного МК - будем пробовать сделать универсальную программу. Надеюсь, когда потребуется, ни у кого из читателей не возникнет проблемы "распределить" виртуальные названия выводов по "реальным" ножкам выбранного контроллера. И с учетом этого наша схема получается такой, как на рисунке:
Конденсатор на сигнале AREF может и отсутствовать - это уже будет определяться конкретными требованиями к конкретному МК. Так же могут появиться некоторые дополнительные соединения (например, для atmega8 требуется всегда соединять вместе выводы GND и AGND, а так же VCC и AVCC). Эти нюансы в статье не рассматриваются ввиду их очевидности.
На аналоговые входы AIN0 и AIN1 будут подаваться наши измеряемые сигналы: это должно быть постоянное напряжение не более 2,5В. Подать такие сигналы лучше всего с эмиттерного повторителя, т.к. он имеет высокое входное и низкое выходное сопротивление, что очень удачно вписывается в концепцию как со стороны "входа", так и "выхода". Однако, варианты возможны и в этом случае, потому снова отбросим нюансы источника сигнала и не будем о них задумываться, главное для нас - программа.
Этап третий - алгоритм работы.
Не будем рисовать диаграммы и структурные схемы, а обдумаем алгоритм программы "на словах". Как обычно, вначале нужно проинициализировать все необходимые периферийные устройства МК. Динамическая индикация проще всего и наиболее красиво реализуется в виде фонового процесса - по прерыванию от таймера. Процедура обработки этого прерывания должна постоянно обновлять уровни на портах (согласно принятым на схеме обозначениям) LEDS, СОМ0 и СОМ1, обеспечивая поочередное включение восьмерок светодиодов.
В основном цикле наша программа должна постоянно и непрерывно осуществлять измерение при помощи АЦП уровней на входах AIN0 и AIN1, обрабатывать их по определенному алгоритму (например. проводить цифровую фильтрацию или масштабирование и т.п.), и подготавливать данные для вывода на шкалы - те самые, которые будут использованы в функции динамической индикации.
Вот, собственно, и все.
Этап четвертый - написание программы.
Будем писать программу по блочно-модульному принципу, т.е. она будет состоять из нескольких файлов - так легче продвигаться от "крупного" к "мелкому", ведь обучаться легче постепенно вникая в мелочи, чем сразу погрузиться в их пучину, не так ли? После того, как все будет готово, никто не запретит вам объединить все файлы в один, если по каким-то причинам вам покажется это более удобным. Хотя блочно-модульный принцип позволяет лече контролировать правильность программописания - можно компилировать каждый модуль в отдельности (не делая сборку проекта) и сразу корректировать ошибки.
Создаем проект WinAVR GCC в AVR Studio, указываем папку проекта и название главного файла нашего проекта (например, SCALE.C), затем выбираем из списка желаемый тип МК. Затем в опциях проекта указываем желаемую тактовую частоту.
В файл SCALE.C вводим следующее:
#include // обязательно подключаем описание портов и периферии
#include // это МОЖЕТ понадобиться
#include "scale.h" // а в этом файле соберем все свои собственные описания

// опишем прототипы наших функций
void initialize(void); // функция инициализации всей периферии
unsigned int get_adc(unsigned char chanel); // функция получения отсчета АЦП
unsigned int prepare(unsigned int value); // функция обработки сигнала
void output(unsigned int val, unsigned int ch); // функция "вывода" уровня на указанную шкалу

int main(void){
    unsigned int adc; // значение "замера" сигнала
    unsigned char i; // вспомогательная переменная

    initialize(); // инициализируем периферию
    // главный бесконечный цикл
    while(1){
        for(i=0; i






Рекомендуемый контент




Copyright © 2010-2019 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.