пятница, 14 сентября 2012 г.

Работа с энкодером датчика приращений на ПЛИС

Статья рассчитана в помощь программисту и инженеру-разработчику в области промышленной автоматизации и АСУТП. В материале рассмотрены реализация алгоритма двух энкодеров с антидребезгом на ПЛИС, особенности прошивки модулей Fastwell UNIOxx-5 и разработана тестовая графическая утилита визуализации состояния шифраторов приращений.

Компакт-версия авторского материала, опубликованная в 4 и 5 выпусках некоммерческого журнала "ПРОграммист" от 2010 года
 [см. список ресурсов 6, 7 в конце статьи].
PDF – датчик углового положения.
EEPROM – перепрограммируемая ПЗУ.
ПЛИС – перепрограммируемые логические матрицы с сохранением памяти CPLD и без сохранения FPGA (работа схемы ограничивается наличием питающего напряжения).
ТИ – тактовые импульсы.
Шифратор приращений – преобразователь, на выходе которого в цифровой форме представляются воспринимаемые ими перемещения. Различают* поворотные и абсолютные шифраторы.
Краткий экскурс… 

Для передачи импульсных сигналов с датчика приращений на относительно большие расстояния в условиях промышленных помех можно использовать как радиоканал, так и проводной вариант**, к примеру,  дифференциальные интерфейсы на основе RS-485 и LVDS. Реализация радиоканала и RS-485 видится избыточной, так как необходимо наличие «упаковщика» трех сигналов с шифратора приращений (A, B и строба) или двух как минимум миниморум (A, B), т.е. наличие контроллера. Как обойти эту проблему?

Вспомним про формат LVDS. LVDS используется в таких компьютерных шинах как FireWire, USB 3.0, PCI Express, DVI, Serial ATA. Но среди прочего, данный интерфейс получил распространение и для передачи сигналов на больших скоростях на расстояния до сотни метров. Да, именно так, уже существуют и такие LVDS драйверы. Кроме того, сигналы с шифратора приращений необходимо декодировать и привести в удобоваримый вид. А значит, возникает необходимость создания аппаратного энкодера для определения таких параметров как: положение ротора, направление вращения, обрыв в канале и т.п.

Для реализации алгоритма энкодера видится два пути:

  1. Использование микроконтроллера
  2. Использование ПЛИС
Хороши оба варианта. Но для меня как разработчика более удобен схемотехнический вариант представления. Достоинства программируемых логических интегральных схем (ПЛИС) хорошо известны, это и наличие множества готовых библиотек от простейших логических элементов до микропроцессоров и возможность многократного перепрограммирования для изменения схемы, без внесения изменений в печать, и наличие Си-подобного языка VHDL и возможность просто нарисовать поведение схемы. Хотя последние вряд-ли можно назвать преимуществами, так эти свойства присущи и микроконтроллерам…

Таким образом, задачу разработки энкодера для шифраторов приращений можно разбить на следующие этапы:

  1. Разработка модуля связи (передачи и приема) для передачи импульсных сигналов на большие расстояния в условиях промышленных помех.
  2. Аппаратная реализация алгоритма энкодера на существующих ПЛИС.
  3. Создание тестовой программы визуализации состояния датчиков приращений.
* Поворотные шифраторы – генерируют выходные импульсы, которые подсчитываются реверсивным счетчиком, поэтому их показания соответствуют тому, как далеко диск продвинулся с начала отсчета. Здесь в основном применяются два чувствительных элемента, расположенных в преобразователях таким образом, что их выходы сдвинуты относительно друг друга на по фазе.

Абсолютные шифраторы – реализуют кодированный выход, который индицирует абсолютное положение контролируемого объекта, причем кодирование производится в двоичном коде, а его длина соответствует длине кода измерительной системы. Как правило, снабжены интерфейсами: SSI (Synchronous Serial Interface), СAN, PROFIBUS, RS-485.
** Следует упомянуть про параллельно-последовательные преобразователи со встроенным антидребезгом и нормализацией сигналов цифровых входов и преобразования их в единый поток данных, передаваемый по SPI интерфейсу. К примеру, ИМС SN65HVS88x от Texas Instruments. Однако это потребует минимум еще трех корпусов со стороны передатчика и приемника, что приведет к удорожанию модуля связи. Да и сам интерфейс SPI не предназначен для таких расстояний. Кроме того, существуют кодеры на основе сдвигающих регистров (НТ12Е/НТ12D или MC145026/28). Но их применение оправдано в случае использования радиоканала.
Аппаратная часть. Краткое описание контроллера энкодера 

