|
Эмуляция энкодера. |
|
|
|
Jul 24 2017, 05:45
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Что бы проверить работу таймера в режиме энкодера я решил эмулировать на двух ножках AB сигналы. Код void TIM7_IRQHandler(void) { switch (enc_state) { case 0: GPIOF->BSRR = GPIO_Pin_9; //1 GPIOF->BRR = GPIO_Pin_10; //0 break; case 1: GPIOF->BSRR = GPIO_Pin_9; //1 GPIOF->BSRR = GPIO_Pin_10; //1 break; case 2: GPIOF->BRR = GPIO_Pin_9; //0 GPIOF->BSRR = GPIO_Pin_10; //1 break; case 3: GPIOF->BRR = GPIO_Pin_9; //0 GPIOF->BRR = GPIO_Pin_10; //0 break; } if(enc_state == 3) enc_state = 0; else enc_state++; TIM7->SR = 0; } По идее должно работать как на картинке, сигналы сдвинуты на 90 градусов, но на скопе я вижу сигналы в одной фазе. Это скоп так показывает или у меня ошибка?
Сообщение отредактировал Jenya7 - Jul 24 2017, 05:46
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 24 2017, 06:10
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(k155la3 @ Jul 24 2017, 11:03) Задайте состояния выходов для энкодера таблицей. И прокручивайте ее по кругу - наиболее приближенная к реальному энкодеру эмуляция. (закрашенные сектора на диске - таже таблица) это то что я делаю в коде - прокручиваю состояния каждый тайм слот (1-2-3-4). снизил частоту и подключил светодиоды на выходы. мигают одновременно. значит скоп тут не виноват. пробовал выставлять выход через ODR Код void TIM7_IRQHandler(void) { switch (enc_state) { case 0: //ENC_PORT->BSRR |= ENC_PIN_A; //1 //ENC_PORT->BRR |= ENC_PIN_B; //0 ENC_PORT->ODR = 0x200; break; case 1: //ENC_PORT->BSRR |= ENC_PIN_A; //1 //ENC_PORT->BSRR |= ENC_PIN_B; //1 ENC_PORT->ODR = 0x600; break; case 2: //ENC_PORT->BRR |= ENC_PIN_A; //0 //ENC_PORT->BSRR |= ENC_PIN_B; //1 ENC_PORT->ODR = 0x400; break; case 3: //ENC_PORT->BRR |= ENC_PIN_A; //0 //ENC_PORT->BRR |= ENC_PIN_B; //0 ENC_PORT->ODR = 0x000; break; } if(enc_state == 3) enc_state = 0; else enc_state++; TIM7->SR = 0; } тот же результат если я ставлю 4 брекпойнта - в каждом кейсе - то я вижу что состояния выходов меняются по таблице (10 11 01 00). но когда код бежит они мигают одновременно.
Сообщение отредактировал Jenya7 - Jul 24 2017, 07:06
|
|
|
|
|
Jul 24 2017, 08:23
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(esaulenka @ Jul 24 2017, 12:57) Тут прерывание срабатывает два раза. После команды сброса флажка прерывания надо что-то типа __DSB(); или просто несколько nop'ов. О! __DSB(); помогло, спасибо. а что эта инструкция делает? описание такое Цитата The Data Synchronization Barrier (DSB) acts as a special kind of memory barrier. The DSB operation will complete when all explicit memory accesses before this instruction have completed. No instructions after the DSB will be executed until the DSB instruction has completed, that is, when all of the pending accesses have completed. но как это влияет на обработку прерывания?
Сообщение отредактировал Jenya7 - Jul 24 2017, 08:37
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|