Свежие обсуждения
Измерения

DDS-генератор на AVR - нужна помощь

1 43 189

madgrey: Только эта самая эргономика скорее искусство, чем наука, потому удачных решений немного . Совершенно верно!.. madgrey: вот пример нормального дизайна, Хорошо продумано, такой "интерфейс Пользователя" далеко не везде можно встретить. Так там и указано: "...интуитивным пользовательским интерфейсом...с визуальными подсказками. Процесс эксплуатации...значительно упрощен благодаря отображению генерируемого сигнала и наличию универсальных клемм, встроенных подсказок и раздела помощи....не нужно тратить много времени на ознакомление...сразу может приступить к эффективному использованию всех функций прибора..., Все-же привычнее (частоту, вых.уровень) крутить а не кнопки топтать, вглядываясь в табло...отвлекает.

 

madgrey: Вопрос GM и ATLab, я тут запускаю ведущим Ваш генератор по уарту, вопрос по протоколу:... Что то я в Вашем протоколе потерялся...
1. По идее, то что работает у GM, должно работать и у Вас. Видимо вылазят нестыковки и расхождения Вашей и GM аппаратной и программной части МК.
Это как раз то, о чем я сразу предупреждал: нет единого репозитария проекта.
2. По большому счету, то, что было описано, это не протокол. Хотя бы потому, что нет возможности определить начало и конец посылки - то, из-за чего у Вас (скорее всего) затруднения с управлением.
3. Я в своих поделках никогда так не делаю.
Как правило есть:
- стартовый байт,
- команда,
- данные,
- стоп байт.
Контрольную сумму обычно пропускаю - нет большой нужды, а расчет занимает время и место.
И информация передается не кодом (binary) а в виде ASCII
Посылка получается длиннее, на ее расшифровку требуется время - ASCII->BIN - зато не возникает проблем.

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

Я думал, GM как то решил в своей прошивке проблему определения start для binary посылок.
Сам я генератор не паял, поэтому более детально что-то анализировать не могу, да и предмета анализа - исходника прошивки - нет. Тут все карты в руки GM

 

GM: Думаю, что можно взять маленький шаговый двигатель от 3-дюймового дисковода, который головки двигает, надо бы разобрать, есть несколько штук.
Не надо его брать, у него нет подшипника внутри корпуса, роль подшипника играет шарик, в который упирается длинный (с винтовой нарезкой) конец оси. Поэтому, как только Вы освободите этот конец, ротор тут же перекосит и он не будет вращаться. А с внешней "станиной" не получится установить ручку на вал ШД. Можно попробовать поизвращаться с шестеренками, но смысла нет - простота конструкции теряется и места он будет занимать много.

 

ATLab: у него нет подшипника внутри корпуса
Они разные бывают, да и поставить сзади подшипник не составляет проблем. Поставил шариковый для проверки идеи, но даже не закрепил подшипник, ибо нечего пока было им крутить

 

"GM ...посмотрел я на ваш энкодер, схемка простая, в принципе интересно. Думаю, что можно взять маленький шаговый двигатель от 3-дюймового дисковода, который головки двигает, надо бы разобрать, есть несколько штук. Потом посмотрел на вашу схему и программу для этого энкодера, ничего не понял, возникло несколько вопросов
1) Разве возможно одновременное возникновение переходов на обоих каналах валкодера?
2) Что делает ваша программа?
3) Что вообще должна делать программа валкодера?"

1-при вращении вала ШД генерируются импульсы в обоих каналах, т.е. в каждом из каналов возникает последовательность импульсов
cw + + - - + + - - + +
cw - + + - - + + - - +
Но компараторы реагируют только на первый переход полярности и, таким образом, на выходах нормальная последовательность 2-разрядного кода Грея. При смене направления вращения для обоих каналов генерируемые импульсы меняют полярность
cw + + - - + ccw - + + - -
cw - + + - - ccw + + - - + и компараторы обоих каналов срабатывают, нарушая правило кодирования.

2-приведенные примеры обработки сигналов энкодера, каждый шаг которого представляет собой изменение на дискрет отсчета (0.1мм) для последующего преобразования и вывода на индикатор. Для ATtiny2313, у которой есть режим прерываний по любому фронту, код можно значительно сократить.

3-в DDS-генераторе, по моему разумению, требуемое значение частоты, отображаемое на индикаторе должно быть преобразовано в значение набега фазы. Т.е. оператор видит в понятном формате "ЧАСТОТА", а на DDS-генератор передается соответствующее значение набега фазы.

