реклама на сайте
подробности

 
 
> ARM. Энкодеры и акселерометры, Помогите решить задачу
Zliva
сообщение Jul 29 2009, 20:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Всем привет!
Нужна помощь.
Есть виброплощадка с двумя дебалансными валами, с одной стороны которой через эластические муфты приделаны двигатели, а с другой – инкрементные энкодеры. Площадка крепится через пружины к станине. Двигатели прикручены к станине жестко. Валы площадки не синхронизированы. К площадке крепится датчик ускорения ADXL210 с выходным сигналом ШИМ. Двигатель вращается с частотой 1500 об/мин, следовательно это равно 25об/сек. Энкодер имеет разрешение 1024им/об, это равно 1024*25=25600Гц. Начальное положение определяться перед пуском. Поскольку дебалансный вал имеет эксцентриситет, то соответственно он направлен в низ. Это и есть его начальное положение. Контролер и комп НЕ УПРАВЛЯЕТ ДВИГАТЕЛЯМИ, а они запускаются отдельно через рубильник.
Точность измерения:
  • угловое положение +/-0,4градуса;
  • угловую скорость(+/-1.0град/сек);
  • угловое ускорение (после интерполяции графика скорости. Зависит от метода);
  • линейное ускорение(+/-0,1g);

Нужно периодично опрашивать датчики, чтобы знать его положение, ускорение в каждый момент времени. Данные через USB от датчиков должны заливаться на комп.

Нужно измерять положения дебалансных валов и их скорость, ускорение, а также ускорение, скорость, положение площадки. Ловить сдвиг фаз между положениями валов.

Здесь нимного обсуждалось и здесь
Что уже есть: изготовлена площадка, на ней стоят энкодеры. Уже запускал, работает.
Прикупил ARM отладочную плату AT91SAM7S64_DBoard для ARM микроконтроллеров фирмы ATMEL и программатор J-Link - USB JTAG adapter. Хочу на базе этого дивайса решить эту задачу. Опит программирования только AVR. Знаю немного Си и Delphi. Очень нужно. Помогите пожалуйста.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
13 страниц V  « < 2 3 4 5 6 > »   
Start new topic
Ответов (45 - 59)
aaarrr
сообщение Aug 24 2009, 21:40
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Я грешным делом думал, что printf у Вас под прерывания уже заточен. Тщательнее надо.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 25 2009, 19:07
Сообщение #47


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Попробовал несколько вариантов обработки сигналов энкодера от PIOA. Целый день промаялся. Что-то ничего не получается. Вот код:
Код
void irq_pioa_nin(void){                
    unsigned int status = AT91C_BASE_SYS->PIOA_ISR;    
    
    if(status & ENCODER1_A)
        if ((pPIO->PIO_PDSR & ENCODER1_B) == 0) {
            ENCODER1_Position++;}
        else {
            ENCODER1_Position--;}                        
    if(status & ENCODER1_B)
        if ((pPIO->PIO_PDSR & ENCODER1_A) == 1) {
            ENCODER1_Position++;}
          else {
            ENCODER1_Position--;}                    
    AT91C_BASE_AIC->AIC_EOICR = status;
}

Хочу прутя в одну сторону получить возрастание значения ENCODER1_Position, в другую – убывания.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 25 2009, 19:45
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



У Вас получается одинаковая обработка вне зависимости от полярности фронта, что неправильно.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 25 2009, 19:53
Сообщение #49


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Цитата(aaarrr @ Aug 25 2009, 22:45) *
У Вас получается одинаковая обработка вне зависимости от полярности фронта, что неправильно.

Тогда как лучше сделать?


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 25 2009, 19:54
Сообщение #50


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zliva @ Aug 25 2009, 23:53) *
Тогда как лучше сделать?

Я бы сделал примерно так:
CODE

signed char enc_step[16] =
{
// Previous Current Increment
// AB AB
//
0, // 00 00
1, // 00 01 +1
-1, // 00 10 -1
0, // 00 11
-1, // 01 00 -1
0, // 01 01
0, // 01 10
1, // 01 11 +1
1, // 10 00 +1
0, // 10 01
0, // 10 10
-1, // 10 11 -1
0, // 11 00
-1, // 11 01 -1
1, // 11 10 +1
0 // 11 11
};

void irq_pioa_nin(void)
{
unsigned int status = AT91C_BASE_SYS->PIOA_ISR, a, b, pa, pb;


a = (AT91C_BASE_PIOA->PIO_PDSR & ENCODER1_A) ? 1 : 0;
b = (AT91C_BASE_PIOA->PIO_PDSR & ENCODER1_B) ? 1 : 0;
pa = (status & ENCODER_A) ? a ^ 1 : a;
pb = (status & ENCODER_B) ? b ^ 1 : b;


ENCODER1_Position += enc_step[(pa << 3) | (pb << 2) | (a << 1) | b];


AT91C_BASE_AIC->AIC_EOICR = status;
}

