Ремонт китайских детских качелей

Китайские детские качели. Хорошая игрушка — посадил ребенка, включил ее, и он под музыку качается или спит, а мама занимается своими делами.
В игрушке 5 изменений периода, три скорости качения, выбор не большой, но выбрать необходимый алгоритм можно.
но однажды сломалась.

При осмотре обнаружили:

  1. неисправны транзисторы в мосте ДПТ, транзисторы без обозначений.
  2. полетела программа в МК.

А вот с ремонтом китайских детских качелей пришлось повозится.

С транзисторами проблем не было-npn средней мощности в SMD корпусе.
А вот с контроллером возникла проблема.

Контроллер специализированный — в продаже нет. Программы тем более. И число пинов у него 24, а в PIC либо 18, либо 28. В коробке имелся PIC16F940. с двадцатью ножками. Пришлось вызванивать плату и определять хватит или нет ножек.

Имеем по схеме: 5 светодиодов на период качения, 3 светодиода на скорость, один на датчик оборотов, один на питание датчика, один сброс MCLR, 4 выхода на управление мостом ДПТ, два выхода на управление кнопками скорости и периода, один на включение моста, два на питание МК. Всего 20 – хватает. Мелодии воспроизводит специализированный микроконтроллер, но к нашему МК не подключен.

А с программой пришлось повозиться. Программа закладывалась простая — две пары регистров:

  • один для обслуживания счетчика импульсов скорости,
  • второй для счетчика периода.

В счетчик скорости поочередно закладываются константы единичного и нулевого уровня импульсов скорости, тем самым формируется импульсная последовательность. Меняя константы, можно менять скважность импульсов, получая аналог ШИМ последовательности. Встроенный в контроллер МК ШИМ не использовал, вначале не захотел, а потом пожалел об этом решении. Простота не всегда признак гениальности. Период качения задавался вторым счетчиком, меняя константу, записываемую в счетчик, можно было бы менять период качения. По окончании импульса, происходило переключение выходов контроллера, тем самым включалась первая или вторая диагональ моста ДПИ. Изменение констант производилось штатными кнопками, которые вызывали прерывания. В обработчике прерываний активировались счетчики, которые производили подсчет поступающих импульсов. Счетчики программно сбрасывались при достижении «11» для скорости и «101» для периода. Программу составили, залили в контроллер и тут началось… В 940 имеется только одно прерывание INT, остальные по периферии, что здесь не используется, и по портам А и В.
Если по INT можно задать фронт, то по портам, увы. И порт начинал отрабатывать длительность нажатия кнопки, что вызывало дополнительное время вращения двигателя. Пришлось отказаться от контроля состояния порта (счетчик на 5 мс не помог) и ограничиться только контролем флага.
Потом выявилось, что при реверсе вращения происходит замедление вращения двигателя, и период качения начинал «плыть» относительно среднего значения. Изменение констант проблему не решает, так как пришлось бы перебирать 5 х 3=15 возможных состояний. Пришлось подключать TMR1 на подсчет времени периода и по его прерыванию переключать выходы МК.
Для этого пришлось выковыривать из мышки оптопару с диском и лепить все это в игрушку. Выход оптопары подключил к контроллеру и получил импульсы частотой около 1 кГц. Подал на вход TMR1 — теперь вращение ДПТ в ту или иную сторону зависело от числа поступивших импульсов.
Отредактировали первичную инициализацию контроллера.
Проверяем дальше. Нашелся еще один «глюк». При переключении периода, заметили, что качение опять плывет.
Оказалось, что при переключении неправильно высчитали константы периода. Например, с 300 мс нужно переключиться на 500 мс. Записывали просто 500 мс, то есть 300+200, начало отчета в крайней точке (так как здесь кончается счет счетчика) и при следующем качении мы опять возвращаемся в крайнюю точку 300 мс периода. А это значит, что при периоде 500 мс у нас произошел поворот среднего положения качения на 100 мс. А нужно было делать так:. 300 мс+100 мс, а при следующем качении добавлять еще 100 мс — 400 мс+100 мс, тогда мы сохраним среднее положение качения.
Из-за этого пришлось оставить включение зоны прерываний только в реверсном состоянии и учитывать прерывания, возникающие в одном периоде, в работе счетчиков в другом периоде.
Даже такая простая программа с привязкой к реальному «железу» может «попить кровь» разработчика.
Программа писалась в MPASM, а первичная отладка в ISIS.

А ткаже:

Call