Технический форум по робототехнике.
SMT » 12 апр 2010, 01:59
dabo писал(а):SMT
так и не понял
на твоем фото лейбл с названием компании
- Advanced-rotary-sensors-label.jpg (25.82 КиБ) Просмотров: 2161
Эта компания, возможно, выпускает (или выпускала) энкодеры типа TS1605 (сейчас среди их продуктов есть типы TS5...)
Если некоторые из их энкодеров используют Smartcoder (как описано в упомянутом документе), возможно он используется и в твоей железке. Возможно в других типах они эта система не используется. Просто предположение - на основе результатов поиска гуглом
dabo » 12 апр 2010, 09:19
Забыл написать спасибо, за то что навели на этот сайт.
ТО что вы написали я и сам понял.
Я не понял как этот смарткодер работает.
Но поглядев даташиты понял что он особо и не нужен.
Датчик этот скручен с промышленного робота (сварочника)так что может их отдельно и не продовали.
Но я им напишу, может пришлют даташит)).
Вопрос в том как правильно считать и вывести код с выходов датчика и может ли в нем не быть последовательности?
Последний раз редактировалось
blindman 12 апр 2010, 09:58, всего редактировалось 1 раз.
Причина: Излишнее цитирование!!! В следующий раз выпишу предупреждение
zubr » 12 апр 2010, 11:10
так ты выложи свой код
и выложи результат
и посмотрим есть там последовательность или нет
иначе сложно твоими глазами ее искать..
dabo » 16 апр 2010, 17:13
zubr
A0 и A1 для того чтобы выводить только если поверну датчик, ничего умней не придумал
while (1)
{
A0=A1;
A1=PINC.0;
if (A0!=A1){
printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\r" ,PINC.0,PINC.1,PINC.2,PINC.3,PINC.4,PINC.5,PINC.6,PINC.7,PINA.0,PINA.1,PINA.2,PINA.3,PINA.4,PINA.5,PINA.6,);
}
};
}
Добавлено спустя 4 минуты:
Да, ещё списался с япошками
- Вложения
-
- Получается по спецификации, код грея, за один оборот 2048 позиций
- датчик.JPG (16.25 КиБ) Просмотров: 2106
-
- то что вижу
- код.JPG (22.3 КиБ) Просмотров: 2106
Ворон » 18 апр 2010, 05:11
тебя не сильно затруднит выложить весь код грея картинкой или архивои на все позиции?))
dabo » 18 апр 2010, 18:12
Дело в том что я и хочу вывести на экран весь код. без пропусков
А таким способ как я делаю походу вывожу только часть
Помогите
Ворон » 19 апр 2010, 11:57
непереживай при нескольких циклах врашения повтор будет))а вращай ну через редуктор какой от игрушки равномерность же не важна))важна последовательность импульсов)) а ее мк считать то всегда сможет))и/или передать на комп))а уж комп то пусть тупо число в файл добавит или в массив))хоть 16 виде хоть в двоичном))хоть пусть БМП картинку рисует по пикселам)разници никакой)
Добавлено спустя 1 минуту 38 секунд:
мне такой код линейно расположеный нужен проста)))))
Michael_K » 19 апр 2010, 12:47
Так а что вас не устраивает?
Первый бит у вас не относится к коду грея (это просто строб какой-то).
А остальные биты - чистый код грея.
Меняется в каждый момент только один бит.
Пропусков у вас нету никаких.
- gray.JPG (22.77 КиБ) Просмотров: 2046
все тут чистенько.
dabo » 19 апр 2010, 13:09
Michael_K
Спасибо за интересное замечание. И находку.
Первый бит просто меняется постоянно 2048 раз за оборот.
Соответственно проблема в том как вывести на монитор все 2048 позиций
Моим способом почему то выводиться раз в 10 меньше
- Вложения
-
Michael_K » 19 апр 2010, 16:02
код грея переводится в обычный код тупым исключающим или со сдвигами
старший бит - так и остается, следующий это исключающее или со старшим,
дальше - исключающее или со старшим и предыдущим итд.
Как-то так примерно:
- Код: Выделить всё • Развернуть
code = GetGreyCodeFromEncoder();
for(i=1;i<n;i++) // n - это количество бит в вашем коде
{
code ^= (code>>1);
}
// Теперь code перекодирована из грея в номер позиции.
Вообще, не понял ваших трудностей.
Добавлено спустя 2 минуты 21 секунду:Моим способом почему то выводиться раз в 10 меньше
Каким еще "вашим способом"? Вы код видите - он без пропусков...
Как уж там вы его выводите в монитор - это только вам известно
vadinator » 19 апр 2010, 17:25
Первый бит повесьте на прерывание по изменении сигнала... и мееедддлллееенннооо вращайте, лучше мотором через редуктор.
ЗЫ...Заодно, считайте количество прерываний...на небольшой скорости, можно выводить в последовательный порт и номер отсчёта заодно...
dabo » 20 апр 2010, 19:28
Michael_K
Про перевод из кода грея, находил. Спасибо.
Проблема в том чтобы пока я кручу вал, делая один оборот.
На мониторе я увидел все 2048 комбинаций кода с датчика
vadinator
Не могу найти пример на Си про прерывания.
zubr » 20 апр 2010, 20:00
Забудь про прерывания.
Это плохой совет был. Иначе еще одним верующим в потусторонние силы больше станет.
Сначалы с выводом разобраться бы тебе.
А у тебя там редуктора нету?
Неужели твоя терминалка больше 2048 строк не вмещает? Или у тебя особый(S/M) канал вывода?
dabo » 20 апр 2010, 20:10
zubr
Терминалка вмещает.
Но вот таким способом если дописать счетчик (переменную n) я вижу не 2048 а где то 150-200 выводов на экран терминалки
while (1)
{
A0=A1;
A1=PINC.0;
if (A0!=A1){
n++;
printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\r" ,PINC.0,PINC.1,PINC.2,PINC.3,PINC.4,PINC.5,PINC.6,PINC.7,PINA.0,PINA.1,PINA.2,PINA.3,PINA.4,PINA.5,PINA.6,);
printf("%d",n);
}
};
}
Почему обязательно нужен редуктор?
Michael_K » 20 апр 2010, 20:33
как мне кажется, вы упираетесь в скорость вывода.
допустим вы передаете на каждое состояние 16 байт (15 цифр и CR) на скорости 115200
Даже если не учитывать, что принтф занимает время, допустить, что передача идет непрерывно и т.д.,
то получается, что вы не можете передавать более 720 состояний в секунду.
Это означает, что самая максимальная-премаксимальная скорость вращения вала будет порядка
один оборот за три секунды... это если вращать ОЧЕНЬ равномерно - иначе пропуски неизбежны.
А если учесть реальные потери времени, неравномерность вращения, не дай бог аппаратный контроль передачи,
то и того хуже.
А если у вас скорость передачи, скажем, 19200, то вращать нужно еще в шесть раз медленнее
(порядка 3 об/минуту)...
Вот ваши ограничения - поэтому и редуктор вам рекомендуют... прерывания-то конечно можно использовать,
но дело имхо не в этом.