Но еще не грех добавить аппаратный или программный антидребезг. В последнем случае прерывания непосредственно от выводов не нужны, все обрабатывается по таймеру.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 25 2009, 20:22
Сообщение #51


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



aaarrr СПАСИБО. ЗАРАБОТАЛО!!!

Цитата(aaarrr @ Aug 25 2009, 22:54) *
Я бы сделал примерно так:
Но еще не грех добавить аппаратный или программный антидребезг. В последнем случае прерывания непосредственно от выводов не нужны, все обрабатывается по таймеру.


Не пойму зачем. Я писал, что энкодер оптический, и имеет логику на выходе(0=0в,1 = +5в). Еще одно. Как сюда добавить переменную, которая несет в себе информацию о количестве штришков на энкодере, и связать ее с переменной ENCODER1_Position, то есть, когда ENCODER1_Position ==1023 (1024 импульса/об), то ENCODER1_Position =0,
Но когда ENCODER1_Position ==-1 - ENCODER1_Position =1023?

аaarrr, еще раз спасибо


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 25 2009, 20:32
Сообщение #52


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zliva @ Aug 26 2009, 00:22) *
Не пойму зачем. Я писал, что энкодер оптический, и имеет логику на выходе(0=0в,1 = +5в).

Я просто всегда держу в голове худший вариант. Если энкодер приличный, то можно и обойтись.

Цитата(Zliva @ Aug 26 2009, 00:22) *
Еще одно. Как сюда добавить переменную, которая несет в себе информацию о количестве штришков на энкодере, и связать ее с переменной ENCODER1_Position, то есть, когда ENCODER1_Position ==1023 (1024 импульса/об), то ENCODER1_Position =0,
Но когда ENCODER1_Position ==-1 - ENCODER1_Position =1023?

wacko.gif Ну а тут то какие могут быть проблемы?
Только не 1023, а 1024 в первом случае.

Код
    ENCODER1_Position += enc_step[(pa << 3) | (pb << 2) | (a << 1) | b];
    if(ENCODER1_Position < 0) ENCODER1_Position = ENCODER1_Resolution - 1;
    else if(ENCODER1_Position == ENCODER1_Resolution) ENCODER1_Position = 0;
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 25 2009, 20:50
Сообщение #53


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



aaarrr СПАСИБО.

Заменил volatile int ENCODER1_Position = 0; вместо volatile unsigned int ENCODER1_Position = 0;
и вставил код:
Код
if (ENCODER1_Position == ENCODER1_resolution){
        ENCODER1_Position = 0;}
    if (ENCODER1_Position == -1){
        ENCODER1_Position = ENCODER1_resolution-1;}

Думаю вопрос о определении положения можно считать РЕШЕННЫМ.

Давайте обсудим вопрос о определении скорости вала энкодера. Какие будут мысли?


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 25 2009, 21:07
Сообщение #54


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zliva @ Aug 26 2009, 00:50) *
Давайте обсудим вопрос о определении скорости вала энкодера. Какие будут мысли?

Давайте. Только изложите сначала свои, а мы их потом "подумаем", хорошо?
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 05:52
Сообщение #55


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Цитата(aaarrr @ Aug 26 2009, 00:07) *
Давайте. Только изложите сначала свои, а мы их потом "подумаем", хорошо?

Хорошо! Излагаю теорию.
Скорость – первая производная по перемещению от времени Omega(t)=d phi/dt (еще говорят скорость изменения положения), или исходя из определения производной, прирост функции к приросту аргумента Omega(t)=delta phi/ delta t.
Для того, что бы определить скорость нужно от Omega(t)= {ENCODER1_Positionn- ENCODER1_Position(n-1)}/{ttimen - ttime(n-1)}, если неверно формулирую – поправьте. Соответственно ускорение - первая производная по скорости от времени или вторая производная по перемещению от времени (еще говорят скорость изменения скорости).
Тут возникает вопрос связан с переменой ttime, то есть, как ее лучше определить? Что бы она генерировалась таймером?
примечание. Изложена теория относиться как и к линейному перемещению (скорости, ускорению) так и к угловому перемещению(скорости, ускорению), но разница между ними большая.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 26 2009, 10:55
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Zliva @ Aug 26 2009, 09:52) *
Тут возникает вопрос связан с переменой ttime, то есть, как ее лучше определить? Что бы она генерировалась таймером?

Ее даже не обязательно вводить - можно просто вычислять скорость, оценивая перемещение через равные промежутки времени (по таймеру).
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 12:08
Сообщение #57


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Цитата(aaarrr @ Aug 26 2009, 13:55) *
Ее даже не обязательно вводить - можно просто вычислять скорость, оценивая перемещение через равные промежутки времени (по таймеру).

