leoniv.diod.club

Автостоп

Проигрыватель «Арктур-006» является полуавтоматическим. Используемое в нем электропроигрывающее устройство (ЭПУ) типа G-2021 фирмы «Unitra» имеет микролифт с электромагнитным удержанием, который позволяет осуществлять плавное опускание и подъем тонарма вручную с помощью специального рычага, а также автоматический подъем тонарма при срабатывании автостопа. Также предусмотрен автоматический возврат тонарма на стойку при срабатывании автостопа или нажатии пользователем кнопки «Стоп».

Автостоп является довольно важной функцией. При его отсутствии оставленный в работе проигрыватель закончит проигрывание пластинки, игла перейдет на кольцевую заключительную канавку, где будет кружить вечно. При этом она будет изнашиваться, а ресурс иглы не такой и большой. Чтобы исключить подобную ситуацию, по окончанию проигрывания игла должна подняться, а диск проигрывателя остановиться.

Иногда высказывается мнение, что функция автостопа является вредной. В качестве аргумента приводятся какие-то уникальные пластинки, типа «Atom Heart Mother» группы Pink Floyd или «Sgt. Pepper’s Lonely Hearts Club Band» группы Beatles, где в конце пластинки записан звук на выводной и заключительной канавке. Без автостопа звук будет продолжаться бесконечно, именно так было задумано авторами. Сомнительное удовольствие, не правда ли? Тем не менее, в некоторых проигрывателях предусмотрено отключение автостопа.

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

В данном ЭПУ автостоп чисто механический. При приближении иглы к внутренним канавкам пластинки, рычаг тонарма входит в соприкосновение с рычагом автостопа, который далее активирует механизм. Рычаг автостопа дополнительно нагружает тонарм, что нарушает правильную работу иглы звукоснимателя. Проблема сильнее проявляется со временем, когда появляется износ механизма и его загрязнение. Кардинально решить проблему можно только заменив механический автостоп электронным.

С реализацией автостопа не все так просто, как может показаться на первый взгляд. Казалось бы, достаточно установить датчик (например, оптический), который будет срабатывать при повороте тонарма на такой угол, когда игла переходит на выводную канавку. Вот иллюстрация, почему нельзя сделать автостоп просто по датчику положения тонарма:

Данные взяты из стандартов RIAA, NAB и ГОСТ, везде они практически совпадают. Как видно, зона записи пластинок диаметром 175 мм заканчивается практически на том же радиусе, на котором заканчивается спиральная выводная канавка пластинок диаметром 300 мм. Поэтому по положению тонарма автостоп реализовать невозможно. Автостоп должен срабатывать не при достижении какого-то радиуса проигрывания, а при переходе на выводную канавку. А она отличается лишь шагом записи. Поэтому признаком срабатывания автостопа должно быть не положение тонарма, а скорость его перемещения. Самое интересное, что даже механический автостоп реагирует именно на скорость.

С описанием работы механического автостопа сложилась интересная ситуация. Ни в одном печатном источнике не удалось обнаружить точного и исчерпывающего его описания. В самых популярных у нас книгах по механической звукозаписи Л. П. Аполлонова, Н. Д. Шумова "Механическая звукозапись" и "Грамзапись и ее воспроизведение" вообще не описан механизм автостопа. В книге Л. Дегрелл "Проигрыватели и грампластинки" лишь сказано, что автостоп не может быть построен на основе датчика положения тонарма. Там же приводится ряд схем электронного автостопа, реагирующего на скорость. Но конструкция механического автостопа тоже не описана. Что-то по этой теме, возможно, есть в книге Ю. С. Полозов "Механизмы электропроигрывающих устройств", но в электронном виде эту книгу найти не удалось.

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

Механизм автостопа G-2021:

Sanyo TP-825D:

JVC L-A31:

Audio-Technica LP-60:

Скорее всего, конструкция берет начало с какого-то патента. Например, подобная система описана в патенте US3049354 "Sound reproducing apparatus" 1962 года. В патенте приводится и описание принципа работы. Но при этом используется сухой технический язык, который воспринимать очень трудно.

Подобная система фигурирует в патенте US3838860 "Tripping mechanism for record changer" 1974 года. Отличается она лишь формой рычагов.

Похожий механизм описан и в патенте US3339928 "Velocity trip mechanism" 1967 года. Только там применяются двигающиеся поступательно рычаги, а не поворачивающиеся вокруг оси.

В инструкции по ремонту ЭПУ G-2021 есть описание работы механических узлов, в том числе и автостопа. Но из этого описания трудно понять, почему автостоп срабатывает на большом шаге канавки, но не срабатывает на малом. Более-менее полное описание принципа работы механического автостопа, реагирующего на скорость, было найдено лишь в мануале на многодисковый проигрыватель NUTONE model 2500.