ШД, используемые в 3,5-дюймовом дисководе, не очень подходят для использования в генераторном энкодере чисто из конструктивных соображений. Речь шла о применении движка от 5-дюймового дисковода. Благо они повсеместно применялись в устаревшей офисной технике и не только в дисководах.
Схему разместил здесь http://files.mail.ru/66QM65

 

akl: 2-приведенные примеры обработки сигналов энкодера, каждый шаг которого представляет собой изменение на дискрет отсчета (0.1мм) для последующего преобразования и вывода на индикатор. Для ATtiny2313, у которой есть режим прерываний по любому фронту, код можно значительно сократить.
Нельзя сократить, т.к. нет приоритета прерываний, а прерывать вывод таблицы - нельзя. Поэтому валкодер должен по идее обрабатываться без прерываний (их включение и выключение тоже не катит т.к. сжирает такты, а у нас и так напряженка с этим делом...).

akl: 3-в DDS-генераторе, по моему разумению, требуемое значение частоты, отображаемое на индикаторе должно быть преобразовано в значение набега фазы. Т.е. оператор видит в понятном формате "ЧАСТОТА", а на DDS-генератор передается соответствующее значение набега фазы.
Именно! Хотя по желанию трудящихся могу выводить состояние аккумулятора, которое посылается в тиньку. В двоичном коде

ATLab: 1. По идее, то что работает у GM, должно работать и у Вас. Видимо вылазят нестыковки и расхождения Вашей и GM аппаратной и программной части МК...
ХЗ, может я чего то не догнал пока. Прошу дать пример последовательности, которую посылаете Вы на тиньку для пуска генератора, поскольку по отзывам Ваша прога работает корректно. Скажем для 800 Гц или 1 кГц. Я посмотрю, что делаю не так.

ATLab: 3. Я в своих поделках никогда так не делаю.
Как правило есть:
- стартовый байт,
- команда,
- данные,
- стоп байт.
Контрольную сумму обычно пропускаю - нет большой нужды, а расчет занимает время и место.
И информация передается не кодом (binary) а в виде ASCII
Посылка получается длиннее, на ее расшифровку требуется время - ASCII->BIN - зато не возникает проблем.

Та бог с ним с протоколом (я про WAKE тогда не зря вас спрашивал, если впоследствии будет заложена возможность обмена ПК и ведомого под руководством Вашей проги то только подобным канальным протоколом). Я сейчас принял, что посылаю данные кодом ASCII (шоб было видно даю ее в хексе), например "03 E2 36 1A 00" в том порядке, который указал GM (кстати, где он?), типа . Разве нужно двоичной последовательностью "00000101......"?

 

Двигатель от БУ винчестера. Тонкий. Легкий. Готовая ручка. То что надо.

 

madgrey: я про WAKE тогда не зря вас спрашивал

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

 

О валкодере.
Даже в самых дешевых современных мышах на вехрнем колесе прокрутки стоят механические энкодеры на небольшое количество шагов (в моем лоджитеке сейчас 24, были еще 32 импульса на оборот), конечно это не энкодер с чпу на 100-1000 импульсов, но думаю это и не нужно, шаг перестройки частоты можно оперативно переключать.
К тому же, в мыше энкодер готовый и что важно их много (очень много) а дохлых еще и задаром.

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

 

madgrey: ХЗ, может я чего то не догнал пока. Прошу дать пример последовательности, которую посылаете Вы на тиньку для пуска генератора, поскольку по отзывам Ваша прога работает корректно. Скажем для 800 Гц или 1 кГц. Я посмотрю, что делаю не так.
Вот формула вычисления кода (из файла с пояснениями):
Код частоты K вычисляется как K=Fген./N, где
N=Fкв./(Cycle*2^AccumLen)
В результате получается четырехбайтное число, которое и посылается побайтно (не побитно!) после команды.
Например, для включения 1-го генератора на 1000 Гц при кварце 20 Мгц, Cycle=10, AccumLen=32 посылка будет такая:
в hex представлении чисел
0x03 0x9C 0xC4 0x20 0x00
в десятичном представлении
3 156 196 32 0

соответственно на 2000 Гц
в hex представлении чисел
0x03 0x37 0x89 0x41 0x00
в десятичном представлении
3 55 137 65 0

Элементарно проверяется в калькуляторе Widows