Персональный электросчетчик на MSP430FE4252

Блог им. radiolok
Вот стоят у нас дома приборы учета. Хорошо стоят, числа показывают, рублики считают. И захотели одни товарищи поставить по такому счетчику в каждый электроприбор. И спросили нас, а как, мол?
А вот так. С помощью специализированной микросхемы от TI — MSP430FE4252 — микроконтроллера MSP430 со встроенным модулем учета электроэнергии.
Общий вид на испытательном стенде

Микроконтроллеры MSP430FE4252
представляют собой 64-ногий микроконтроллер со встроенными 16-разрядными сигма-дельта АЦП, в количестве 2 или 3 штук, а также специализированный модуль ESP430, совершающий все измерения и выдающий практически готовый результат.

Именно это семейство микроконтроллеров находится внутри электросчетчиков Меркурий 230.

Так как схемы в целом референсные, и код структурно мало чем отличается от демонстрационного(да и проект слегка закрытый), это будет присказка о ряде трудностей, которые пришлось преодолеть на этапе разработки.

Трудность 1: Изобразительная.
Несмотря на то, что микроконтроллер содержит драйвер сегментного дисплея, по заданию требовался ЖК-дисплей больших размеров. Был выбран WX12864U1 как подходящий по габаритам и интерфейсом. Было решено подключать его по SPI. Еще во время разводки платы стало ясно — по SPI нельзя читать память дисплея, разберемся. Развели, собрали, начинаем программировать. В качестве библиотеки была выбрана техасовская glibc. Кстати отличная серия дисплейчиков. Тонкие, малогабаритные, в либе для sed контроллера нужно проверить соответствие дефайнов адресам команд (есть небольшие различия). Небольшой ток потребления, есть варианты с толстой и тонкой (в виде наклейки) подсветкой, а также сенсорной панелькой.
Либа, в целом, неплоха, хотя формат хранения шрифтов так и остался страшной загадкой. А еще шрифты в этом формате упакованными весили в разы больше обычного xbm(такой используется в glcd у arduino), на которую glibc был впоследствии перекручен.

Теперь мое любимое — в микроконтроллере 512 байт ОЗУ! а это значит, что хранить дамп изображения дисплея (читать то не можем), нам не получится — здравствуй отсутствие графики и текстовый шрифт онли. Последний, несмотря на моноширинность, был запилен в 8 и 16-битном размере и выглядит очень даже хорошо.

Трудность 2: Иносказательная.
Для связи с модулем ESP430 используется набор 16-разрядных регистров в т.н. MailBox.
После того как мы считали, например, VRMS, мы умножаем его на некий коэффициент, потом перемножаем с IRMS с неким коэффициентом… в общем получаем мы в итоге 64-разрядную логику работы (аналогично референсу).

Пишем, запускаем, считываем WFT? На дисплее появляются просто фееричные кракозябры, попытки отдебажить дают абсолютно нулевой результат — после считывания данных из ESP430 контроллер творит что хочет — SP и PC рандомно прыгают в неизвестные области памяти, стек и ОЗУ соответственно бъются, прерывания отключаются и прочее. Делаем попытку запустить проект в IAR. Там контроллер сразу запустился, начал нормально считывать данные и делать свою работу… Не совсем идеально, ибо нужно было допилить пару мест, но работало…

ВНЕЗАПНО я натыкаюсь на информацию о том, что компилятор TI MSP в Code Compser Studio v5 в наследство от v4 получил неспособность перемножать числа, выходящие за пределы 16 бит как минимум на этом микроконтроллере.
Справедливости ради, расово-верный MSPGCC, уже полноценно интегрированный в Code Composer v6 с задачей умножения чисел справляется корректно.

Трудность 3: Запоминающая
У микроконтроллера нет встроенной EEPROM. Но надо хранить настройки. Впрочем, это даже и не трудность вовсе — доступ к областям INFOx прост и понятен. Даже процедура калибровки записывает коэффициенты именно во флеш-память.
ВОТ ЗДЕСЬ я пересказал кусок документации по этому поводу.

Режимы работы:
Напряжение/частота
Ток/коэффициент мощности
Текущая мощность
Пиковая мощность(сбрасывается нажатием на одну из кнопок)
Потребленная энергия за время включенного прибора(сбрасывается длительным нажатием на одну из кнопок)
Стоимость 1кВТ*ч энергии(с режимом редактирования)
На видео заметен рабочий косяк с разрядами после запятой у частоты — там не 50.6 Гц, а 50.006Гц.

Ссылки:
http://www.ti.com/lit/an/slaa203c/slaa203c.pdf — референсная плата и схема

11 комментариев

avatar
судя по даташиту чипы старые как моя жизнь
avatar
… тогда ATmega8 из палеозоя, как минимум )
avatar
и TI не особо собирается выпускать новые спец-процы — 4252 и 425 камни для однофазных и трехфазных счетчиков полностью удовлетворяют всем потребностям. Мало флеша — берешь 4272 и 427 и едешь дальше.
Все что они сделали — выпустили новые ревизии с A на конце и мелкими доработками.
Комментарий отредактирован 2014-10-17 10:51:55 пользователем radiolok
avatar
MSP430F67xx
avatar
И близко не то — в нем просто 3-канальный SD24 и вся математика расчета RMS ложится на камень и плечи разработчика. Она, конечно. достаточно банальна.
avatar
Там готовые референсы есть и готовая библиотека специально под такие применения.
avatar
Да, я видел ее. Но все же это обычный MSP с качественным АЦП модулем.
Хотя его наиболее эффективное и логичное применение — E-meter
Для моей задачи он жирноват.
avatar
Не помню уже, когда в последний раз видел сурово-эмбеддерские 512 байт памяти :)
avatar
Ну почему же, сейчас например в работе устройство на базе MSP430F2232. 16 кбайт FLASH и 512 байт ОЗУ.

Так вся программа ест ~30 байт ОЗУ и ~600 байт кода — такой огромный камень использовался только из-за необходимости в 26 ногах, периферии и полноценных 8-разрядных портах. А задачка проста — получить по UART номер датчика, считать его кодом Баркера (про абсолютные энкодеры и с чем их едят я как-нибудь напишу), и вернуть в UART.
Нашелся бы аналогичный камень на кбайт флеша и 128 байт ОЗУ — написал бы на нем.
avatar
Угу, radiolok дело говорит.
У меня сейчас основная игрушка- AT90USB162, в которой добрую половину оперативы похоже одолжили на потребности USB-модуля.
В начале за голову хватался, всего 512 байт, а потом понял, что даже 64 байта- вполне достаточно для мелкого эмбеддерства.

Единственное место, где сталкивался с необходимостью ядерного количества оперативы- это плеер с SD картой, где только буфер обмена жрал 512 байт. Но не смотря на это справлялась даже Мега8 с её 1 кБ.

Кстати недавно узнал, что некоторые AVR позволяют почти прямо к процессорной шине подрубить лишние 64 кБ параллеьной памяти, которые среда разработки будет понимать почти за родные.
Например Мега8515 или Мега128.
Так что кому мало- довешивайте на здоровье.
s005.radikal.ru/i211/1410/40/163c7eb09396.jpg
: )
Комментарий отредактирован 2014-10-19 14:56:56 пользователем iEugene0x7CA
avatar
Совсем забыл про наличие видео. Добавил.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.