Удивительно, что ни в одной статье, ни на одном форуме не удалось найти популярного описания механизма автостопа. Исключение составляет лишь один короткий пост от Mike Phelan на форуме vintage-radio.net "How an autochanger velocity trip operates":

I am prompted by this, as there have been a few questions recently on the subject, and there has always been a misconception regarding their operation.
First, a bit of an overview:
We are talking about most BSR decks UA6 type mechanism and later UA12 types, and some Garrards - SP25, AT6 et al.
The trip is intended to operate either manually, or when the stylus reaches the run-out groove on the record; this moves the large cam gear by rotating it slightly; this rotation causes the gap in the teeth to move so they engage with the turntable hub gear, thus starting the trip cycle.
The cam gear has two pivoted levers - the trip pawl below and the trip lever uppermost.
There is a sliding lever that operates the trip lever by either the arm moving inwards, or by the manual reject knob.
The turntable hub has a projection to arrest the trip pawl. The trip lever rests lightly on the trip pawl and can rotate slightly.
Operation:
Deck is running, and about 5mm before the end of the record, the sliding lever pushes the trip lever, which, by gravity, pushes the trip pawl inwards so a projection on it encounters the hub projection.
Every time this happens, the stylus has moved by a groove-width, and the trip pawl moves a minute amount each time, so the hub projection pushes it back out of the way, the friction on the trip lever allows this to happen.
When the runout groove appears irrespective of where on the record it is the trip pawl is moved far enough in to be arrested by the hub projection, starting the trip cycle.
After the pickup arm has swung out near the end of the cycle, and the sliding lever moves away from near the trip lever and trip pawl, a ramp on the trip lever encounters a stop on the deck and pushes it and thus the trip pawl as well, back to their resting position.
The main problems are due to grease or oil ending up on the trip pawl and lever - they should be completely clean and dry.

Чтобы восполнить этот пробел, попробую описать работу автостопа на примере ЭПУ G-2021. В этом ЭПУ на валу шпинделя установлена небольшая шестерня 5 (см. снимок ниже). Рядом с ней установлена программная шестерня 1, которая может входить в зацепление с шестерней шпинделя. Но это зацепление есть не всегда. В программной шестерне имеется некоторый промежуток, где зубья отсутствуют. При нормальной работе проигрывателя шестерня всегда ориентирована как раз этим промежутком и в зацепление с шестерней шпинделя не входит. Но если с помощью дополнительных рычагов программная шестерня будет повернута на небольшой угол, она войдет в зацепление и совершит ровно один оборот, прежде чем снова выйдет из зацепления. За этот оборот будет выполнен подъем тонарма и возврат его на стойку.

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

На программной шестерне 1 размещен пластиковый рычаг автостопа 3, который может поворачиваться вокруг оси. Сверху на нем расположена латунная собачка 2, которая также может поворачиваться вокруг той же оси. Между ними нет никакой жесткой связи, действует лишь сила трения. Надо отметить, что смазывать этот узел нельзя, он рассчитан на работу с сухим трением.

Во время проигрывания пластинки тонарм медленно перемещается к центру диска. Начиная с радиуса канавки примерно 60 мм, тонарм приводит в движение промежуточный рычаг 4, который расположен снизу шасси (на снимке виден через прямоугольное отверстие). Промежуточный рычаг давит на нижний выступ рычага автостопа 3 и поворачивает его. Расположенная сверху собачка 2 поворачивается вместе с ним за счет силы трения. Когда собачка приближается к шестерне шпинделя 5, выступ 6 на каждом обороте диска толкает собачку обратно, отдаляя ее от шпинделя. При этом собачка проскальзывает по поверхности рычага 3. Этим предотвращается раннее срабатывание автостопа, пока проигрывается участок пластинки с малым шагом канавки.

Когда начинается выводная канавка, шаг значительно увеличивается, и тонарм начинает перемещаться гораздо быстрее. Теперь за время одного оборота диска собачка успевает приблизиться к шпинделю настолько, чтобы войти в зацепление с выступом шестерни. При этом программная шестерня немного поворачивается и входит в зацепление с шестерней шпинделя. Начинается процесс срабатывания автостопа и автовозврата тонарма, который завершается в течение одного полного оборота шестерни. Завершив этот оборот, шестерня выходит из зацепления, а с помощью специальных выступов собачка и рычаг автостопа приводятся в исходное положение.

