|
ARM. Энкодеры и акселерометры, Помогите решить задачу |
|
|
|
Jul 29 2009, 20:01
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Aug 24 2009, 14:09
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Решил сделать просто: Код void irq0_nint (void) { if ((pPIO->PIO_PDSR & ENCODER1_B) == 0) { ENCODER1_Position++;} else { ENCODER1_Position--; } *AT91C_AIC_EOICR = 0; AT91C_BASE_PIOA->PIO_ISR;} и посмотреть, что получилось. Так вот. Цитата(Zliva @ Aug 24 2009, 15:09)  .....рычаг вала энкодера поворачиваю в какое-то крайнее положение до упора(соприкосновение двух винтов). Затем делаю RESET устройства (для того, чтобы начать отсчет с нуля). Проворачиваю до следующего крайнего положения рычаг вала энкодера до упора (соприкосновение винта рычага и винта на корпусе энкодера). Затем кручу рычаг в обратную сторону до упора. И так несколько раз. Получаю следующую последовательность в крайних положениях (как изменилось значение положения крайних положениях): 0-205->{Вращаю влево} 205-1->{Вращаю вправо} 1-206->{Вращаю влево} 206-2->{Вращаю вправо} 2-207 ->{Вращаю влево} 207-3->{Вращаю вправо} 3-208->{Вращаю влево} и т.д. Значение постоянно смещается на 205. Где грабли непойму.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 18:17
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 19:35)  Так и задействуйте общее прерывание PIO - так Вы будете получать прерывание на каждый фронт каждого сигнала. Это меня устраивает. Помогите пожалуйста сконфигурировать стартап irq_pioa.s для прерывания irq_pioa с использованием Ваших функций, которые Вы приводили немного выше. И кстати, переменную PIOA_IRQ_PRIORITY Вы как определили?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 19:23
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Aug 24 2009, 22:17)  Это меня устраивает. Помогите пожалуйста сконфигурировать стартап irq_pioa.s для прерывания irq_pioa с использованием Ваших функций, которые Вы приводили немного выше. Не совсем понял, в чем состоит вопрос. Просто уберите модификатор __irq для использования с вложенными вызовами. Цитата(Zliva @ Aug 24 2009, 22:17)  И кстати, переменную PIOA_IRQ_PRIORITY Вы как определили? Это просто макрос. Код #define PIOA_IRQ_PRIORITY 7
|
|
|
|
|
Aug 24 2009, 19:34
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 22:23)  Это просто макрос. Код #define PIOA_IRQ_PRIORITY 7 Спасибо. Цитата Не совсем понял, в чем состоит вопрос. Просто уберите модификатор __irq для использования с вложенными вызовами. Есть у меня файл с названием IRQ0.s. Там прописано Код AREA IRQ0, CODE, READONLY ARM PRESERVE8 ALIGN IMPORT irq0_nint EXPORT irq0_int irq0_int FUNCTION SUB LR, LR, #4 STMFD SP!, {R0-R3, R12, LR} MRS R0, SPSR STMFD SP!, {R0, R1} MSR CPSR_c, #0x1F STMFD SP!, {R0, LR} LDR R0, =irq0_nint MOV LR, PC BX R0 LDMFD SP!, {R0, LR} MSR CPSR_c, #0x92 LDMFD SP!, {R0, R1} MSR SPSR_cxsf, R0 LDMFD SP!, {R0-R3, R12, PC}^ ; ENDFUNC END Как сюда влепить для PIOA прерывания. Или я с терминологией путаюсь?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:25
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 22:37)  Это же просто универсальная обертка. Переименуйте irq0_nint и irq0_int, если хотите, и все. Ничего не получается с прерыванием от PIOA. Все сделал как Вы говорили – НИЧЕГО. Что-то виснет микроконтроллер. Когда комментирую pioa_irq_init() все работает (прерывания не работают), лампочки дрыгаются. Вложу исподники. Посмотрите пожалуйста.
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:35
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 23:29)  Дык __irq уберите. Убрал. Все равно висим. В симуляторе вроде ОК.
Сообщение отредактировал Zliva - Aug 24 2009, 20:39
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 20:58
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Цитата(aaarrr @ Aug 24 2009, 23:53)  AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE - здесь фронт уже не нужен, т.е. вреден. Фронты отловит контроллер PIO. Все равно висим. Может что-то здесь AREA IRQ0, CODE, READONLY?
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
Aug 24 2009, 21:13
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Zliva @ Aug 25 2009, 00:58)  Все равно висим. Может что-то здесь AREA IRQ0, CODE, READONLY? Ну, на зависании это и не должно было сказаться. Извините, если ввел в заблуждение. Что-то не вижу в упор никаких проблем  Убрать только __irq из void irq_pioa_nin(void) - и все должно работать. Цитата(Zliva @ Aug 25 2009, 00:58)  Может что-то здесь AREA IRQ0, CODE, READONLY? Нет, не может.
|
|
|
|
|
Aug 24 2009, 21:34
|
Частый гость
 
Группа: Участник
Сообщений: 137
Регистрация: 14-11-06
Из: Луцка
Пользователь №: 22 318

|
Убрал строчку printf ("E1=%d\n",ENCODER1_Position); с тела прерывания. ЗАРАБОТАЛО
--------------------
If the person is successful, he is successful in any sphere.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|