roboforum.ru

Технический форум по робототехнике.

24 битный счетчик

Обсуждаем рождающиеся мысли и результаты экспериментов.

Re: 24 битный счетчик

Сообщение dccharacter » 24 янв 2012, 14:47

CiSi писал(а):Наврал - переменная Encoder типа cardinal (беззнаковый). Прошу прошения.
Так как я получаю значение с аппаратного счетчика, то задать ему какоето значение нельзя, переменной конечно можно но не увидел в этом смысла. Счетчик можно только обнулить. Четкое отслеживание нуля то же не увенчалось успехом, после чего осталось значение счетчика привязать к направлению вращения энкодера. И при каждой смене направления (движение в ту или иную сторону) сначало обнуляю счетчик и он считает от нуля.

Michael_K, если я вас правильно понял, то в таком случае нулевое значение счетчика будет соответствовать -8388607 знаковой 24 битной пременной.

Ну у тебя же знак вынесен в отдельную переменную, ну?
direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: 24 битный счетчик

Сообщение boez » 24 янв 2012, 20:53

Что значит Encoder имеет тип cardinal? Я понял, что датчик внешний, но прога-то твоя :) Сделай integer. На самом деле важно, чтобы тип integer (не cardinal!) имела разность encoder-buffer. Тогда
Код: Выделить всёРазвернуть
((encoder-buffer)shl 8)shr 8
отработает правильно.

И не вижу смысла в программном анализе направления вращения, если можно этого не делать. Сами по себе значения счетчика вообще никого не интересуют, важно перемещение. Так вот перемещение - это encoder-buffer. Оно 24-битное со знаком, знак сидит в 23 бите. Скопировали знак в биты 24-31 - получили ровно то же по значению число, но 32-битное. Дальше делаем с ним что хотим.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: 24 битный счетчик

Сообщение CiSi » 24 янв 2012, 23:42

Имеется Dll библиотека которая работает с аппаратным счетчиком, в процедуре котоая опрашивает счетчик, переменная олжна иеть беззнаковый тип cardinal.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: 24 битный счетчик

Сообщение boez » 25 янв 2012, 13:42

В паскале есть приведение типов ;)

Ты лучше напиши, мой вариант последний
Код: Выделить всёРазвернуть
procedure ReadMoving(K: double; var Moving: double);
begin
       Moving:=Moving+(((Encoder-Bufer)shl 8)shr 8)/K);
       Bufer:= Encoder;
end;
работает или нет? Никаких обнулений или анализа направления не надо.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: 24 битный счетчик

Сообщение CiSi » 25 янв 2012, 16:22

пробывал уже, в обе стороны прибавляет.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: 24 битный счетчик

Сообщение coder_perm » 25 янв 2012, 16:35

Расскажи по подробнее, что умеет дллка. И какой тебе нужен конечный результат.
Аватара пользователя
coder_perm
 
Сообщения: 185
Зарегистрирован: 11 авг 2009, 22:39
Откуда: Пермь
Skype: kudrin_anton
прог. языки: assembler

Re: 24 битный счетчик

Сообщение dccharacter » 25 янв 2012, 17:11

dccharacter писал(а):direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков

Вот это пробовал?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: 24 битный счетчик

Сообщение CiSi » 25 янв 2012, 18:00

dccharacter писал(а):
dccharacter писал(а):direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков

Вот это пробовал?

у меня какраз так и реализовано, первое сообщение поста.

Добавлено спустя 5 минут 44 секунды:
coder_perm, есть плата с шиной ввода/вывода PCI, умеет принимать данные с тензодатчиков энкодеров и т.д. собственно длл-ка позволяет писать под эту плату собственное ПО.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: 24 битный счетчик

Сообщение Korogodsky » 25 янв 2012, 18:08

А не придется ли разделить диапазон значений выдаваемых dll-кой на две половины - положительную и отрицательную? Т.е. 0 - 8000000 - положительные значения, а 8000001 - 16000000 - отрицательные.
Korogodsky
 
Сообщения: 79
Зарегистрирован: 20 сен 2011, 13:34
Откуда: Москва

Re: 24 битный счетчик

Сообщение dccharacter » 25 янв 2012, 18:37

CiSi писал(а):у меня какраз так и реализовано, первое сообщение поста.

У тебя в первом сообщении какой-то мудреж. у метя буффер - это 16млн - энкодер. А мувинг - это буфер - (16 млн - буфер). Короче мне кажется, что ты там просто тупо запутался