Может показаться, что любое приближение собачки к шпинделю вызовет зацепление ее с выступом шестерни, что приведет к срабатыванию автостопа. Так как и выступ, и собачка имеют острые грани, то, начиная с какого-то момента, они должны войти в зацепление. Однако более подробное изучение формы выступа показало, что его задняя грань "B" находится на радиусе примерно на 0.1 мм большем, чем передняя грань "A". Поэтому если за оборот шпинделя собачка приблизится к выступу менее чем на 0.1 мм, то она не войдет в зацепление, а выступ оттолкнет ее обратно. Причем сделает он это гранью "B", которая коснется собачки в каком-то месте плоской поверхности снизу. В результате в начале каждого нового оборота шпинделя собачка вновь будет находиться на расстоянии 0.1 мм от передней грани выступа. Так может продолжаться сколь угодно долго.

Но если за время одного оборота шпинделя перемещение собачки превысит 0.1 мм, тогда выступ толкнет собачку гранью «A» в боковую поверхность, что вызовет поворот программной шестерни и срабатывание автостопа.

Тонарм воздействует на собачку через систему рычагов, да и сам тонарм представляет собой рычаг. Зная плечи каждого из рычагов данной кинематической схемы, можно рассчитать, какому перемещению иглы соответствует определенное перемещение собачки. Для G-2021 перемещение собачки на 0.1 мм соответствует радиальному перемещению иглы примерно на 0.75 мм. Это и является минимальным шагом канавки, необходимым для срабатывания автостопа. Средний шаг записи для пластинок составляет 0.1 мм, поэтому автостоп в зоне записи срабатывать не будет. Шаг выводной канавки согласно стандарту составляет 3.5…9.5 мм, при ее достижении автостоп гарантированно сработает. Между треками пластики может быть соединительная канавка с шагом 0.8…1.6 мм, что больше порога срабатывания автостопа. Но, согласно стандарту, она не может находиться на радиусах, меньших 63.5 мм, а автостоп функционирует лишь на радиусах, меньших 60 мм. Хотя лучше было бы иметь более высокий порог срабатывания автостопа по шагу записи.

Если перевести шаг в линейную скорость, то порог срабатывания автостопа составит примерно 0.4 мм/сек. Именно на такую радиальную скорость перемещения иглы он будет реагировать. Возможно, что расчеты на основе геометрических измерений дали несколько заниженный результат из-за погрешностей и отсутствия учета люфтов. Точное значение скорости срабатывания автостопа можно определить только путем прямого измерения. Но для этого нужна специальная измерительная пластинка с выводной канавкой переменного шага. Для проверки автостопа можно использовать, например, измерительную пластинку ИЗМ33Д-0169, на которой автостоп должен срабатывать в конце второй стороны пластинки, но не срабатывать в конце первой

Механизм автостопа полностью развязан от шпинделя вплоть до момента срабатывания. Поэтому на равномерность вращения диска этот механизм никакого влияния не оказывает. А вот с тонармом механическое взаимодействие есть. При радиусах канавки меньше 60 мм тонарм дополнительно нагружается промежуточным рычагом и рычагом автостопа. Когда собачка автостопа приближается к шестерне шпинделя, она на каждом обороте касается выступа шестерни. Периодические вибрации могут передаваться тонарму.

После некоторого срока эксплуатации проигрывателя проблемы с автостопом так или иначе начинают проявляться. Чтобы полностью их устранить, надо избавиться от механического контакта механизма автостопа с тонармом. Можно, конечно, просто отключить автостоп, сняв с программной шестерни рычаг автостостопа и собачку. Но такое решение вряд ли можно считать хорошим.

Исполнительный механизм автостопа в виде программной шестерни можно оставить, так как никакого вреда он не приносит. А вот датчик автостопа нужно заменить бесконтактным, который не будет нагружать тонарм. Этот датчик должен генерировать аналоговый сигнал, из которого можно выделить сигнал скорости тонарма. При достижении пороговой скорости тонарма схема управления должна сформировать сигнал, который будет запускать процесс автостопа и автовозврата. Для запуска процесса необходимо повернуть промежуточный рычаг, что можно сделать, например, с помощью электромагнита. Здесь не требуется большого усилия и хода, поэтому подойдет практически любой малогабаритный электромагнит.

Поскольку теперь анализировать скорость движения тонарма будет электроника, механические узлы можно упростить. Собачку и рычаг автостопа теперь можно жестко соединить между собой, а для их возврата в исходное положение добавить пружину.

Остается выбрать датчик автостопа. С него требуется получить аналоговый сигнал, пропорциональный углу поворота тонарма, который дальше будет подаваться на АЦП микроконтроллера. Затем программно можно вычислить производную этого сигнала по времени, чтобы найти скорость перемещения тонарма. При превышении установленного порога скорости должна сформироваться команда срабатывания электромагнита автостопа.

