Технический форум по робототехнике.
dccharacter » 24 янв 2012, 14:47
CiSi писал(а):Наврал - переменная Encoder типа cardinal (беззнаковый). Прошу прошения.
Так как я получаю значение с аппаратного счетчика, то задать ему какоето значение нельзя, переменной конечно можно но не увидел в этом смысла. Счетчик можно только обнулить. Четкое отслеживание нуля то же не увенчалось успехом, после чего осталось значение счетчика привязать к направлению вращения энкодера. И при каждой смене направления (движение в ту или иную сторону) сначало обнуляю счетчик и он считает от нуля.
Michael_K, если я вас правильно понял, то в таком случае нулевое значение счетчика будет соответствовать -8388607 знаковой 24 битной пременной.
Ну у тебя же знак вынесен в отдельную переменную, ну?
direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков
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-битное. Дальше делаем с ним что хотим.
CiSi » 24 янв 2012, 23:42
Имеется Dll библиотека которая работает с аппаратным счетчиком, в процедуре котоая опрашивает счетчик, переменная олжна иеть беззнаковый тип cardinal.
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;
работает или нет? Никаких обнулений или анализа направления не надо.
CiSi » 25 янв 2012, 16:22
пробывал уже, в обе стороны прибавляет.
coder_perm » 25 янв 2012, 16:35
Расскажи по подробнее, что умеет дллка. И какой тебе нужен конечный результат.
dccharacter » 25 янв 2012, 17:11
dccharacter писал(а):direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков
Вот это пробовал?
CiSi » 25 янв 2012, 18:00
dccharacter писал(а):dccharacter писал(а):direction - это знак (направление движения).
Если direction = 1, то ты едешь вперед и имеешь (Encoder) тиков с энкодера.
Если direction = 0, то ты едешь назад и имеешь (0xffffff - Encoder) тиков
Вот это пробовал?
у меня какраз так и реализовано, первое сообщение поста.
Добавлено спустя 5 минут 44 секунды:coder_perm, есть плата с шиной ввода/вывода PCI, умеет принимать данные с тензодатчиков энкодеров и т.д. собственно длл-ка позволяет писать под эту плату собственное ПО.
Korogodsky » 25 янв 2012, 18:08
А не придется ли разделить диапазон значений выдаваемых dll-кой на две половины - положительную и отрицательную? Т.е. 0 - 8000000 - положительные значения, а 8000001 - 16000000 - отрицательные.
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 лямов на каждой итерации съедают друг друга
coder_perm » 26 янв 2012, 00:05
CiSi писал(а):coder_perm, есть плата с шиной ввода/вывода PCI, умеет принимать данные с тензодатчиков энкодеров и т.д. собственно длл-ка позволяет писать под эту плату собственное ПО.
Еще раз повторяю вопрос.
Конкретно какие функции(методы) реализованы в ДЛЛ.
И что тебе нужно?
Дельту(изменение) при каждом вызове функции относительно предыдущего запроса
или абсолютное значение энкодера в любой момент?
boez » 26 янв 2012, 17:06
Вот блин, приношу свои извинения, сам заблуждался и других пытался ввести в заблуждение. Похоже, в паскале shr - это всегда логический сдвиг!
Переходи на С замени на
- Код: Выделить всё • Развернуть
Moving:=Moving+(((Encoder-Bufer)shl 8)div 256)/K)
, или даже
- Код: Выделить всё • Развернуть
Moving:=Moving+((Encoder-Bufer)shl 8)/(256*K)
.
CiSi » 26 янв 2012, 22:40
В длл-ке реализована функция позволяющая принять данные из аппаратного счетчика и присвоить их переменной, в моем случае переменная encoder. Данные с четчика я принемаю, все нормально получаю абсолютное значение энкодера в любой момент, а проблемма собственно в другом.
boez, да ничего страшного, все равно спасибо, а про Си зря зачеркнули, давно пытаюсь да...
ваш вариант завтра попробую отпишу.
coder_perm » 26 янв 2012, 23:08
енкодер можно только обнулять или задавать любое начальное значение?
CiSi » 26 янв 2012, 23:21
только опрашивать и обнулять.