Добавлено спустя 19 минут 51 секунду:
Код: Выделить всёРазвернуть
Оригинал      K   0,2         
directionTop   1         directionBottom   0   
Encoder   Bufer   Moving      Encoder   Bufer   Moving
0   0   0      0   0   0
100   100   500      100   16777115   -83885575
1000   1000   5000      1000   16776215   -83885575
10000   10000   50000      10000   16767215   -83885575
20000   20000   100000      20000   16757215   -83885575
30000   30000   150000      30000   16747215   -83885575
40000   40000   200000      40000   16737215   -83885575
50000   50000   250000      50000   16727215   -83885575
60000   60000   300000      60000   16717215   -83885575
70000   70000   350000      70000   16707215   -83885575
80000   80000   400000      80000   16697215   -83885575
90000   90000   450000      90000   16687215   -83885575
100000   100000   500000      100000   16677215   -83885575
110000   110000   550000      110000   16667215   -83885575
120000   120000   600000      120000   16657215   -83885575
130000   130000   650000      130000   16647215   -83885575
16777116   16777116   83885580      16777116   99   -83885575
16777215   16777215   83886075      16777215   0   -83885575
0   0   0      0   16777215   -83885575
2   2   10      2   16777213   -83885575
                  
Моя формула                  
                  
directionTop   1         directionBottom   0   
Encoder   Bufer   Moving      Encoder   Bufer   Moving
0      0      0      0
100      500      100      16777115
1000      5000      1000      16776215
10000      50000      10000      16767215
20000      100000      20000      16757215
30000      150000      30000      16747215
40000      200000      40000      16737215
50000      250000      50000      16727215
60000      300000      60000      16717215
70000      350000      70000      16707215
80000      400000      80000      16697215
90000      450000      90000      16687215
100000      500000      100000      16677215
110000      550000      110000      16667215
120000      600000      120000      16657215
130000      650000      130000      16647215
16777116      83885580      16777116      99
16777215      83886075      16777215      0
0      0      0      16777215
2      10      2      16777213


Добавлено спустя 1 минуту 18 секунд:
При этом я сам тоже намудрил. На самом деле у тебя переменная Direction - это знак, а значения Encoder в каждый момент - это твой путь в попугаях, который ты волен перевести в метры. Это если ты при смене направления счетчик обнуляешь.

Добавлено спустя 3 минуты 10 секунд:
Код: Выделить всёРазвернуть
Moving:=Moving+((Bufer-(16777215-Encoder))/K);
               Bufer:= 16777215-Encoder;


Moving2 = Moving1+((Bufer1 - 16... - Encoder2))/K);
Bufer2 = 16... - Encoder2

Moving3 = Moving2+((16... - Encoder2 - 16... - Encoder3))/K

Короче у тебя 16 лямов на каждой итерации съедают друг друга
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: 24 битный счетчик

Сообщение coder_perm » 26 янв 2012, 00:05

CiSi писал(а):coder_perm, есть плата с шиной ввода/вывода PCI, умеет принимать данные с тензодатчиков энкодеров и т.д. собственно длл-ка позволяет писать под эту плату собственное ПО.


Еще раз повторяю вопрос.
Конкретно какие функции(методы) реализованы в ДЛЛ.

И что тебе нужно?
Дельту(изменение) при каждом вызове функции относительно предыдущего запроса
или абсолютное значение энкодера в любой момент?
Аватара пользователя
coder_perm
 
Сообщения: 185
Зарегистрирован: 11 авг 2009, 22:39
Откуда: Пермь
Skype: kudrin_anton
прог. языки: assembler

Re: 24 битный счетчик

Сообщение boez » 26 янв 2012, 17:06

Вот блин, приношу свои извинения, сам заблуждался и других пытался ввести в заблуждение. Похоже, в паскале shr - это всегда логический сдвиг! Переходи на С замени на
Код: Выделить всёРазвернуть
Moving:=Moving+(((Encoder-Bufer)shl 8)div 256)/K)
, или даже
Код: Выделить всёРазвернуть
Moving:=Moving+((Encoder-Bufer)shl 8)/(256*K)
.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: 24 битный счетчик

Сообщение CiSi » 26 янв 2012, 22:40

В длл-ке реализована функция позволяющая принять данные из аппаратного счетчика и присвоить их переменной, в моем случае переменная encoder. Данные с четчика я принемаю, все нормально получаю абсолютное значение энкодера в любой момент, а проблемма собственно в другом.
boez, да ничего страшного, все равно спасибо, а про Си зря зачеркнули, давно пытаюсь да...
ваш вариант завтра попробую отпишу.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Re: 24 битный счетчик

Сообщение coder_perm » 26 янв 2012, 23:08

енкодер можно только обнулять или задавать любое начальное значение?
Аватара пользователя
coder_perm
 
Сообщения: 185
Зарегистрирован: 11 авг 2009, 22:39
Откуда: Пермь
Skype: kudrin_anton
прог. языки: assembler

Re: 24 битный счетчик

Сообщение CiSi » 26 янв 2012, 23:21

только опрашивать и обнулять.
Аватара пользователя
CiSi
 
Сообщения: 1027
Зарегистрирован: 04 окт 2007, 16:11
Откуда: иваново
Skype: cybsys1
прог. языки: Delphi
ФИО: Павел

Пред.След.

Вернуться в Идеи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18