Из бесконтактных аналоговых датчиков существуют фотоэлектрические (например, пара светодиод-фототранзистор), индуктивные, датчики на эффекте Холла. Но все они имеют заметную нестабильностью. Любой датчик с аналоговым выходом будет подвержен температурному дрейфу, старению, влиянию внешней засветки или магнитного поля. Постоянную составляющую сигнала вместе с его медленным дрейфом операция дифференцирования может убрать, но останется нестабильность коэффициента передачи и связанная с этим ошибка вычисления скорости. Конечно, в данном случае точность вычисления скорости не так критична, но хочется найти более надежное решение, по возможности цифровое.

Очень интересным в этом плане показался патент SU781958, где предлагается следующая конструкция оптического датчика автостопа: между излучателем и фотоприемником помещается гребенка из чередующихся прозрачных и непрозрачных полос, связанная с тонармом. Тогда при перемещении тонарма с малой скоростью импульсы с фотоприемника будут иметь малую частоту, а при увеличении скорости в зоне выводной канавки частота будет увеличиваться. Сравнивая частоту импульсов с установленным порогом, можно сформировать сигнал срабатывания автостопа. Самое главное, теперь оптический датчик перестает быть аналоговым. На выходе он должен выдавать только 1 или 0, и подключается он теперь к простому цифровому порту ввода, а не к входу АЦП. У такого датчика не будет никаких нестабильностей.

Применение только одной пары излучатель-приемник имеет недостаток. Если возникнут небольшие колебания гребенки в месте переключения логических уровней, возникнет дребезг, который будет воспринят как перемещение тонарма. Для повышения помехоустойчивости системы можно добавить второй фотоприемник и получить два квадратурных сигнала, как в инкрементальных энкодерах. Такой датчик будет иметь 4 состояния, за счет чего легко осуществить подавление дребезга. Переход между соседними состояниями просто не нужно считать перемещением.

В качестве фотоприемника можно попробовать использовать сдвоенный фототранзистор, который используется в компьютерных мышках. Между чувствительными областями расстояние в нем порядка 0.6 мм.

Сложнее обстоит дело с гребенкой. Она должна быть смонтирована на рычаге тонарма и должна иметь радиус примерно 30 мм. Чтобы получить тот же порог скорости, что и у механического автостопа, нужно детектировать перемещения порядка 0.1 мм. Хотя это, возможно, лишнее, так как по стандарту шаг выводной канавки не может быть меньше 3.5 мм. Тогда разрешение датчика можно ухудшить до примерно 0.45 мм, что вполне реализуемо. Как вариант, я попытался использовать гребенку, напечатанную на лазерном принтере на специальной пленке. Шаг рисок 0.1 мм получился плохо, а вот 0.2 мм – вполне приемлемо.

Но все равно конструкция такого датчика вырисовывается очень смутно. Тут пришла еще одна мысль: если используется сенсор от компьютерной мыши, то почему бы сразу не взять его от оптической? Например, распространенный PAN3101. По идее, его разрешения хватит для отслеживания перемещения тонарма. Датчик имеет интерфейс SPI, а у некоторых моделей (например, OM02) есть интерфейс, полностью эмулирующий квадратурный энкодер. Начал с экспериментов с таким сенсором.

Эксперименты показали, что сенсор дает порядка 30 отсчетов на миллиметр. Это соответствует его заявленному разрешению 800 cpi. Очень критичным оказалось расстояние до поверхности. Из сенсора можно прочитать число, характеризующее качество картинки, которую видит сенсор (Image Quality). При настройке надо получить его максимальное значение. Проверил работу сенсора с подсветкой разных цветов, так как хотелось перейти на невидимую ИК-подсветку, чтобы внутри корпуса проигрывателя ничего не светилось. Сенсор прекрасно видит ИК, но разрешение при этом заметно падает. Этот факт меня несколько удивил, позже я нашел ему подтверждение в datasheet на сенсоры Avago. Поэтому решил остановиться на красной или белой подсветке.

Микросхема оптического сенсора содержит внутри DSP и тактируется от внешнего резонатора 24 МГц. Поэтому сенсор может являться источником помех. Излучение помех я обычно проверяю с помощью петли, которую делаю из земляного провода щупа осциллографа.

На экране осциллографа увидел что-то такое (5 мВ / 50 мкс в клетке). В общем, ничего страшного, но экранировать придется, учитывая близкое расположение датчика автостопа от точки выхода проводов из тонарма.

Очень сложно работать над механизмом ЭПУ, не имея его чертежей. Чтобы спроектировать детали датчика автостопа, сфотографировал шасси ЭПУ снизу, затем перенес изображение в Corel Draw и подстроил его размеры под натуральные. Конечно, на фотографии присутствуют искажения, но это лучше, что ничего. К тому же, очень неудобно проводить измерения на ЭПУ с установленным тонармом – страшно его повредить. Поэтому свел натурные измерения к минимуму, измерил только позицию рычагов тонарма в положении парковки и на выводной канавке. Дальше можно рисовать на компьютере.

