Доброго времени суток собрал вольтметр-амперметр на PIC16F819 + четырехразрядный 7-ми сегментный индикатор для своего зарядного устройства.
Приборчик измеряет ток и напряжение с датчиков,выводит на индикатор попеременно каждые 4 сек.Если какая-то величина изменяется быстрее, чем установлено то показывает только её.Если ток изменяется больше чем +-25%, то показывает только ток.Для напряжения установка +-12,5%. В приоритете ток, т.к. делал для зарядного.
В устройстве использовано два аналоговых канала, соответственно на ток и напряжение.Датчик тока шунт 5А/75mV + ОУ LM2904 в неинвертир. режиме усиления, преимущество данного ОУ в том,что при однополярном питании усиление от 0 вольт. Датчик напряжения - резистивный делитель + ОУ , оу использовал что бы не пропадал зря. Опорное напряжение рез.делитель + кондер, т.к. не требуется точных измерений.Выбирал из условия максимальное напряжение на выходе ОУ + 2-5% запас.(В районе 4 вольт.)
По программе заметки:
-отображение на дисплее происходит в прерываниях,так же и считывание с ацп.
-каналы попеременно переключаются в прерывании,частота опроса одного канала около 250 Гц.
-для более удобного отображения используется оверсем...(забыл как называется). Увеличиваем разряд ацп с 8 bit до 10 bit. Почему с 8 бит, у меня компилятор XC8 не хочет считывать ADRESL, поэтому установил левое выравнивание и читаю только ADRESH.В планах было с 10 бит до 12 бит увеличить.Кусок программы остался в проекте в комментах.
Использовал простенький цифровой фильтр НЧ (RC), иначе неадекватная реакция девайса.
Передаточная фильтра:
Din = Din + adc - Dout
Dout = Din/K
K=T*SPS
T=RC
Fсреза=(1/(2*пи*R*C)
Что бы успевал МК считать деление, сделал на сдвиге регистра для тока и напряжения (>>4=16,коэффициент К).
Fсреза получилось около 2-3Гц.Поэтому показания медленно растут(относительно все).
-выставление точки автоматическое с первого разряда (0.00В>>00.0В>>000В аналогично для тока). Вот тут есть камешек подводный, если в выражении присутствует неопределенный тип переменной,ниже пример из программы:
temp[0]=data_real/(100*Mj_temp);
В данном случае "100" неопределённый, то выражение (100*Mj_temp) не должно превышать 32768.Если это происходит, то приборчик адекватно показывает до 3.27 при дальнейшем увеличении 3.33>>4.44 и т.д. Этого можно избежать определив тип "100" большим.Для моих условий эксплуатации этого не требовалось и я оставил так.
Питание обычный LM7805+стандартный набор кондеров на выходе.
Вывод порта RA2 использовал по своему назначению, в программе его нет.
У меня главный вопрос: как в XC8 прописать FOSC=INTIO2, в таком случае компилятор выдает ошибку.Я прописал FOSC=0x30 и все в принципе ок. Спасибо подсказали, в проекте поправил, перезалил.
Подскажите почему ADRESL не могу считать, в программе все нормально. Дизассемблирование проверял, два раза считывается ADRESH?
В файлах сам проект приборчика + схема.