Персональный электросчетчик на MSP430FE4252
Вот стоят у нас дома приборы учета. Хорошо стоят, числа показывают, рублики считают. И захотели одни товарищи поставить по такому счетчику в каждый электроприбор. И спросили нас, а как, мол?
А вот так. С помощью специализированной микросхемы от 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Гц.
Ссылки:
https://www.ti.com/lit/an/slaa203c/slaa203c.pdf — референсная плата и схема
А вот так. С помощью специализированной микросхемы от 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Гц.
Ссылки:
https://www.ti.com/lit/an/slaa203c/slaa203c.pdf — референсная плата и схема
11 комментариев
Все что они сделали — выпустили новые ревизии с A на конце и мелкими доработками.
Хотя его наиболее эффективное и логичное применение — E-meter
Для моей задачи он жирноват.
Так вся программа ест ~30 байт ОЗУ и ~600 байт кода — такой огромный камень использовался только из-за необходимости в 26 ногах, периферии и полноценных 8-разрядных портах. А задачка проста — получить по UART номер датчика, считать его кодом Баркера (про абсолютные энкодеры и с чем их едят я как-нибудь напишу), и вернуть в UART.
Нашелся бы аналогичный камень на кбайт флеша и 128 байт ОЗУ — написал бы на нем.
У меня сейчас основная игрушка- AT90USB162, в которой добрую половину оперативы похоже одолжили на потребности USB-модуля.
В начале за голову хватался, всего 512 байт, а потом понял, что даже 64 байта- вполне достаточно для мелкого эмбеддерства.
Единственное место, где сталкивался с необходимостью ядерного количества оперативы- это плеер с SD картой, где только буфер обмена жрал 512 байт. Но не смотря на это справлялась даже Мега8 с её 1 кБ.
Кстати недавно узнал, что некоторые AVR позволяют почти прямо к процессорной шине подрубить лишние 64 кБ параллеьной памяти, которые среда разработки будет понимать почти за родные.
Например Мега8515 или Мега128.
Так что кому мало- довешивайте на здоровье.
s005.radikal.ru/i211/1410/40/163c7eb09396.jpg
: )