Для датчика перемещения тонарма нужна шторка в виде сегмента кольца радиусом примерно 35 мм. Высота этого сегмента должна быть примерно 20 мм, так как тонарм будет регулироваться по высоте на 10 мм. Этим я несколько усложнил себе задачу по доработке ЭПУ. При поиске заготовки начал охотится за всеми цилиндрическими предметами похожего размера. Присматривался ко всяким банкам в хозяйственном отделе магазина, была даже куплена банка пива для экспериментов. В результате остановился на пластиковой трубе от компьютерного корпуса, где она служила воздуховодом.

Когда радиус шторки стал точно известен, чертежи были подкорректированы. Для крепления шторки нужна специальная деталь, которую решил изготовить из листового полистирола. За неимением поворотного столика обработку дуг делал на самодельном поворотном устройстве на основе шарикоподшипника. Заготовку пришлось поворачивать руками, благо, материал мягкий. В результате получилось вполне нормально, хотя и не без доработки напильником – куда же без него?

От пластиковой трубы надо отрезать кольцо высотой 20 мм. Набрал стопку плиток высотой 20 мм и сделал разметку. Отпилить проще всего ножовкой по металлу, дав небольшой припуск.

Выровнять торец проще всего фрезой, положив кольцо на стол станка и поворачивая его руками, пластик ведь мягкий.

Кольцо готово. Осталось лишь выпилить из него сектор и выровнять края напильником.

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

Для этого использую самодельный клей – растворенные в тетрагидрофуране опилки черного полистирола. При склейке надо соблюдать высоту установки сектора и перпендикулярность деталей. Для задания высоты набрал стопку плиток высотой 5.5 мм, а перпендикулярность контролирую угольником. Клей схватывается очень быстро, через несколько минут детали скреплены.

Для сенсора оптической мыши поверхность сектора надо подготовить. Сенсор не любит блестящих поверхностей. Можно было сделать механическую обработку, например, наждачкой. Но вместо этого я наклеил полоску черной матовой пленки Oracal. Проверено – на ней оптическая мышь работает просто замечательно.

Теперь осталось подготовить узел рычагов тонарма. Один из рычагов я укоротил, затем просверлил два отверстия и нарезал резьбу M2.

Финальная операция – проверка и юстировка эксцентриситета и перпендикулярности сектора.

Следующий этап – изготовление сенсора перемещения тонарма. Оптическая мышь скомпонована очень свободно, поэтому использовать готовую плату не представляется возможным. Она просто не влезет в нужные габариты. Было решено перенести оптический датчик мыши PAN3101 на другую плату.

Хотел найти датчик ADNS-2620 с возможностью считывать картинку, но ни в одной мыши такого датчика не встретилось. С такой возможностью попадались лишь датчики в крупных корпусах с большим количеством выводов, которые не подходят по габаритам.

Всю обвязку датчика сделал на SMD компонентах, что позволило уменьшить габариты платы. Сам датчик тоже сделал по типу SMD, выпрямив и обрезав ножки. Он садится в вырез платы и планарно припаивается к площадкам. Разъем тоже превращен в SMD путем отгибания выводов и припаивания их к площадкам. Кварц SMD на 24 МГц нашел на плате старого пишущего CD-ROM.

Оптическая система мыши очень громоздкая, поэтому я решил использовать оттуда только линзу. Подсветку решил сделать прямую с помощью белого SMD светодиода, взятого из подсветки экрана телефона. Плата получилась односторонняя, отверстия понадобились только для выводов светодиода.

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

В итоге получился законченный датчик в отдельном корпусе.

Спереди прикрутил пластмассовую маску, чтобы датчик особо не светил по сторонам.

Подключается датчик с помощью четырехконтактного разъема. Провод взял экранированный, тоже от какой-то мыши.

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

Не уверен, что этот кронштейн можно будет установить на свое место, так как шасси ЭПУ имеет выштампованные ребра жесткости, которые могут помешать. Но без точного чертежа шасси этого сказать пока нельзя. Что ж, придется в случае чего дорабатывать деталь по месту. Неприятно, но ничего не поделать в данной ситуации.

Последний штрих – проверка сенсора перемещения тонарма в паре со штатной шторкой.

Для примерки навесных агрегатов понадобилось сделать пробную установку тонарма. Что-то делать с ЭПУ с установленным тонармом крайне неудобно. Водрузил ЭПУ в перевернутом состоянии на книги. По результатам примерки корпуса агрегатов пришлось хитро подрезать. В датчик перемещения тонарма упиралась гайка крепления тонарма, а кронштейн датчика положения парковки налезал на ребро жесткости шасси.