Аппаратной основой энкодера датчика приращений служит модуль DIC110 (UNIOxx-5) фирмы Fastwell [1, 2], выполненный в формате MicroPC и установленный в 8-ми слотовое промышленное шасси на базе 486 процессора под управлением DOS. Шасси позволяет установку как ISA, так и PCI плат периферийного ввода-вывода. Модули UNIOxx-5 имеют 5 разделяемых линий прерываний, канал прямого доступа к памяти (DMA) и светодиод обращения к плате. Внутренняя структура представлена на рисунке:

Платы UNIO, в зависимости от загруженной прошивки, могут выполнять цифровой/частотный ввод-вывод, аналоговый ввод-вывод (через модули Grayhill), измерение частоты и многие другое. Прошивка изменяется программно, благодаря чему разработчики получают уникальную возможность решать с помощью одной платы множество задач. Если взглянуть на структуру, то сразу видно, что подобные возможности реализуются в основном благодаря наличию ПЛИС. Каждая матрица обслуживает 24 канала ввода-вывода. Загрузка схем матриц производится при включении питания или аппаратном сбросе (RESET) из электрически перепрограммируемого постоянного запоминающего устройства (EEPROM). Изменение варианта загружаемой схемы и, следовательно, способа обработки сигналов осуществляется перепрограммированием EEPROM непосредственно в системе. 

Разработка ПО. Алгоритм энкодера

Для работы понадобится следующее:

  1. Turbo C++ IDE ver.3.0.
  2. IDE среда Xilinx Foundation Series 3.1i, 4.1i, 6.2i для ПЛИС [3].
  3. Модуль передачи-приема импульсных сигналов датчика приращений.
  4. Промышленная плата UNIOxx-5 от Fastwell.
  5. JTAG.XILINX программатор из материала [4] или утилита внутреннего загрузчика ISP от FastWell [5].
Энкодер предназначен для декодирования сигналов угловых датчиков положения и передачи информации об угловом положении, скорости, направления вращения, количества оборотов, а также дополнительных сигналов (в виде признаков отказа каналов, наличия строба) в виде 8-ми разрядной цифровой последовательности для дальнейшей расшифровки программным путем. 

Входные сигналы контроллера 

Сигналы с каждого датчика шифратора приращений представляют последовательности импульсов, смещенных на 90 градусов по периоду следования. Частота следования импульсов определяет скорость вращения. Максимальная частота – 200 кГц. Максимальное количество импульсов за 1- оборот – 6000. Каждый оборот идентифицируется стробирующим импульсом. На рисунке представлена последовательность импульсов от датчика, поступающих на вход контроллера: 
 
A – прямой и инверсный канал A, B – прямой и инверсный канал B,
O – прямой и инверсный строб O (длительность равна четверти периода импульса по каналу А или В ±10%)
Рис. Входные сигналы энкодера

Управляющие сигналы:
  1. Cигнал чтения READ по шине ISA платы UNIOxx-5.
  2. Aдресация (А0…А2) для организации чтения (коммутации) 6-ти внутренних регистров через порты платы UNIOxx-5.
  3. Тактовые импульсы (меандр) частотой 50 МГц от внешнего генератора платы UNIOxx-5.
  

Выходные сигналы контроллера 

Выходные сигналы для каждой микросхемы FPGA передаются по шине ISA в последовательности, описанной в таблице:

Дальнейшая работа с шиной ISA определяется принципиальной схемой и протоколом обмена с микросхемами FPGA. Cформируем основные требования к энкодеру:

  1. Работоспособность при входных частотах канальных импульсов от 0.0 до 200 кГц.
  2. Выставление бита направления вращения.
  3. Запись данных в буферные регистры по поступлению: сигнала READ и опросе нулевого адреса из шины.
  4. ISA, и хранение данных до поступления следующего сигнала READ.
  5. Измерение количества импульсов, соответствующих угловому положению датчика и реверсом счетчика количества импульсов по направлению вращени.
  6. Антидребезговый прием дискретных сигналов каналов (прямого и инверсного А, прямого и инверсного В).
  7. Динамическое изменение ширины защитного интервала для каждого из каналов в пределах длительности канального импульса.
  8. Хранение результата по предыдущему сигналу READ и выдачу текущего значения относительного углового положения, признаков канальных отказов, наличия строба, количества оборотов, относительной скорости.
  9. Выдача должна осуществляться путем последовательного выбора (адресации по шине адрес А0…А3) внутренних регистров хранения и записи в виде битовой последовательности DO0…DO7 по портам платы модуля UNIOxx-5.
