roboforum.ru

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

Работа с Энкодером

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 17:04

Michael_K писал(а):Не нужно заниматься шапкозакидательством. Представьте, что в проце есть еще пара прерывний и задач, помимо чтения энкодеров, и радужные картинки тут же исчезнут.

Я стараюсь этим не заниматься.\
Вот одно доказательство: forum60/topic9456-15.html. Пока народ искал стоногие МК и сдвиговые регистры, я разработал и запрототипировал устройство, полностью удовлетворяющее запросам заказчика, на макетной плате, которая оказалась под рукой.
Вот еще одно доказательство: раз forum16/topic8784-30.html#p192459 и два forum16/topic8784-30.html#p192564, при этом тема жила несколько месяцев.
Вот еще: раз forum10/topic9534-240.html#p199504 и два forum10/topic9534-255.html#p199722

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

Что-то я сегодня обидчивый какой-то.

Re: Работа с Энкодером

Michael_K » 17 мар 2011, 17:18

dccharacter писал(а):чтобы этот энкодер завести на любом пике в рамках условий, обозначенных ТС в этой теме, я не вижу никаких проблем.

Пожалуйста, скомпилируйте приведенный вами пример кода дла энкодера под "любой" ПИК и оцените, за какое время выполняется обработчик прерывания (в симуляторе например) от момента возникновения события, до выхода из обработчика. Если не лень, конечно. Просто интересно.

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 17:32

Сначала i2c. Потом - обязательно. Самому интересно.

Добавлено спустя 1 минуту 5 секунд:
Хотя если знаете и подскажете как сделать в MPLab эту оценку, то, вероятно, сегодня вечером сделаю.

Добавлено спустя 2 минуты 29 секунд:
Ну что, попробуем :-)
Simulator Stopwatch

The Stopwatch dialog can time a section of code as it run in the simulator. The Stopwatch calculations are based upon the instructions executed and the setting entered for the Processor Frequency. The processor frequency is set to 20 Mhz in this example. From the number of instruction cycles executed, the total time is calculated. This is the time it would take to run on a real chip.

The stopwatch has two pairs of readouts, one displays the total simulated clock cycles and the corresponding execution time, and the other can be zeroed out, to make a measurement from one breakpoint to the next. The stopwatch is one way to measure time in the simulator, but there is another:

Добавлено спустя 8 минут 40 секунд:
Такое пойдет???

Код: Выделить всёРазвернуть
#define inputA RB1
#define inputB RB2

unsigned char QEM [16] = {0,-1,1,2,1,0,2,-1,-1,2,0,1,2,1,-1,0};               // Quadrature Encoder Matrix
unsigned char Old, New, Out;

void interrupt isr (void)
{
if (IOCBF1 && IOCIE) //прерывание включаем по inputA, BREAKPOINT1
{
Old = New;
New = inputA * 2 + inputB;
Out = QEM [Old * 4 + New];
NOP; //BREAKPOINT2
}
}

Re: Работа с Энкодером

=DeaD= » 17 мар 2011, 17:36

"*2" => "<<1"
"*4" => "<<2"

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 17:39

компилятор сам это сделает, но вообще да

Re: Работа с Энкодером

NorthStar » 17 мар 2011, 17:41

Ну вообще на моторе всего 5000 об максимум (мотор китайский, так что ссылки на него нет). Я пока еще управление не разработал. Те мотор запитан напрямую и крутится на максимум. Сделал вывод положения через последовательный порт - вообще перестало работать. Попробовал хотя бы несколько операций добавить - то же фигня выходит. Т.е. контроллер вообще ничего кроме подсчета с энкодера считать не может. Так что я даже и не знаю - как проверить успевает или нет )
Код вот от сюда брал http://www.arduino.cc/playground/Main/RotaryEncoders.
Если самому вал мотора крутить, то всё ОК ))
Спасибо за XMEGA вот примерно то, о чем я спрашивал. Подключил и прочитал.
Только вот интересно - на STM32 такое есть? Нельзя же все контроллеры выучить. Я пока только PIC16 и Arduino умею. Хотел вот еще STM32 изучить. Впечатлила его цена и некоторые примеры.

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 17:46