После доработки агрегаты нормально подошли и отрегулировались.

Датчик перемещения тонарма дает на полный ход тонарма примерно 1000 отсчетов. Если привести это к перемещению иглы, то радиус проигрывания можно будет отслеживать с точностью порядка 0.2 мм (для сравнения, средний шаг канавки на пластинке составляет примерно 0.1 мм). Появилась идея на цифровом дисплее выводить не только скорость "33" или "45", но и радиус проигрываемой канавки вида "124.5 мм". Можно будет на конвертах пластинок помечать любимые места в миллиметрах, а затем по показаниям дисплея устанавливать туда иглу. Поскольку датчик отслеживает положение во всем диапазоне перемещения тонарма, можно заложить дополнительный функционал: если некоторое время перемещение отсутствует (например, пластинку заело), то будет срабатывать автостоп. Таким же образом можно отслеживать и круговую заключительную канавку, хотя по скорости автостоп будет срабатывать чуть раньше – в начале выводной канавки. Кроме того, имея точное значение скорости тонарма, можно распознавать соединительные канавки и выводить на дисплей номер проигрываемого трека. Осталось написать программную поддержку для всего этого.

Первоначальный тест датчика оптической мыши PAN3101 был выполнен с помощью макетной платы на ATmega64 с графическим дисплеем, где обмен с датчиком был реализован программно. Теперь надо реализовать обмен «начисто», думая об используемых ресурсах. В качестве управляющего процессора проигрывателя планируется применить STM32F103 (или подобный, пока точный тип не выбран). На первом этапе работаю с STM32F100RBT6B, который установлен на плате «Discovery».

Сенсор имеет двухпроводный последовательный интерфейс, состоящий из линии тактирования SCLK и двунаправленной линии данных SDIO. Частота тактирования может быть довольно большой (до 10 МГц), но между передачей команды и приемом ответа нужно делать паузу, чтобы дать возможность процессору датчика подготовить ответ. Для PAN3101 это время составляет минимум 3 мкс. Для других типов датчиков оно может быть еще больше, например, для ADNS-2051 это время составляет 100 мкс.

Слишком быстро считывать датчик здесь не требуется, внутренние регистры хранят перемещение до 127 шагов. При разрешении 800 cpi это целых 4 мм пути. Максимальная скорость перемещения, которую поддерживает датчик, составляет 0.5 м/с. Чтобы не потерять координату, частота считывания должна быть не менее 133 Гц, т.е. примерно раз в 7.5 мс. Для данного применения такая скорость вряд ли нужна, так как столь быстро перемещать тонарм никто не будет. Поэтому считывать датчик можно еще реже.

Всегда желательно иметь в системе как можно меньше прерываний. В данном случае можно обойтись вообще без них, и даже без программного опроса флагов. Обычно имеется системный таймер, который формирует в программе все необходимые временные интервалы. В моем случае период системного таймера равен 1 мс. Любая задача может привязать выполнение какого-то фрагмента к системному тику. По системному тику можно запускать передачу команды в датчик. По следующему тику (через 1 мс) можно запускать чтение результата. По следующему – считывать из порта принятое значение и запускать передачу следующей команды. Затем опять запускать чтение результата и так далее. После цикла опроса при желании можно сделать паузу длительностью несколько системных тиков. Скорость обмена должна быть выбрана так, чтобы к моменту следующего тика транзакция гарантированно завершилась. Тогда не анализируя никаких флагов можно начинать новую транзакцию.

Интерфейс датчика больше всего похож на SPI, только имеет совмещенный сигнал MISO/MOSI. Порт SPI процессоров STM32 как раз имеет полудуплексный режим, который поддерживает двунаправленную линию данных. После некоторого погружения в документацию инициализация порта SPI готова.

  RCC->APB1ENR |= RCC_APB1ENR_SPI2EN; //включение тактирования SPI2

  SPI2->CR1 =              //настройка SPI:
    SPI_CR1_CPHA     * 1 | //CPHA = 1
    SPI_CR1_CPOL     * 1 | //CPOL = 1
    SPI_CR1_MSTR     * 1 | //мастер
    SPI_CR1_BR_0     * 3 | //тактовая частота APB2 / 16
    SPI_CR1_LSBFIRST * 0 | //MSB first
    SPI_CR1_SSI      * 1 | //мастер
    SPI_CR1_SSM      * 1 | //программное управление NSS
    SPI_CR1_RXONLY   * 0 | //full duplex
    SPI_CR1_DFF      * 0 | //8 bit data frame
    SPI_CR1_CRCNEXT  * 0 | //CRC не используется
    SPI_CR1_CRCEN    * 0 | //CRC не используется
    SPI_CR1_BIDIOE   * 1 | //output enable
    SPI_CR1_BIDIMODE * 1 | //1-line mode
    SPI_CR1_SPE      * 1;  //разрешение SPI

