Удачное стечение обстоятельств и вот я тоже подключаю цифровой китайский штангенциркуль к МК
Эти китайские поделки из пластика обладают отличным потенциалом для использования в качестве любительских измерителей линейного перемещения. Данный экземпляр отображал на дисплее только одно число после запятой, чего было достаточно для моих целей
Фотографии вскрытых мозгов штангенциркуля не осталось, но гуляющие по интернету схемы оказались правы и для моего китайского товарища
Необходим преобразователь уровней. Хотел сделать красиво, гальванически развязано, но хотелось побыстрее получить результат. Под рукой как раз завалялось пара NPN транзисторов 2n555x. Вот как работает схема:
Сигнал с низковольтного интерфейса открывает и закрывает транзистор. Сигнал снимаем с точки, показанной зеленым. Да, сигнал, полученный по такой схеме будет инвертированным, но это не большая проблема – один символ добавить в прошивке. На всякий случай вход транзистора подтянут к земле через высокоомный резистор, чтобы не болтался в воздухе – кто знает как работает китайская схема внутри
Преобразователь уровней получился максимально простой и, главное, рабочий
Далее, подключаемся к преобразователю через логический анализатор и смотрим, что там происходит на линии
Что меня больше всего запутало, так это выдача байтных посылок по 4 бита. Подумал, что это самопальный китайский протокол, основанный на SPI.
Чуть позже, до меня доходит, что это самый обычный SPI по ниспадающему фронту с посылками по 3 байта.
Посылки передаются 3 раза в секунду на частоте 3.288 кГц. Согласно одному сайту, если замкнуть, то скорость передачи возрастет до ~20. Меня устроили и 3 Гц.
Реверс протокола
Считал несколько посылок при положительных и отрицательных значениях на шкале измерителя и выписал их. Мне удобнее было черкать ручкой.
Небольшой затуп на 20 минут был связан с тем, что биты посылки нужно было развернуть с конца в начало и инвертировать (снова). И тогда все стало на свои места
Значащий бит – находится на 20-й позиции развернутой посылки
В данном девайсе реализуется классическая схема представления числа с запятой с помощью целочисленного, которое больше на размер порядка запятой. То есть, в данном случае – это было домножение на 100. Если циферблат показывает 50, то посылка содержит число 5000. Оказалось, что хитрые ребята из поднебесной программно занизили точность этого штангенциркуля и он на самом передает два числа (и больше!) после запятой, но на дисплее этого не отображает.
Вот код, который написал под российский МК (т.к. он был под рукой, но можно адаптировать ко всему что есть, т.к. SPI используется софтверный)
#include "main.h" volatile uint8_t recive_timeout; int main(void){ clk_init(); ini_timer(); GPIO_sSPI_init(); usart_ini(); _spi_init(); uint32_t caliper_data = 0; uint32_t out_data = 0; uint8_t sign_data = 0; while(1) { caliper_data = 0; out_data = 0; sign_data = 0; _caliper_read_data(&caliper_data); caliper_data = ~caliper_data; sign_data |= (uint8_t)((caliper_data & 0x00F00000u) >> 20); out_data = (uint32_t)(caliper_data & 0x000FFFFFu ); //if (sign_data){ // out_data *= -1; // } uart_SendU32(out_data); } return 0; }
Весь проект доступен на Гите:
Comment