Эта статья - продолжение моей предыдущей статьи. Там же и технические решения.
Мне попался измеритель тока, напряжения и мощности (далее ИТНМ) PZEM-016.
Данный измеритель должен был подключаться к трансформатору тока (ТТ) на
100 А, но мне он достался без ТТ, поэтому пришлось заказывать отдельный
ТТ на 30 А. Его вы и можете увидеть на фотографии ниже. Измеритель
имеет ModBus RS485 интерфейс и вывод +5 В, что пригодится для питания
дисплея.
Само же устройство основано на той же самой плате, которую я
заказывал прошлый раз. К нему добавились некоторые дополнительные
устройства:
- Микросхема памяти M24M01, представляет из себя 1 Мбит I2C
память. Изначально планировал использовать как логер. И даже написал
что-то, но потом стало не интересно. Кому интересно может допилить. Я
даже сделал передачу содержимого из микросхемы по Z-modem. - Микросхема, датчик температуры Dallas 18B20, ну это классика.
Единственно, не знаю почему, но микросхема завышает на пару градусов.
При этом после включения – ок, но спустя некоторое время измеряемая
температура растёт. Вроде бы сделал опрос датчика каждые 10 сек., но
проблема осталась. Может быть проблема заключается в поддельности
сенсора, но не принципиально. - Модуль часов на микросхеме DS1302. Тут надо остановиться что
микросхема имеет не I2C интерфейс, а очень похожий. Эта микросхема
подключена параллельно микросхеме памяти и выводы микроконтроллера
переключаются между I2C и обычными вводами/выводами по ходу работы
микроконтроллера. - Питание микроконтроллера сделано через стабилизатор 7805, но в
данном случае 5 вольт подаётся от ИТМ, поэтому защитный диод и 7805
зашунтированы, но на схеме эти элементы остались
Принципиальная схема устройства:
Плата с микросхемой часов соединяется через штырьковый разъём и
получается некий "бутерброд", датчик температуры и подтягивающий
резистор запаян методом колхозинга.
На самой плате слева виден разъём для дисплея, переменный резистор
для контраста, возле него два резистора подтяжки 4 кОм шины I2C,
микросхема памяти, ниже микроконтроллер, ниже диод для подсветки,
кнопка, и разъём программирования. Я использую PICKIT2. В середине
драйвер и разъём шины RS485. В левом углу микросхема датчика
температуры, посередине разъём питания с конденсатором и стабилизатор
питания. В собранном виде, данная конструкция представлена:
ИТНМ имеет вход напряжения – это фазное напряжение 80 -260 В и
частота 50/60 и вход тока подключается к различным ТТ, максимальный ТТ
на 100 А, но я заказал на 30 А. Для моих применений вполне достаточно.
На выходе ИТНМ есть +5 В и RS485 интерфейс. RS485 имеет скорость 9600,
протокол ModBus.
Режим работы следующий:
При включении настраивается вся периферия, на экран выводится
заставка CXEM.NET, при этом микроконтроллер посылает запрос на порт
RS485 на установку часов. Если при этом к устройству подключено slave
устройство с адресом 1, то соответственно происходит установка часов в
соответствии со следующими регистрами:
0 Секунды
1 Минуты
2 Часы
3 День
4 Месяц
5 День недели
6 Год
При установке времени в левом нижнем углу высвечивается буква “V”, от английского слова verification.
На скриншоте показана программа ModBus Slave с данными для установки
времени. Необходимо отметить что Slave устройство для установки времени
должно иметь Slave Id = 1. Остальные настройки можно увидеть на
картинке. По идее в это время микроконтроллер ждёт запроса по Zmodem и
будет перекачивать данные из микросхемы памяти в компьютер. Но как я
написал выше это я не доделал. Кто захочет дерзайте. Все исходники
внизу.
В EEPROM память микроконтроллера записывается как количество
включения/отключения с выводом на экран. Так и дата и температура
включения, указатель откуда начинать записывать в микросхему памяти.
Затем программа переходит в основной цикл в котором происходит
периодический опрос температуры, данных с ИТНМ, время. Всё это
показывает на дисплее, при этом происходит запись значения тока в
микросхему памяти побайтно. Если ток более 25.5 А то записывается 0,
если меньше то значение умножается на 10 и округляется. Делается это,
естественно, в целях экономии чтобы 4 байта уложить в 1 байт памяти.
Регистры ИТНМ представлены ниже:
Запрос данных происходит посылкой следующих данных в порт:
static char request_values[8] = {0x0a, 0x04, 0x00, 0x00, 0x00, 0x0A, 0x71, 0x76};
Здесь видно следующие данные:
0x0a - это адрес слэйв устройства, в нашем случае это 10ый,
0x04 - 4-ая функция, то что мы будем читать регистры, каждый регистр 2-х байтный
0x00, 0x00 - начало откуда будем читать
0x00, 0x0A - количество регистров которые хотим прочитать, соответственно регистры с 0 до 10
0x71, 0x76 - контрольная сумма.
Приём данных происходит в прерывании и парсинг происходит там же по приёму всех данных:
if (number_received == 17 && currently == get_time && checkCRC(recive,17)==0) { //Установка времени
DS1302_1init();
DS1302_Initialize(recive[4],recive[6],recive[8],recive[10],recive[12],recive[14],recive[16]);
T0CON=0b10000110;
TMR0=0;
TMR0IF=0;
TMR0IE=1;
correct = 0X12;
currently = get_values;//
return;
}
if (number_received == 25 && currently == get_values && checkCRC(recive,25)==0 ) { //запрос данных
Voltage = (recive[4] | ((uint16_t)recive[3] << 8));
Current = ((uint16_t)recive[5] << 8) | recive[6];
Power = ((uint32_t)recive[11] << 24) | ((uint32_t)recive[12]<<16) | ((uint16_t)recive[9] << 8) | recive[10];
Energy = ((uint32_t)recive[15] << 24)| ((uint32_t)recive[16] <<16) | ((uint16_t)recive[13] << 8) | recive[14];
frequency = (recive[18] | ((uint16_t)recive[17] << 8));
power_facor=(recive[20] | ((uint16_t)recive[19] << 8));
delay_connection= 5; // update the time of connection
return;
}
Тут приём двух пакетов, первый для установки времени. Второй пакет -
парсинг данных от ИТНМ. Происходит проверка CRC поэтому случайный пакет
проскочить не должен.
Работающий дисплей можно увидеть выше. В принципе, всё должно быть
понятно. Когда ИТНМ находится на связи в левом углу происходит некая
анимация, точка превращается в окружность и обратно.
В прикрепленных файлах схема и плата в формате DipTrace, исходники для программирования микроконтроллера.
Прикрепленные файлы:
- display_PCB.rar (104 Кб)
- LCD_PIC18_clock_X.zip (794 Кб)
Автор: Mesha