Протестировал передачу – все работает исправно. Ставлю SPI_CR1_BIDIOE = 0 и тестирую прием – что за ерунда? Я считал, что прием байта инициируется записью в DR любого кода, а после приема байта процесс останавливается. Это было бы логично. Но на практике при включении приема сразу начинает генерироваться сигнал SCLK. И он генерируется непрерывно, пока прием не будет выключен. Еще раз прочитал документацию – так и есть, SCLK генерируется постоянно. Я не понимаю, как такой режим можно вообще использовать. Любой лишний клок, попавший на слейв, приведет к нарушению синхронизации. Вот тут дают рекомендации отслеживать флаги и быстро выключать прием, при этом проверяя правильность работы программы осциллографом или логическим анализатором. Но это совсем не то, что требуется. Занимать процессор опросом флагов – никогда. Да еще и результат не гарантируется. А вдруг какое-то прерывание вклинится, тогда появится лишний клок и нарушится синхронизация. Получается, опять придется снаружи соединять два вывода процессора и программно переводить один из них в третье состояние при приеме. Пресловутая периферия STM32, которая, вроде, может все, опять оказалась не такой универсальной.

Прежде чем закорачивать снаружи выводы, решил испробовать еще одну возможность – использование USART в синхронном режиме. Тем более, столь ценный ресурс, как аппаратный SPI, жалко тратить на этот датчик. Порт может пригодиться для более важных дел.

USART в синхронном режиме заработал, но на линии данных заметил нечто неладное. Пересчитал на осциллографе клоки и не досчитался одного – не был установлен бит USART_CR2_LBCL. Когда сенсор недосчитывается клока, то запускается процесс ресинхронизации интерфейса: через 1.7 мс логика интерфейса сбрасывается, а вывод SDIO переходит в состояние Hi-Z. Это я и пронаблюдал на экране осциллографа.

В синхронном режиме USART шлет мусор в виде стартового и стопового бита, но, к счастью, клоками их не сопровождает.

USART имеет полудуплексный режим работы. Для этого надо установить бит USART_CR3_HDSEL. Тогда вывод RX не используется, а вывод TX становится двунаправленным. Такой режим я когда-то успешно проверял при работе через USART с датчиками DS18B20. Но, оказывается, синхронный режим USART и полудуплексный режим вместе не работают. Так написано в документации. Для надежности я проверил в железе – точно не работает. И тут опять приходим к необходимости соединять два вывода процессора снаружи.

Но это еще не все. USART всегда передает первым младший бит, и это не программируется. А для датчика PAN3101 нужно первым передавать старший бит. Придется вращать байт. Сначала сделал это универсальным способом на Си:

v = ((v >> 1) & 0x55) | ((v << 1) & ~0x55); // swap odd and even bits
v = ((v >> 2) & 0x33) | ((v << 2) & ~0x33); // swap consecutive pairs
v = ((v >> 4) & 0x0F) | ((v << 4) & ~0x0F); // swap nibbles

Затем вспомнил, что здесь целый Cortex M3 с его богатой системой команд. Хорошо, что CMSIS и компилятор через intrinsics-функции предоставляют доступ к многим ассемблерным командам. Для реверса бит есть функция __RBIT. Но она крутит биты в 32-разрядном слове, поэтому нужен еще сдвиг, который, впрочем, оптимизируется компилятором до взятия нужного байта.

b = __RBIT(b) >> 24;

На этом неприятности с сенсором не закончились. Его интерфейс имеет лишь два сигнала, SCLK и SDIO, а сигнала CS нет. В этой связи наблюдается специфическое поведение при переключении сенсора с записи на чтение. Для чтения сенсора сначала мастер должен передать команду с адресом регистра, который собираемся читать. Младший бит адреса должен быть равен 0, это как раз и означает, что будет чтение. Биты данных стробируются фронтом SCLK, это вполне обычно. После окончания передачи нужно выждать некоторую паузу (> 3 мкс), после чего сформировать еще 8 периодов на SCLK для чтения байта. Как только на SCLK появляется низкий уровень, вывод сенсора SDIO переключается на передачу и начинает выдавать бит за битом по каждому спаду SCLK. Когда заканчивается 16-й период, на SCLK устанавливается высокий уровень (на верхней диаграмме на рисунке я подрисовал красным). При этом вывод SDIO остается включенным на передачу и на нем присутствует значение последнего (младшего) выданного бита.

