База знаний по трехмерному проектированию в Pro/Engineer, Creo, Solidworks, электронике на STM32

Обучение STM32. Подключение абсолютного энкодера EP50S8 Autonics к микроконтроллеру STM32


В этом уроке по микроконтроллеру STM32 вы научитесь:

  • подключать абсолютный энкодер к микроконтроллеру
  • совершать быстрое чтение порта микроконтроллера
  • включать программную защиту от помех (цифровой фильтр)

 

Промышленный абсолютный энкодер

Промышленные абсолютные энкодеры служат для точного позиционирования механизмов и, в частности, валов электрических двигателей, в том числе на испытательных стендах для подсчета частоты вращения двигателей.Они бывают инкрементные с простым тиканьем шагов при повороте и абсолютные с выдачей конкретного числа на каждом шаге — угле поворота. Сегодня мы рассмотрим работу с абсолютным энкодером, имеющим разрешение 720 положений. Это соответствует угловому шагу (точности) 360/720 =½ градуса. Абсолютные энкодеры бывают с различными напряжениями питания и интерфейсами подключения. Рассмотрим варианты интерфейсов энкодеров.

Абсолютный энкодер практически не подвержен помехам, если сам не поврежден. Если диск энкодера не может полноценно быть считан (считываются только его старшие разряды) из-за слишком быстрого вращения, то при уменьшении скорости вращения угол поворота будет вычислен точно (будет возможность вычисления младших разрядов). Таким образом, точность считывания положения падает при увеличении скорости вращения вала выше декларируемой. Абсолютный энкодер относительно устойчив к вибрациям ввиду отсутствия подсчета импульсов.

 

Варианты интерфейсов энкодеров

Параллельный двоичный интерфейс представляет параллельную шину данных с определенной разрядностью. Например, для чисел от 0...1024 (разрешение 0,35 градуса) достаточно 10 разрядов (210=1024), 10 проводников шины. Для чисел 0...720 к сожалению тоже придется использовать 10 проводников, потому что 29=512. Поэтому энкодеры с таким разрешением (10 бит) после числа 719 сразу переходят на число 0. Для надежного считывания некоторые производители закладывают в такие энкодеры еще один сигнал триггера-защелки, по которому блокируется изменение выходного значения. В остальных случаях рекомендуется использовать цифровые фильтры для борьбы с помехами.

Двоично-десятичным интерфейс (BCD) представляет тоже параллельную шину данных, но с более человекочитаемым форматом чисел. В BCD-представлении используются только 10 возможных комбинаций 4-битового числа вместо 16. Поэтому существуют запрещённые комбинации битов: 1010(1010), 1011(1110), 1100(1210), 1101(1310), 1110(1410) и 1111(1510). Числа в виде десятков от 10 до 90 записываются в следующие 4 бита. Числа в виде сотен от 100 до 900 записываются в следующие 4 бита. И числа в виде тысяч от 1000 до 9000 записываются в следующие 4 бита. Поэтому для комбинации энкодера с 1024 значениями потребуется 4 + 4 + 4 + 1 = 13 бит (проводов).

Интерфейс с кодом Грея также является параллельным, за исключением формата выдачи чисел. Это необходимо для максимально возможного предотвращения от ошибок считывания на критически больших скоростях вращения вала. В коде Грея изменения допускаются только в одном бите при переходе на следующее число. Действует следующее правило кодирования: старший бит остается без изменения, а каждый последующий бит инвертируется, если предыдущий бит исходного двоичного кода равен единице. Ниже представлена разница бинарного кодирования и кодирования Грея

 

Таблица вариантов кодирования абсолютных энкодеров
Обычное (двоичное) кодирование Кодирование по методу Грея
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

Перейдем к практической реализации работы с энкодером. На представленной схеме подключен абсолютный энкодера EP50S8-720-2F-N-5 к микроконтроллеру STM32. В соответствии с даташитом этот энкодер имеет открытый коллектр с NPN логикой и рассчитан на подключение к 5-вольтовому источнику питания. Но как показала практика он прекрасно работает от 3.3 В питания. Для функционирования выходных транзисторов энкодера не забудем применить подтягивающие к питанию резисторы.

Как видно — подключение к порту 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 протоколу. Но это уже другая история.

 


Скачать прикрепленный файл EP50S8.pdf

Скачать пример


Яндекс.Метрика

Поделиться ссылкой на статью

Engio.ru - лучший инженерный опыт, бесплатные уроки и обучение Solidworks, Creo, Pro/Engineer, STM32
Комментарии к статье

2 года назад
Здравствуйте. Такой вопрос. Если абсолютный энкодер имеет 8 проводников и они подключены к PA0-PA7, то младший разряд нужно сдвигать на 2 вправо, а старший - на 7 влево?
В начало статьи
Комментировать