leoniv (leoniv) wrote,
leoniv
leoniv

Categories:

ДБ-95 – сервисная программа



Макет контроллера для двигателя ДБ-95 аппаратно готов, осталась самая длительная и самая неприятная часть работы – программирование. Для того, чтобы вести отладку программы микроконтроллера, сделал на компьютере сервисную программу. С ее помощью можно задавать любые параметры, а также выводить интересующие значения в виде цифр и графиков. Эту программу на скорую руку написал на C++ Builder 6 (привет mbr). С программой микроконтроллера пока все плохо, потратил полдня на написание простого измерителя скорости. Говорят, что программирование имеет феноменальную особенность – один неправильный символ может остановить взрослого, сильного человека на несколько дней. Натыкаюсь на это раз за разом.



Никаких серьезных проблем не встретилось, и это особенно обидно. Тратил время по пустякам. Сначала долго бился над неправильной передачей значений на компьютер. Часть команд работает нормально, а новая команда, которую только что добавил, передает какой-то бред. Глянул тестером протокола WakeUp – контроллер шлет все правильно. До одури искал ошибку в программе на компьютере. Оказалось, что в тестере протокола я плохо посмотрел – один байт был пропущен, контроллер его не посылал. Просто забыл его передать, и все остальное сдвинулось. Нашел ошибку самым эффективным способом отладки – длительным всматриванием в текст программы.

Через пару часов нервов обмен данными заработал нормально. Но измеритель скорости слал какие-то левые данные. Опять начал созерцать исходник. Нашел – неправильно объявил тип двух переменных: вместо uint16_t написал uint8_t. Поправил. Поменялось, но лучше не стало. Опять вглядываюсь в исходник. Нашел – не тот флаг анализирую в прерывании по захвату при коррекции числа переполнений. Типичная ошибка Copy-Paste, раньше эта строчка использовалась с таймером, который считал до MAX, а тут он считает до TOP, заданного в OCR1A. Поправил. Поменялось, но лучше не стало. Опять вглядываюсь в исходник. Ничего плохого не вижу. Дописал вывод в порт целой пачки переменных, шлю их в компьютер, там смотрю в виде графиков и сохраняю в файл. Дальше анализирую колонки цифр, пытаясь понять, что это за ситуация изредка встречается, когда наблюдается сбой. Никакой зависимости не вижу. Пишу обработку этих цифр на компьютере, чтобы понять причину выбросов на измеряемой скорости. Так, словил в потоке закономерность: глюк появляется, когда в формуле от меньшего беззнакового числа отнимается большее. Но ведь должно быть все правильно, если делать вычитание в той же разрядной сетке, что и сами числа. Стоп! Доходит. Украшая исходник, выкинул объявление локальной переменной и целую строчку, где делаю это вычитание. А вписал его в общую формулу. Но ведь там операнды более «широкие» и все приведется к этому типу! Восстановил отдельную строчку, все заработало. Полдня прожито, за это время можно было спаять несколько плат, фрезернуть какую-нибудь деталь, ну или написать пять строчек программы. Хотя есть важное уточнение – работающих.

Двигатель самостоятельно еще не регулируется, после таких приключений с простейшими фрагментами программы страшно браться за такие сложные вещи, как цифровая PLL. К программированию вырабатывается устойчивая фобия. Чтобы хоть как-то порадоваться, решил измерить динамику разгона двигателя со штатной платой управления. Взял с нее сигнал таходатчика и подал на вход захвата микроконтроллера. Получились графики, которые видны на заглавной картинке. Сначала там идет старт двигателя, затем – реверс. Как видно, разгон до номинальной скорости происходит быстро, примерно за 0.3 сек. Также видно небольшое перерегулирование.



Со штатным блоком измерил реальное среднее потребление двигателя. На холостом ходу при скорости 19.05 см/с – 50 мА. С прижатым роликом – 97 мА. С протягиванием ленты – 108 мА. Как видно, значения очень далеки от максимального тока 2 А. Глянул динамику разгона на новом макете. Разницы между током 2 А и 1 А не заметил, что вполне логично – ток при разгоне быстро падает. Но при 0.5 А разгон заметно замедляется, зато становится тихим и приятным. До 1 А максимальный ток можно спокойно снизить, ни на что это не повлияет. А снизить его желательно по той причине, чтобы не работать в самом низу шкалы. А то от разрядности моего ЦАП ничего не останется, хоть я и использую 14 бит.

Вообще, там всех 16 бит (8 бит PWM + 8 бит SDM). Чтобы сильно не расширять спектр вниз (фильтр ослабляет 1 кГц и выше), я использую 6 бит SDM. Код при этом не менял, как я понимаю, достаточно обнулить младшие биты, и частота сигнала SDM поднимется сама собой.



Раз тут зашла речь про C++ Builder 6 (снова привет mbr), хочу спросить совета. Ведь очень многие электронщики знакомы с VCL, пусть не по Builder, так по Delphi. Есть один маленький глючок, который особо не мешает, но все же. Для подключения устройства я использую отдельную форму Connect. На ней лежит компонент TListView, на форме он сделан Active Control. В него добавляю имена найденных портов. Также пробую открыть эти порты и получить имя устройства. Если получаю – добавляю вместе с именем порта. Если найдено подходящее устройство, строчку выделяю: ListView->ItemIndex = i.

Проблема в следующем. Когда это окно открывается, вижу список и выделенную строку в нем (на скриншоте – нижняя). Если теперь на клавиатуре нажимаю кнопку вверх – ничего не происходит. Но если нажать вниз, то выделяется самая верхняя строка. Такое впечатление, что индекс, который используется для работы с клавиатуры, был равен -1 и перескочил в 0, когда нажали кнопку вниз. Но ведь ItemIndex = 2, это я проверял. Других индексов там, вроде, нет. Куда в такой ситуации копать?

Дополню. В списке строка выделена, сам контрол активен, фокус на нем. Но если по уже выделенной строке щелкнуть мышью, после этого клавиатура работает нормально.

Еще дополню. Удалось проблему победить. Для активной строчки списка добавил ListItem->Focused = true, клавиатура нормально заработала.

Tags: electronics, reel-to-reel, Электроника-004, катушечник, магнитофон
Subscribe

  • Измеритель уровня V0.1

    Сделал первую версию прошивки нового измерителя уровня для магнитофона "Электроника-004". Все еще очень-очень сырое, но уже полоски как-то…

  • Sharp GF-777

    Попал тут ко мне Sharp GF-777. Без преувеличения можно сказать, что это легенда. Обладать таким аппаратом могли лишь избранные. Стоил он когда-то…

  • JVC TD-V662

    Когда просят посмотреть кассетную деку, говорят удивительные вещи. Что не могут найти мастера, который за это бы взялся. Но ведь аналоговая…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 39 comments

  • Измеритель уровня V0.1

    Сделал первую версию прошивки нового измерителя уровня для магнитофона "Электроника-004". Все еще очень-очень сырое, но уже полоски как-то…

  • Sharp GF-777

    Попал тут ко мне Sharp GF-777. Без преувеличения можно сказать, что это легенда. Обладать таким аппаратом могли лишь избранные. Стоил он когда-то…

  • JVC TD-V662

    Когда просят посмотреть кассетную деку, говорят удивительные вещи. Что не могут найти мастера, который за это бы взялся. Но ведь аналоговая…