Я на копе хочу выводить зависимость phi(t), Omega(t), но пока не знаю, что выбрать таймер или интервальный таймер (PIT) для генерации временной характеристики ttime. В любом случаи ttime понадобится. Использование таймера мне понадобится для определения ускорения по захвату, так как выходи у акселерометра - сигнал ШИМ. Что насчет этого думаете?


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Aug 26 2009, 13:44
Сообщение #58





Guests






Цитата
Ее даже не обязательно вводить - можно просто вычислять скорость, оценивая перемещение через равные промежутки времени (по таймеру).

Дык, автору неоднократно это уже советовали (в предыдущих двух темах). smile.gif Но он, почему-то, упорно идет своим путем, и никак не хочет упростить себе задачу...

to Zliva: Зачем Вам фиксировать и передавать время на каждый "тик" энкодера? Не нужно этого делать!
Все что необходимо в этой задаче - это 1 раз каждую миллисекунду (точно по таймеру) копировать счетчики обоих энкодеров, АЦП-ровать два канала акселерометра, формировать пакет для передачи и передавать его в компьютер. И все!

В компьютере Вы принимаете пакеты последовательно и уже знаете, что время для них отличается на 1мс.
Текущее значение счетчика энкодера - это и есть текущее угловое положение вала, только в отсчетах энкодера.
Домножьте на соответствующий коэффициент - получите радианы или градусы (что Вам нужно?).
Разница между двумя значениями счетчика энкодера из соседних пакетов - это уже и есть угловая скорость, только в размерности [отсчетов энкодера/мс]. Также можете перевести ее в [радиан/сек] или [градус/сек].
Разница между соседними значениями скоростей - это угловое ускорение в [отсчетов энкодера/мс^2]. Переведите
в [радиан/сек^2] или [градус/сек^2]. Дальше можно заниматься аппрокимацией, обработкой и так далее.

Как видите, Ваша задача в основном решается программными методами в ПК. От микроконтроллера требуется только "ведение" счетчиков энкодеров (по прерываниям), периодический съем значений этих счетчиков и двух каналов АЦП (точно 1 раз в 1 мс) и передача пакетов известного формата в компьютер. Напрямую, без всяких запросов со стороны ПК.

Зачем Вы взяли ARM для этой задачи? Это задача для AVR или PIC среднего размера, тем более что c AVR Вы знакомы, как говорили. Зачем связались с USB, если нет опыта работы с ним? Через обычный UART можно спокойно передать всю информацию. Дальше - поставьте готовый мост UART-RS232 или UART-USB, и принимайте данные в ПК через COM-порт...

P.S. Если Ваша цель не только решить задачу, но и попутно освоить ARM, USB-интерфейс и так далее, тогда выбор понятен. Если же Вы решаете конкретную практическую задачу (для заказчика), то, по-моему, Вы только усложняете себе жизнь и выполняете массу бесполезной работы.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 14:24
Сообщение #59


Частый гость
**

Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318



Спасибо за наставление. Но я как-то другого пути не вижу кроме намеченного. Чтобы корректно аппроксимировать нужны точки для Х и для Y, тому нужно значение фиксировать. Полученое значение [отсчетов энкодера/мс], будут переводится на компе в(градус/сек, радиан/сек и.т.).

Цитата
От микроконтроллера требуется только "ведение" счетчиков энкодеров (по прерываниям), периодический съем значений этих счетчиков и двух каналов АЦП (точно 1 раз в 1 мс) и передача пакетов известного формата в компьютер. Напрямую, без всяких запросив…

Все верно.
Задача не коммерческая. Работаю над дисером. Сам инженер конструктор торгового оборудования(стеллажи, витрины), а освоение ARM, USB-интерфейс дело для меня принципиальное. Хочу и все.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Aug 26 2009, 15:18
Сообщение #60





Guests






Цитата
Но я как-то другого пути не вижу кроме намеченного...

Собственно, возможных путей-то здесь два.

Первый (по которому Вы идете) - фиксировать время по таймеру при каждой смене положения энкодера и передавать все это в компьютер.

Второй (который Вам предлагается) - фиксировать "набежавшее" значение счетчика энкодера в строго определенные моменты времени - через каждые 1мс. И передавать только последовательность значений счетчиков с известным точным временным интервалом между ними (1мс).

Разница в объемах передаваемой информации может быть очень значительной - в первом случае может быть на порядок или два больше. Соотвественно, требования к аппаратуре и каналом информации будут намного выше.
Самое интересное, что в конечной точности Вы почти ничего не выиграете...
Go to the top of the page
 
+Quote Post

13 страниц V  « < 2 3 4 5 6 > » 
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 21:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016