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

 
 
13 страниц V  « < 3 4 5 6 7 > »   
Reply to this topicStart new topic
> ARM. Энкодеры и акселерометры, Помогите решить задачу
Zliva
сообщение Aug 26 2009, 15:30
Сообщение #61


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

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



Цитата(@Ark @ Aug 26 2009, 18:18) *
Собственно, возможных путей-то здесь два.

Первый (по которому Вы идете) - ....


Хорошо. Уболтали. Давайте «не вам и не нам». Сделаю два варианта и посмотрю, что лучше. Я думаю что это реально. Перед запуском системы просто буду выбирать один из двух режимов. Годится?


--------------------
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:42
Сообщение #62





Guests






Это Вам решать как делать. Советы Вы все равно не очень слушаете. smile.gif
Если задача не коммерческая, то можете реализовать оба варианта и сравнить. Думаю, будет полезно для понимания некоторых вещей. Вы сейчас, к сожалению, некоторые проблемы просто не воспринимаете, так как не сталкивались с ними на практике...
Желаю удачи.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 15:58
Сообщение #63


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

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



@Ark Спасибо за комментарии!
Согласен. Опыта маловато. Для того это и делается, что бы его получить.
Поскольку Вы первым написали и предложили свой вариант, ему и жизнь. Думаю делать так. Задействую RTT для генерации прерываний. Коэффициент деления поставлю RTPRES=32, то тогда время генерации прерываний будет составлять 32/32768=0,976563мс. Сейчас вбиваю код. Когда сделаю, отчитаюсьsmile.gif


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


Гуру
******

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



Цитата(Zliva @ Aug 26 2009, 19:58) *
Поскольку Вы первым написали и предложили свой вариант, ему и жизнь. Думаю делать так. Задействую RTT для генерации прерываний. Коэффициент деления поставлю RTPRES=32, то тогда время генерации прерываний будет составлять 32/32768=0,976563мс. Сейчас вбиваю код. Когда сделаю, отчитаюсьsmile.gif

Ох. Забудьте про RTT - это самый бесполезный таймер кристалла. Тактируется он от RC-генератора, поэтому 32768 там весьма условные. Кроме того, есть косяк с генерацией прерываний.

Для генерации равномерных временных меток следует использовать PIT.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 20:03
Сообщение #65


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

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



Цитата(aaarrr @ Aug 26 2009, 19:20) *
Ох. Забудьте про RTT - это самый бесполезный таймер кристалла. Тактируется он от RC-генератора, поэтому 32768 там весьма условные. Кроме того, есть косяк с генерацией прерываний.

Для генерации равномерных временных меток следует использовать PIT.

Понял. Тогда как посчитать PIV для частоты 1кГц, при МСК = 47.923200МГц? Что-то у меня не выходит.
Верно ли я понял 47 923 200/1000=47923,2 Приблизительно 47923

Цитата(Zliva @ Aug 26 2009, 22:35) *
Понял. Тогда как посчитать PIV для частоты 1кГц, при МСК = 47.923200МГц? Что-то у меня не выходит.
Верно ли я понял 47 923 200/1000=47923,2 Приблизительно 47923

Сам себе отвечу. Нужно еще поделить на 16 значение 47923, так как PIT тактируется через делитель МСК/16

Сообщение отредактировал Zliva - Aug 26 2009, 19:38


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


Гуру
******

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



Цитата(Zliva @ Aug 26 2009, 23:35) *
Понял. Тогда как посчитать PIV для частоты 1кГц, при МСК = 47.923200МГц? Что-то у меня не выходит.
Верно ли я понял 47 923 200/1000=47923,2 Приблизительно 47923

Нет, неверно. У PIT есть еще прескалер на 16, и считает он до PIV. Т.е. PIV = MCK / 16 / F - 1 = 47923200 / 16 / 1000 - 1 = 2994
Если хочется маниакальной точности, то процессор можно запустить и на 48.0MHz от кварца 18.432MHz (кроме AT91SAM7S512/256/128).
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 26 2009, 20:36
Сообщение #67


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

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



Возникла новая проблема. С PIT вроде разобрался. Теперь появилась новая проблема, связанная с расстановкой приоритетов и пропуском значений энкодера. Буду разбираться.


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


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

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



Цитата(Zliva @ Aug 26 2009, 23:36) *
Возникла новая проблема. С PIT вроде разобрался. Теперь появилась новая проблема, связанная с расстановкой приоритетов и пропуском значений энкодера. Буду разбираться.

Проблема еще актуальна.

Наконец-то спаял датчик ускорения ADXL-210. Теперь в ступоре. Дело в том, что я планировал подключать его к ТС по захвату, но теперь сомневаюсь. Там на выход датчика ШИМ. Как его лучше привязать к прерываниям по PIOA или по таймеру?


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


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

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



Скопировал пример с ИАР и компильнул его под свою задачу. Что-то он не идет. Прерывания не работают. Где может быть косяк?
Прикрепленные файлы
Прикрепленный файл  TimerCounter.rar ( 1.66 килобайт ) Кол-во скачиваний: 58
 


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