На самой нижней диаграмме на рисунке это место показано более детально. Спад на SCLK, который идет после 16-го периода, является началом передачи мастером следующей команды. По этому спаду выход SDIO сенсора переходит в состояние Hi-Z. Но ведь по этому же спаду выход мастера включается на передачу (я показал это синей линией). На линии SDIO возникает коллизия. Судя по рисунку из datasheet, мастер должен быть более медленным, чем сенсор, и включать свой выход с заметной задержкой. На практике такого нет, данные на выходе мастера появляются с задержкой всего пару наносекунд после спада SCLK. В случае использования USART вместо SPI ситуация еще хуже – перед первым периодом клока передатчик включает свой выход и выдает старт-бит, не сопровождая его клоком. В результате вместо короткой наносекундной коллизии получаем коллизию длиной в целый бит. Похожие картинки рисуют и для других сенсоров, но как сделать так, чтобы момент «Driven by micro» наступал с задержкой, как того требует картинка, неизвестно.

Для наблюдения коллизий добавил в линию данных два резистора, к средней точке которых подключил осциллограф. Коллизии стали хорошо видны в виде импульсов с уровнем между 0 и 1. Пытался менять полярность и фазу SCLK – если коллизия исчезает в одном месте, то появляется в другом. Попытки избежать коллизий с применением внешней логики тоже не увенчались успехом.

Из рекомендаций на эту тему удалось найти только одну, но совершенно гениальную. В документе «STM32L4 – SPI» от STM рекомендуют в полудуплексном режиме всегда включать в линию данных последовательный резистор во избежание коллизий. Правильнее было бы сказать, для смягчения последствий коллизий. Что ж, так придется и поступить, раз нормального выхода нет.

Теперь показания оптического сенсора считываются правильно, дисплей исправно индицирует положение тонарма. Но неприятности продолжают преследовать. Мне надо выключить режим автоматического засыпания сенсора, который включен по умолчанию. Перемещение у меня медленное, сенсор будет постоянно засыпать, а при просыпании возможны пропуски координат. К тому же, светодиод у меня все равно питается отдельно и постоянно (если управлять им от сенсора, то там всегда будет ШИМ со своими помехами). Но когда при инициализации сенсора я добавил передачу команды выключения автоматического засыпания, она не заработала.

не используется. Затем нужные пины настраиваются в режим альтернативных функций с нужными параметрами. Затем включается и инициализируется периферийный блок (SPI или USART). Возможны ли переключения уровней на выводе SCLK в процессе всех этих настроек? Думаю, что возможны. Как вариант, после процедуры настройки можно искусственно создать условия для ресинхронизации порта. Но на практике это не спасает. Дело, видимо, в том, что при этом приходится временно отключать вывод от периферии и управлять им вручную, а потом снова включать альтернативную функцию. При этом тоже возможны лишние переключения уровня. Что конкретно происходит на выводе SCLK, без цифрового осциллографа посмотреть трудно, ведь процесс инициализации проходит однократно. В результате пришлось пойти по пути параметрического программирования. Т.е. перебираем все возможные способы написания интересующего фрагмента программы и смотрим на результат. Устраивает – останавливаемся. Не устраивает – перебираем дальше. Несмотря на то, что возможных комбинаций чуть меньше, чем бесконечность, работающий вариант обычно быстро находится. Здесь он выглядит так: настроить порт SCLK на вывод, подать на него ноль, подождать 2 мс, настроить порт на альтернативную функцию, включить и настроить USART, опять переключить порт на вывод, подать последовательность ресинхронизации (единица, задержка 2 мс, ноль, задержка 2 мс, единица, задержка 2 мс), затем снова настроить порт на альтернативную функцию. Теперь можно подавать команду отключения SLEEP – все работает. И дальше датчик работает исправно. Если выбросить любой шаг цепочки или перенести в другое место – не работает. Неприятно, но что делать? От безысходности добавил в исходный текст программы комментарий «Magic pass».

Дальнейшая обработка данных, полученных с сенсора, ложится на плечи системы управления, но это совсем другая тема.

Надо сказать, что на практике в большинстве случаев будет достаточно иметь автостоп, реагирующего на положение тонарма, а не на скорость его перемещения. Потому что подавляющее количество пластинок – это долгоиграющие диски диаметром 300 мм. Диаметр заключительной канавки у них стандартизирован, поэтому вполне можно настроить на него датчик автостопа. В качестве датчика можно применить щелевой оптрон, а на одном из рычагов тонарма закрепить шторку. Конструкция датчика может быть подобной датчику положения парковки тонарма, который был описан выше.

Ридико Леонид Иванович www.leoniv.diod.club e-mail: wubblick@yahoo.com