че-то я не понял, где в приведенном коде прерывания. А вот сериал на 9600 я там вижу. И отправку по сериалу две телеги с отчетами вижу. Конечно оно только при вращении рукой работает...

Добавлено спустя 1 минуту 1 секунду:
а, туплю, ниже еще есть код

Добавлено спустя 47 секунд:
И, кстати, спасибо, хоть посмотрю как интеррапты на ардуине прикручиваются :-)))

Re: Работа с Энкодером

=DeaD= » 17 мар 2011, 18:01

NorthStar писал(а):Код вот от сюда брал http://www.arduino.cc/playground/Main/RotaryEncoders.
Если самому вал мотора крутить, то всё ОК ))

Что-нибудь в районе
Serial.print (encoder0Pos);
Serial.print ("/");

не пробовали убирать?

Добавлено спустя 35 секунд:
И там нету прерываний.

Короче код совершенно игрушечный.

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 18:13

http://www.microchip.su/showthread.php? ... post129451

33 такта. * 4 = 132.
* 1024 = 135 168
* 5000 = 675 840 000
/ 60 ~ 10МГц.

Че-то крутовато. Один pic16f1827 придется полностью выделить под три энкодера без возможности считать с него эти данные. Или я чего опять не так насчитал?

Добавлено спустя 2 минуты 59 секунд:
Да нет, все, похоже, правильно... И это при частоте 32МГц...

Добавлено спустя 33 секунды:
Michael_K, спасибо за науку

Re: Работа с Энкодером

=DeaD= » 17 мар 2011, 18:15

Что за *4 ?

Дергайте прерывание только если поменялся один бит, подозреваю, что точность в 4000 кликов на оборот нафиг не нужна при скорости 100 оборотов в секунду.

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 18:17

=DeaD= писал(а):Что за *4 ?

Дергайте прерывание только если поменялся один бит, подозреваю, что точность в 4000 кликов на оборот нафиг не нужна при скорости 100 оборотов в секунду.

ну цикл - это 4 такта же?
а мы и дергаем 1024 раза за оборот.

АААААААААААА, я запутался. Такт - это 4 цикла!!!! Тьфу, все, я выбываю.
Последний раз редактировалось dccharacter 17 мар 2011, 18:18, всего редактировалось 1 раз.

Re: Работа с Энкодером

NorthStar » 17 мар 2011, 18:17

Смотрите ниже - будут и прерывания. Если Serial.print (encoder0Pos); убрать, то оно может и работает, только как это понять? У меня индикатора на Arduino нет. Делал скорость COM-порта выше - не помогло.
Пробовал, чтоб вместе с прерыванием выполнялся другой код - выполняется, но очень медленно. прерывание большую часть времени активно.
Нашел в STM32 поддержку энкодера. Я искал по слову encoder, а в документации эта функция как decoder описана.
Осталось теперь примерчик добыть. Может есть у кого?

Re: Работа с Энкодером

dccharacter » 17 мар 2011, 18:20

NorthStar писал(а):Нашел в STM32 поддержку энкодера. Я искал по слову encoder, а в документации эта функция как decoder описана.

Это вряд ли работа с энкодерами, скорее всего шифрование какое-нибудь.

Добавлено спустя 56 секунд:
Так, ну все правильно же я посчитал! Я привожу к той частоте, на которой работает осциллятор, поэтому и *4

Re: Работа с Энкодером

Michael_K » 17 мар 2011, 18:25

Да все правильно. Пик выполняет один машинный цикл за 4 такта кварца.
Это Dead просто на АВРках расслабился :)

Re: Работа с Энкодером

Duhas » 17 мар 2011, 18:27

по Хмеге могу найти асм код... если нада ...


Rambler\'s Top100 Mail.ru counter