База знаний по трехмерному проектированию в 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 протоколу. Но это уже другая история.
Поделиться ссылкой на статью