База знаний по трехмерному проектированию в Pro/Engineer, Creo, Solidworks, электронике на STM32
Обучение STM32. Подключение абсолютного энкодера EP50S8 Autonics к микроконтроллеру STM32
В этом уроке по микроконтроллеру STM32 вы научитесь:
- подключать абсолютный энкодер к микроконтроллеру
- совершать быстрое чтение порта микроконтроллера
- включать программную защиту от помех (цифровой фильтр)
Промышленный абсолютный энкодер
Варианты интерфейсов энкодеров
Обычное (двоичное) кодирование | Кодирование по методу Грея | ||||
---|---|---|---|---|---|
DEC | Binary | HEX | DEC | Binary | HEX |
0 | 0000 | 0h | 0 | 0000 | 0h |
1 | 0001 | 1h | 1 | 0001 | 1h |
2 | 0010 | 2h | 3 | 0011 | 3h |
3 | 0011 | 3h | 2 | 0010 | 2h |
4 | 0100 | 4h | 6 | 0110 | 6h |
5 | 0101 | 5h | 7 | 0111 | 7h |
6 | 0110 | 6h | 5 | 0101 | 5h |
7 | 0111 | 7h | 4 | 0100 | 4h |
8 | 1000 | 8h | 12 | 1100 | Ch |
9 | 1001 | 9h | 13 | 1101 | Dh |
10 | 1010 | Ah | 15 | 1111 | Fh |
11 | 1011 | Bh | 14 | 1110 | Eh |
12 | 1100 | Ch | 10 | 1010 | Ah |
13 | 1101 | Dh | 11 | 1011 | Bh |
14 | 1110 | Eh | 9 | 1001 | 9h |
15 | 1111 | Fh | 8 | 1000 | 8h |
Схема подключения абсолютного энкодера к микроконтроллеру STM32
Как видно — подключение к порту PА микроконтроллера STM32 производится не последовательно. Но в этом состоит вся прелесть этого урока.
Чтение порта микроконтроллера и программная защита от помех (цифровой фильтр)
Рассмотрим обработку порта PА.
/*main.c*/
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
BOOL flag = FALSE;
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
uint16_t read_encoder( void )
{
return ((~GPIOA->IDR & GPIO_IDR_IDR4)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR5)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR6)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR7)>>4) |
((~GPIOA->IDR & GPIO_IDR_IDR8)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR9)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR10)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR11)>>4)|
((~GPIOA->IDR & GPIO_IDR_IDR12)>>4) | ((~GPIOA->IDR & GPIO_IDR_IDR0)<<9);
}
/* USER CODE END PFP */
int main(void)
{
while (1)
{
flag = FALSE;
for(uint8_t i = 0; i <= 200; i++) {
if ( read_encoder == 55 )
{
flag = TRUE;
}
}
}
}
Всего энкодер EP50S8-720-2F-N-5 имеет 10 проводников (разрядность 10 бит) для обеспечения 720 чисел на 1 оборот. Теперь будет читать каждый из разрядов порта (не забудем выполнить инверсию порта ~GPIOA->IDR — т.к. у нас выполнена подтяжка резисторами к питанию). Младший разряд, подключаемый к PA4 мы сдвигаем на 4 разряда вправо для получения правильного конечного числа (GPIO_IDR_IDR4>>4). И самый старший разряд мы сдвигает влево на 9 (GPIO_IDR_IDR0<<9), т.к. соответствующий провод энкодера подключен к PA0, а должен соотноситься к 10 биту. Можно было бы подключить какой-либо провод к другому порту, например PВ и выполнить процедуру чтения из ноги PB0: ((~GPIOВ->IDR & GPIO_IDR_IDR0)<<9). В этом заключается универсальность процедуры чтения.
Цикл for(uint8_t i = 0; i <= 200; i++) необходим для 200-кратного подтверждения установки значения энкодера равного 55. Это своеобразный цифровой фильтр от помех, которые неизбежно могут возникнуть в 10 проводной параллельной линии связи.
Можно было бы воспользоваться сдвиговыми регистрами и считывать число в микроконтроллер STM32 по SPI протоколу. Но это уже другая история.
Теги
Поделиться ссылкой на статью