Программа управления шаговыми двигателями
 

Программа управления шаговыми двигателями

Автор devaister, 08 августа 2016, 16:34:31

« назад - далее »

devaister

Возникла необходимость динамической настройки скорости  двигателя. Каким образом это можно осуществить?
Есть ли какие то библиотеки позволяющие осуществлять программирование контроллеров через скажем C# или С++.
Или это должно быть только аппаратное решение?

Administrator

Можно использовать контроллер в режиме Direct Control и отправлять команды установки скорости в процессе работы. Библиотек нет, т.к. протокол обмена предельно прост. Для изменения скорости отправляйте команду "SDxxx*", где xxx - скорость (шаги/сек).
Например, установить скорость 10 шагов/сек - SD10*, 500 шагов/сек - SD500*. Можно использовать любой язык программирования, обеспечивающий передачу данными с COM-портом.
Отправляете текстовую строку в порт, в ответ приходит сообщение об успешном принятии команды (E10*).

devaister

Если просто отправлять на com порт строку то в ответ получаем ошибку получения данных по com порту. При этом реагирует на отправку абсолютно любой строки.
Возможно не все так просто? И необходимо предварительно настройку какую то провести итд. Используемый контроллер SMSD 1.5 (SW1-on SW2-on т.е. в режиме контроллера).
Если нужно могу привести код отправки данных на com порт. В любом случае даже при использовании сторонних программ позволяющих осуществлять отправку данных на com, ничего не происходит.

Administrator

#3
Если передача не получается даже на готовых сторонних программах, значит, не в Вашей программе проблема. С SMC-Program http://electroprivod.ru/program/smc_program.rar тоже не получается передача?

1. Попробуйте поменять шнурок USB, возможно, в нем проблема.
2. Проверьте установленный драйвер COM-порта Silicon Laboratories. При правильной установке в диспетчере программ (или "Программы и компоненты", зависит от версии windows) должно быть ровно две разных строки (не больше и не меньше).
3. Нужно проверить настройки COM порта: 9600 бод, проверка четности, 8 бит в байте, 1 стоп бит.

Если с SMC-Program передача данных проходит нормально, отправьте кусок Вашего кода, отвечающий за чистку и настройку структур windows, открытие COM порта  и настройку COM порта.

В любом случае, при передаче любого символа контроллер отсылает "эхо". Можно проверить, например, в программах COM port toolkit или Hyper Terminal.

Administrator

В догонку - у Вас версия SMSD-1.5 с разъемом USB?

devaister

http://electroprivod.ru/products_img/drivers/smsd-15small.gif  вот такой блок.
Настройки ком порта выставлены правильно, этот момент я сразу проверил.
Да, только две разных строки в установленных программах.
А в качестве эха, как я уже писал приходит E15* .
Осуществляю отправку сторонним монитором ком порта.
А провод точно рабочий, т.к. через SMC-Program отправка полноценной программы работает.


devaister

Часть кода осуществляющая соединение и отправку в порт команду старта.
SerialPort sp_1 = new SerialPort("COM9", 9600, Parity.None,8,StopBits.One);
            sp_1.Open();
            sp_1.Write("ST*");


Administrator

Если с SMC-Program все работает, значит, проблема в используемой Вами программе.
Попробуйте классические COM Port toolkit или Hyper Terminal, они просты, удобны и бесплатны.

E15* - это не эхо, это код ответа на отправленную команду. Эхо - это повтор любого введенного символа.
Приведите, пожалуйста, код, отвечающий за чистку и настройку структур windows и открытие порта.
В указанном коде нет ни номера порта, ни режима работы, ни типа доступа, ни указания на разрешение/запрет совместного использования, ни атрибутов защиты... Это, по всей видимости, финальная процедура какого-то готового компонента, который Вы используете. Нужно открыть и проверить код этого компонента.

Также существуют внутренние структуры windows, которые отвечают за  передачу данных через последовательные интерфейсы. Их тоже нужно проверять, а лучше сразу настраивать под свои нужды.


Как минимум, при открытии COM порта нужно указывать несколько параметров:
HANDLE CreateFile(
     LPCTSTR               lpFileName,
     DWORD                 dwDesiredAccess,
     DWORD                 dwShareMode,
     LPSECURITY_ATTRIBUTES lpSecurityAttributes,
     DWORD                 dwCreationDistribution,
     DWORD                 dwFlagsAndAttributes,
     HANDLE                hTemplateFile
  );

Это стандартная функция windows, которая используется для открытия порта, ее описание можно посмотреть в справочниках по win API.

lpFileName - имя порта;
dwDesiredAccess - тип доступа к файлу. Для возможности чтения и записи в порт нужно указать GENERIC_READ|GENERIC_WRITE;
dwShareMode - совместный доступ к файлу. Коммуникационные порты нельзя делать разделяемыми в виндовс, поэтому здесь всегда должен быть 0;
lpSecurityAttributes - атрибуты защиты, здесь должно быть NULL для COM портов;
dwCreationDistribution - режим автосоздания, COM порт можно открывать только в случае его существования, т.е. здесь должно быть значение OPEN_EXISTING;
dwFlagsAndAttributes - атрибуты открываемого порта, рекомендую открывать в асинхронном режиме, т.е. значение FILE_ATTRIBUTE_NORMAL или FILE_FLAG_OVERLAPPED
hTemplateFile - для COM порта всегда =0.

И только уже после открытия порта настраиваются параметры порта - скорость, четность, кол-во бит в байте и стоп-бит.
Кроме параметров порта настраивается внутренняя структура windows DCB. Я рекомендую сначала полностью очистить эту структуру, а затем настроить поля для передачи по COM порту.

Попробуйте посмотреть эту ссылку https://ru.wikibooks.org/wiki/COM-%D0%BF%D0%BE%D1%80%D1%82_%D0%B2_Windows_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) - Здесь были примеры на Си.

Administrator

Для справки, вот поля DCB (и применяемые в SMC-Program значения), которые желательно настраивать для корректной работы COM порта в windows:

{ Чистка структуры }
FillChar(dcb, SizeOf(dcb), 0);


dcb.DCBLength -  Поле DCBLength должно содержать размер структуры DCB
dcb.BaudRate -   Скорость обмена (бод) 
dcb.ByteSize -  Число бит в байте
dcb.Parity  - четность
dcb.StopBits -  Число стоп бит

dcb.Flags - dcb_Binary, т.к. Windows не поддерживает не бинарный режим работы последовательных портов

dcb.Flags    -  dcb_AbortOnError;
dcb.Flags    -  dcb_Binary;
dcb.Flags    -  dcb_OutxCtsFlow;
dcb.Flags    -  dcb_OutxDsrFlow;
dcb.Flags    -  dcb_DtrControlMask;
dcb.Flags    -  dcb_DtrControlHandshake;
dcb.Flags    -  dcb_RtsControlMask;
dcb.Flags    -  dcb_RtsControlHandshake; 


Не забудьте использовать  SetCommState(FHandle, dcb), чтобы применить измененные значения полей DCB.
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);