Гуру
******

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



Цитата(Zliva @ Aug 31 2009, 01:19) *
Скопировал пример с ИАР и компильнул его под свою задачу. Что-то он не идет. Прерывания не работают. Где может быть косяк?


Прерывание не оформлено должным образом.

Код
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC0, TIMER0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer0_c_irq_handler);

void timer0_c_irq_handler(void)
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 31 2009, 18:21
Сообщение #71


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

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



С прерываниями разобрался. Записал инициализацию так:
Код
pAIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | TIMER0_INTERRUPT_LEVEL;
pAIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) timer0_c_irq_handler;
pAIC->AIC_IECR = (1UL << AT91C_ID_TC0);

кажись работает.
Помогите разобраться с ТС в режиме захвата. Вот что нашел в интернете (www.analog.com.ru/Public/AN604R.pdf), но как это все привязать для измерения ширины импульсов от датчика ускорения – не могу понять, то есть понимаю, но теоретически. Из документации следует, что с помощью захвата это легко делается, но у меня не получается. Помогите хотя бы получить интервалы Т1 и Т2 для X и Y.


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


Гуру
******

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



Цитата(Zliva @ Aug 31 2009, 22:21) *
С прерываниями разобрался. Записал инициализацию так:
кажись работает.

Кажись, или работает? Нужно было или добавить обертку, или дописать __irq к timer0_c_irq_handler.

Цитата(Zliva @ Aug 31 2009, 22:21) *
Помогите разобраться с ТС в режиме захвата. Вот что нашел в интернете (www.analog.com.ru/Public/AN604R.pdf), но как это все привязать для измерения ширины импульсов от датчика ускорения – не могу понять, то есть понимаю, но теоретически. Из документации следует, что с помощью захвата это легко делается, но у меня не получается. Помогите хотя бы получить интервалы Т1 и Т2 для X и Y.

Ну а что мешает перейти к практике?
- сконфигурируйте таймер в режиме capture с внутренним тактированием
- подайте сигнал ШИМ на вход TIOA таймера
- настройте LDRA на захват по переднему фронту TIOA
- настройте LDRB на захват по заднему фронту TIOA
В прерывании LDRA считаете период ШИМ, в LDRB - длительность импульса.
Вот и все.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Aug 31 2009, 20:48
Сообщение #73


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

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



Прерывания работают. Все заделал как Вы писали.
Верно ли я понял, замыкаю два входа TIOA1 и TIOВ1. Конфигурирую так как описано выше и измеряю X, затем также и для TIOA0 и TIOВ0 и измеряю Y.


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


Гуру
******

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



Цитата(Zliva @ Sep 1 2009, 00:48) *
Верно ли я понял, замыкаю два входа TIOA1 и TIOВ1. Конфигурирую так как описано выше и измеряю X, затем также и для TIOA0 и TIOВ0 и измеряю Y.

Нет. И LDRA и LDRB срабатывают по TIOA, TIOB вообще не нужен в данном случае.
Go to the top of the page
 
+Quote Post
Zliva
сообщение Sep 1 2009, 10:29
Сообщение #75


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

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



Цитата(aaarrr @ Sep 1 2009, 00:03) *
Нет. И LDRA и LDRB срабатывают по TIOA, TIOB вообще не нужен в данном случае.


Настроил захват для измерения ШИМ. Может будут какие-то комментарии. Сейчас на работе, реально залью прошивку дома.
Код
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
    unsigned int dummy;
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId );
    TC_pt->TC_CCR = AT91C_TC_CLKDIS;
    TC_pt->TC_IDR = 0xFFFFFFFF;
            dummy = TC_pt->TC_SR;
            dummy = dummy;
    TC_pt->TC_CMR = Mode;
TC_pt->TC_CMR = ((unsigned int) 0x0 << 15)    
|    AT91C_TC_CLKI
|    AT91C_TC_BURST_NONE    
|     AT91C_TC_LDBSTOP        
|    AT91C_TC_LDBDIS
|    AT91C_TC_ETRGEDG_NONE        
|    AT91C_TC_LDRA_RISING
|    AT91C_TC_LDRB_FALLING;
    
TC_pt->TC_CCR = AT91C_TC_CLKEN;
}

В режиме симулятора timer1 работает. Дергаю PIN15 в симуляторе работает. Но когда дергаю PIN0 (смотрите схему), появляется You have tried to modify a port pin which is configured as output! Что делать? И еще глупые вопросы. Как после прерывания сбросить после считывания в 0? Что означает эта запись «dummy = dummy»?
p.s.
aaarrr – Вам огромное человеческое СПАСИБО. Хоть кто-то поддерживает меня. Не люблю быть должным. Со временем буду это все оформлять в статью. Если Вы не против, могу Вас включить.


--------------------
If the person is successful, he is successful in any sphere.
Go to the top of the page
 
+Quote Post

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

 


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


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