
Сообщение от
hobot

Можно вот этот момент немного подробней раскрыть
На фотографии не плата контроллера, а самодельный программатор JTAG-USB на основе FT2232H, сам контроллер проприетарный (разработан в моей компании), я его специально на фото не отобразил. У меня на работе запускается примерно 3-4 прототипа в месяц, изделие обычно содержит какой-нибудь микроконтроллер ARM/Cortex и некоторое количество лампочек, кнопочек и всяких драйверов, в том числе шаговых двигателей. Поэтому я просто взял одну из уже ненужных прототипных плат и дописал в тестовую прошивку 100 строчек кода на C. Сама тестовая прошивка тысяч на 300 строчек, так что добавление было несложным
.
Код:
//________________________________________________________________
//
#define MOT_ON MS_TO_TICKS(10)
#define MOT_OFF MS_TO_TICKS(10)
#define MOT_STEP MS_TO_TICKS(2)
static void io_mot_on(void)
{
tn_task_sleep(MOT_ON);
IO_PORT_SET(_MOT);
IO_PORT_SET(_SHH);
tn_task_sleep(MOT_ON);
}
static void io_mot_off(void)
{
tn_task_sleep(MOT_OFF);
IO_PORT_CLR(_MOT);
IO_PORT_CLR(_SHH);
tn_task_sleep(MOT_OFF);
}
static void io_mot_forward(void)
{
IO_PORT_SET(_SHH);
//
// Реализуем сдвиг маски
// PH2 PH1 -> PH2 PH1
// 0 0 1 0
// 0 1 0 0
// 1 0 1 1
// 1 1 0 1
//
if (IO_PORT_IN(_PH1))
{
//
// PH2 PH1 -> PH2 PH1
// 0 1 0 0
// 1 1 0 1
//
if (IO_PORT_IN(_PH2) == 0)
{
IO_PORT_CLR(_PH1);
}
else
{
IO_PORT_CLR(_PH2);
}
}
else
{
//
// PH2 PH1 -> PH2 PH1
// 0 0 1 0
// 1 0 1 1
//
if (IO_PORT_IN(_PH2) == 0)
{
IO_PORT_SET(_PH2);
}
else
{
IO_PORT_SET(_PH1);
}
}
}
static void io_mot_rewind(void)
{
IO_PORT_SET(_SHH);
//
// Реализуем сдвиг маски
// PH2 PH1 -> PH2 PH1
// 0 0 0 1
// 0 1 1 1
// 1 0 0 0
// 1 1 1 0
//
if (IO_PORT_IN(_PH1))
{
//
// PH2 PH1 -> PH2 PH1
// 0 1 1 1
// 1 1 1 0
//
if (IO_PORT_IN(_PH2) == 0)
{
IO_PORT_SET(_PH2);
}
else
{
IO_PORT_CLR(_PH1);
}
}
else
{
//
// PH2 PH1 -> PH2 PH1
// 0 0 0 1
// 1 0 0 0
//
if (IO_PORT_IN(_PH2) == 0)
{
IO_PORT_SET(_PH1);
}
else
{
IO_PORT_CLR(_PH2);
}
}
}
void io_motor_stage(void)
{
int Key, i;
tst_printf("\r\n*** Motorized microscope stage controller ***");
for(;;)
{
tst_printf("\r\nMOT>");
Key = tst_getch();
if (Key)
{
tst_putch(Key);
}
tn_task_sleep(1);
switch(Key)
{
case 27:
{
tst_printf("\r\nESC pressed");
break;
}
case '1':
{
io_mot_on();
for(i=0; i<1; i++)
{
io_mot_forward();
tn_task_sleep(MOT_STEP);
}
io_mot_off();
break;
}
case '2':
{
io_mot_on();
for(i=0; i<1; i++)
{
io_mot_rewind();
tn_task_sleep(MOT_STEP);
}
io_mot_off();
break;
}
case '+':
{
io_mot_on();
for(i=0; i<10; i++)
{
io_mot_forward();
tn_task_sleep(MOT_STEP);
}
io_mot_off();
break;
}
case '-':
{
io_mot_on();
for(i=0; i<10; i++)
{
io_mot_rewind();
tn_task_sleep(MOT_STEP);
}
io_mot_off();
break;
}
case '?':
{
tst_printf(
"\r\n + - forward 10 steps"
"\r\n - - rewind 10 steps"
"\r\n ? - Help message");
break;
}
}
}
}
Если у меня не было такой готовой и освоенной платы под рукой, то я бы взял что-нибудь из отладочных комплектов с модулем управления шаговиком. Возможно что-то из области Arduino, хотя AVR-ы после ARM-ов у меня вызывают идиосинкразию. Можно и без контроллера, напрямую прикрутить драйвер шагового двигателя к тому же USB-модулю на FT2232 и рулить прямо из PC-шного приложения.

Сообщение от
MM
Конструкция Зонд А5 - под 200 кг в сборе.
Крупная штука, это уже надо в частном доме жить, чтобы такое у себя заиметь. И кажется микроскоп там слабоват по увеличению - там надо же просто зондом попасть в тестовую площадку, x20-x40 достаточно. Если я когда-нибудь в отдельный дом переберусь, то я уже буду хотеть что-нибудь из б/у электронных микроcкопов.