Реализация энкодера 

Каждая микросхема FPGA обрабатывает сигналы от двух датчиков. По каждому четвертому сигналу чтения READ и нулевому адресу (битовая последовательность А0…А2) передаются: младшие 8- бит 11-ти разрядной последовательности, содержащей информацию о текущем количестве импульсов поступивших с канала А (угловом положении). По первому адресу (А0…А2) передаются (с младшего по старший бит DO0…DO7): старшие 3- бита 11-ти разрядной информации о текущем количестве импульсов поступивших с канала А, признак отказа канала А (в течении длительности стробирующего импульса (одного оборота), признак отказа канала В (в течении длительности стробирующего импульса (одного оборота)), признак направления вращения (определяется с началом стробирующего импульса по приходу сигналов с канала А и В (в течении одного оборота)), признак отказа канала строба О. По второму и третьему адресу (А0…А2) передаются (с младшего по старший бит DO0…DO7) 16- бит информации о количестве оборотов. По четвертому и пятому адресу (А0…А2) передаются (с младшего по старший бит DO0…DO7) 16- бит информации о количестве ТИ за длительность строба (относительной* скорости).


Рис. Общая схема энкодера (дешифратор адреса, формирователь кода схемы, генератор ТИ, 2 канала энкодера, 16 каналов дискретного ввода-вывода)

Каждая из схем энкодера (алгоритм) осуществляет:

  1. Измерение относительного углового положения датчика (по количеству импульсов поступивших с канала A).
  2. Индикацию в соответствующем бите признака наличия импульсов (исправность канала A, B и строба).
  3. Подсчет числа оборотов (количества импульсов строба), максимальное количество ограничено величиной 215, далее осуществляется сброс, и счет начинается заново.
  4. Измерение относительной скорости*, т.е. подсчета количества ТИ, поступивших за длительность строба (погрешность ограничена длительностью ТИ и нестабильностью тактового генератора).
Рис. Схема одного канала энкодера (схема антидребезга, задатчик идентификатора схемы, реверсивный счетчик импульсов, узел формирования выходного пакета данных)

Рис. Модуль задержки на 8 тактов встроенного генератора

Рис. Схема определения направления вращения ротора датчика PDF

Рис. Схема регулирования (СР) ширины защитного интервала для антидребезга

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

V = 4 * 2048 * Nти * Tти; (1)

где: 4 – коэффициент, учитывающий соотношение длительности строба и длительности канальных (информационных импульсов), 2048 – максимальное количество импульсов по любому из каналов, V – фактическая скорость, об/cек, Nти – количество ТИ за строб, Tти – период ТИ, поступающих с внешнего генератора (равен 20 нс), сек.

Руководство пользователя модулей UNIOxx- 5 для прошивки контроллера энкодера

Вариант  “b21”  из  набора  схем (собственной разработки)  полностью  совместим  с  вариантом  n00  для  семейства UNIOxx  и позволяет  реализовать  в  одной  матрице  FPGA   2-  канала  контроллера,  предназначенного  для декодирования  сигналов  от  угловых  датчиков  положения (далее  датчиков)  для  передачи следующей информации:  
  1. Угловое положение.
  2. Скорость вращения.
  3. Направление вращения.
  4. Набор признаков состояния обмена в виде 3-разрядного кода для последующего анализа другими устройствами.
Прошивка модифицирована добавлением 16-ти дискретных каналов ввода-вывода. Программирование  каждой  матрицы  FPGA1…FPGA4  модуля  UNIOxx-5  осуществляется  с помощью программ:
  1. isp.exe – загрузка схемы с записью в EEPROM,
  2. isl.exe  –  загрузка  схемы  без  записи  в  EEPROM (работа  схемы ограничивается  наличием питающего напряжения или сигнала RESET ПК) согласно ТО на плату UNIOxx-5.
Каждая матрица прошивается одним кодом схемы энкодера.  
Количество датчиков, подключаемых к одному контроллеру – 2. 

Пример программирования с использованием библиотечных функций С

Для упрощения написания программ можно воспользоваться библиотечными функциями (язык С). В  качестве  примера  рассмотрим  фрагмент  программы  unio_graf.exe,  осуществляющей  тестовое считывание данных с контроллера и вывод графического отображения положения ротора датчика PDF. В начале программы необходимо определить адрес считывания (см. табл.).
Считывание c портов, осуществляет процедура: f_dba(dba,d)
int f_dba(int dba,int d[16])
 {
 int i,PA;
 for (i=0;i<16;i++)
 {
 PA=inp(BA+dba+i);
 d[i]=PA;
 }
 }
где: dba - адрес FPGA, d - данные.    

Рис. Окно командной строки. Запуск утилиты ISP

Питание и установка

Модуль с прошивкой энкодера устанавливается в слот (ISA) промышленного компьютера и запитан от напряжения ±5В. При этом требуется обеспечить стабильность питающего напряжения с пульсациями не более 200 мВ. Выходной сигнал – однополярное напряжение (цифровая последовательность) с током нагрузки до 10 мА. Максимальная длина шлейфа, соединяющая выход модуля энкодера (платы UNIOxx-5) к входному разъему до 1.5 м. Проверка прошитой платы UNIOxx-5 производится на рабочем месте следующим образом. Земли шасси, платы UNIOxx-5, осциллографа, генератора импульсов и генератора сигналов высокочастотного должны быть объединены (заземлены) в одной точке проводником минимальной длины сечением не менее 2 мм2.

Плата UNIOxx-5 при выключенном питании шасси вставляется в ISA слот. С помощью соединительного шлейфа присоединяют выход датчиков с соответствующими входами модулей гальванической развязки или модулей связи, сигнал с которых подан на вход платы UNIOxx-5. Далее производится включение промышленного шасси и загрузка обслуживающей прошивки. Осциллографом контролируют наличие напряжения питания (+5 В) на плате модуля UNIOxx-5. С помощью осциллографа производится контроль ТИ с тактового генератора платы. Включив генератор импульсов с заранее выставленными выходными уровнями сигналов, подают импульсы по входу строба для каждой из матрицы модуля (поочередно), контролируя одновременно с помощью программы обслуживания (или осциллографом) наличие признака строба в последовательности (бит DO7 при втором адресе А0…А2). Кроме того, тестирование прошивки энкодера желательно провести в условиях, приближенных к «реальным». Для этого необходимо, подключить шифратор приращений через наш модуль связи, используя несколько десятков метров кабеля UTP 5-й категории обмотанного вокруг работающего частотного привода под нагрузкой. Для визуализации положения ротора и подсчета количества импульсов с датчика приращений, реализуем на языке С простейшую утилиту приема данных с платы UNIO по шине ISA.

Реализация тестовой утилиты приема данных с энкодера и визуализация

Запустим среду Turbo C++ IDE и создадим пустой проект. Далее необходимо провести инициализацию графического режима через InitGraph() и зациклить опрос порта INP(). Причем предусмотреть выход из цикла по нажатию определенной комбинации клавиш во время опроса, к примеру, использованием функций Kbhit() и Getch(). В основном цикле необходимо осуществить считывание двухбайтного кода идентификатора схемы, положения ротора, признаков отказа и направления вращения. После чего, произвести отображение выделенных параметров в графическом виде. Оптимальным с точки зрения наблюдения – является имитация положения ротора датчика приращений с выводом дополнительной служебной информации. Реализация подобного подхода представлена в листинге:
#include "dos.h"
#include "string.h"
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>

#define BA 0xA110
#define pi 3.14159

int f_dba(int dba,int d[16]);
void main(long int argc, char *argv[])
{
//»ÑαѼѡ¡δÑ »«αΓá
int dba;int d[16];
//»ÑαѼѡ¡δÑ ñá¡¡δσ
int FL,ugc,ugc2,FL1,FL2;
//ß½πªÑí¡δÑ »ÑαѼѡ¡δÑ
int s,pd,i,nomer,d1,d2;
long int k,KT,KT2;
float ugol,ugol2,ug,n,ug2,ug1,KTT,vm,ug_1,ug_2;
double v,ng1,ng2,nn;

int gdriver = DETECT, gmode, errorcode;
char msg[80];
int x,x2,y,y2,ns,nc,ugg,ugg2,xr,xr2,yr,yr2,wr,wr2,hr,hr2;
char nbuf[25];
char kbuf[25];
char ubuf[25];
char ibuf[25];
char sbuf[25];
char pbuf[25];

 clrscr();
 if(argc>1)
 {
  printf("argc=%d\n",argc);
  for(i=0;i<argc;i++)
   printf("%d = %s\n",i,argv[i]);
  if(strcmp(argv[1],"/?")==0)
  {
   printf("Program driver encoder\n");
  }
 else if(strcmp(argv[1],"indtest")==0){}
 }
//
clrscr();
k=1;
puts("Éáßτ¿ΓδóáΓ∞ »áαá¼ÑΓαδ »« FPGA-?");
puts("諽¿τÑßΓó« ¿¼»π½∞ß«ó ß ñáΓτ¿¬á PDF-?");
//printf("\n");
scanf("%d %d",&s,&pd);
//window(1,1,50,1);
 if (s==1) {dba=0x0;}
 if (s==2) {dba=0x400;}
 if (s==3) {dba=0x800;}
 if (s==4) {dba=0xC00;}
//textcolor(BLACK);

//*ê¡¿µ¿á½¿ºáµ¿∩ úαáΣ¿¬á
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
 if (errorcode != grOk)
  {
   printf("Graphics error: %s\n", grapherrormsg(errorcode));
   printf("Press any key to halt:");
   getch();
   // exit(1);
  }
/*Åáαá¼ÑΓαδ α¿ßπ¡¬á*/
xr=180;//»«½«ªÑ¡¿Ñ 1-ú« úαáΣ¿¬á
yr=250;
xr2=470;//»«½«ªÑ¡¿Ñ 2-ú« úαáΣ¿¬á
yr2=250;
wr=100;//αẼÑαδ 1-ú« úαáΣ¿¬á
hr=100;
wr2=wr;//αẼÑαδ 2-ú« úαáΣ¿¬á
hr2=hr;
//
setfillstyle(1,BLUE);
fillellipse(xr,yr,wr,hr);
fillellipse(xr2,yr2,wr2,hr2);//2-¬á¡á½
setcolor(GREEN);
outtextxy(0,10,"Count:");
//outtextxy(0,20,"Number rot:");
outtextxy(0,30,"Angle, deg:");
outtextxy(0,41,"Speed, r/s:");
outtextxy(0,52,"HB:");
outtextxy(0,63,"delta:");
//úαáñπßδ
outtextxy(xr+wr+15,yr-5,"0");    outtextxy(xr2+wr2+15,yr2-5,"0");
outtextxy(xr-wr-40,yr-5,"180");  outtextxy(xr2-wr2-40,yr2-5,"180");
outtextxy(xr-5,yr-hr-25,"90");   outtextxy(xr2-5,yr2-hr2-25,"90");
outtextxy(xr-10,yr+hr+15,"270"); outtextxy(xr2-10,yr2+hr2+15,"270");
//
 do {
  f_dba(dba,d);
//printf("Ä»α«ß:%d",k);
if (k>1)
 {
  setcolor(BLACK);
  outtextxy(90,10,kbuf);
 }
setcolor(RED);
itoa(k,kbuf,10);
outtextxy(90,10,kbuf);
//printf("\n");
/*FPGA_1*/
//printf("****************************\n");
//printf("êñÑ¡Γ¿Σ¿¬áΓ«α ßσѼδ= %c",d[14]);
//printf("%d\n",d[15]);
//
n=((d[3]<<8)|d[2]);
if (n<0) {nn=65535+n-32768;}
if (n>0) {nn=n;}
//printf("Äí«α«Γ: %7.1f",n);
if (k>1)
 {
  setcolor(BLACK);
  outtextxy(5,90,nbuf);
 }
nn=165001;
setcolor(RED);
itoa(nn,nbuf,25);
outtextxy(5,90,nbuf);
//
//printf("\n");
KT=((d[1]<<8)|d[0]);                  KT2=((d[6]<<8)|d[5]);
ugol=KT;                              ugol2=KT2;
//if (ugol>60000) {ugol=ugol-65535+pd;} if (ugol2>60000) {ugol2=ugol2-65535+pd;}
ug=ugol*360/pd;                       ug2=ugol2*360/pd;
ugc=ug/360;                           ugc2=ug2/360;
ug=360*(ugc-(ug/360));                ug2=360*(ugc2-(ug2/360));
//printf("ôú«½, úα.: %7.2f\n",ug);
ugg=90-ug;                            ugg2=90-ug2;

if (k>1)
 {
  setcolor(BLACK);
  outtextxy(90,32,ubuf);
  outtextxy(130,32,ibuf);
 }
setcolor(RED);
itoa(ug,ubuf,10);
itoa(ugol,ibuf,10);
outtextxy(90,32,ubuf);
outtextxy(130,32,ibuf);
//
FL=d[4]&0x04;
//printf("Åਧ¡á¬¿: OA,OB,HB,OQ=");
//printf("\n          ");
if (k>1)
 {
  if (FL==0x04) {setcolor(BLACK);outtextxy(90,53,"left");}
  else {setcolor(BLACK);outtextxy(90,53,"rigth");}
 }
if (FL==0x04)
 {
  setcolor(BLACK);outtextxy(90,53,"rigth");
  setcolor(RED);outtextxy(90,53,"left");
 }
else
 {
  setcolor(BLACK);outtextxy(90,53,"left");
  setcolor(RED);outtextxy(90,53,"rigth");
 }
//º¡áτÑ¡¿Ñ αạ¿µδ
if (k>1)
 {
  setcolor(BLACK);
  outtextxy(90,63,pbuf);
 }
setcolor(RED);
if (k==1) {d1=ug;d2=ug2;}
itoa((ug-ug2)*pd/360,pbuf,10);
outtextxy(90,63,pbuf);
//
if (k==1) {ug_1=ug;ng1=ugc;}
ug_2=ug;ng2=ugc;
//printf("\n");
vm=((ng2-ng1)*360-ug_1+ug_2)/(360*(125e-3));
//printf("Vm, «í/c= %8.6f\n",vm);
if (k>1)
 {
  setcolor(BLACK);
  outtextxy(90,43,sbuf);
 }
setcolor(RED);
itoa(vm,sbuf,10);
outtextxy(90,43,sbuf);
ug1=ug2; ng1=ng2;
//printf("----------------------------");

//¼áα¬Ñα
   if (k>1)
    {
     setcolor(BLUE);//1-¬á¡á½
     line(x,y,xr,yr);
      line(x2,y2,xr2,yr2);
    }
   setcolor(YELLOW);
   line(xr-wr-10,yr,xr+wr+10,yr);//«ß∞-x
    line(xr2-wr2-10,yr2,xr2+wr2+10,yr2);//«ß∞-x 2-¬á¡á½
   line(xr,yr+hr+10,xr,yr-hr-10);//«ß∞-y
    line(xr2,yr2+hr2+10,xr2,yr2-hr2-10);//«ß∞-y 2-¬á¡á½
   x=xr+(wr*sin(ugg*pi/180)); x2=xr2+(wr2*sin(ugg2*pi/180));
   y=yr+(hr*cos(ugg*pi/180)); y2=yr2+(hr2*cos(ugg2*pi/180));
   setcolor(RED);//1-¬á¡á½
   line(xr,yr,x,y);
    line(xr2,yr2,x2,y2);

//¬«¡Ñµ ¼áα¬Ñα
 k+=1;
 delay(100);
 if (!kbhit()) s=getch();
 if (s==0x9) break;
} while (s!=0x13);

closegraph();
textmode(LASTMODE);
return;
}


int f_dba(int dba,int d[16])
 {
 int i,PA;
 for (i=0;i<16;i++)
 {
 PA=inp(BA+dba+i);
 d[i]=PA;
 }
 } 
Рис. Экран задания параметров считывания

Задав номер FPGA = 3 и максимальное количество импульсов для подключенного датчика = 2048 (для нашего датчика RV-58N), нажмем 'ENTER' и получим экран с визуализацией состояний двух энкодеров (см. рисунок): 

Рис. Экран визуализации состояний двух датчиков PDF
 
Ресурсы
  1. Fastwel Micro PC compatible UNIOxx-5. Программируемые модули ввода-вывода. Руководство пользователя. – Doc. UNIOxx-5 ver.02.02
  2. Спецификация на модуль ввода-вывода UNIOXX-5 http://www.fastwel.ru/content/ecmsfiles/239170.pdf
  3. Сайт производителя Xilinx http://www.xilinx.com
  4. С.Бадло. JTAG.XILINX программатор. – Радиолюбитель, Минск, 2008, №7, с.38.
  5. Полный комплект материалов, прошивка и ПО.
  6. Энкодер датчика ПДФ на ПЛИС. Часть 1 (аппаратная часть, передатчик и приемник на LVDS). - ПРОграммист, №4, с.40.
  7. Энкодер датчика ПДФ на ПЛИС. Часть 2 (программная часть, проект в Xilinx Foundation 3.1i и тестовая утилита работы с шиной ISA на Си). - ПРОграммист, №5, с.59. 

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.