Если подключить к микроконтроллеру драйвер L293D, то возможно управлять мотором, путем создания разных или одинаковых сигналов на двух выводах Input 1/2. В этом примере управляющие каналы драйвера подключены к выводам PC14 и PC15.
С помощью модуля MicroSTM32F1TPorts
возможно принимать пакеты с идентификаторами от ПК через USB-UART преобразователь. Тот же, который используется для прошивки. Для ПК он определяется как COM-порт (в настоящем примере это COM10
).
Код для микроконтроллера:
MODULE Main; IMPORT SYSTEM, MCU := MicroSTM32F10xxD, ARMv7M := MicroARMv7M, Pins := MicroSTM32F10xPinCfg, TPs := MicroSTM32F1TPorts, Sys := MicroSTM32F103x8System; CONST motorStartForward = 021X; motorStartBackward = 022X; motorStop = 023X; VAR p0: TPs.Port; PROCEDURE Receive (id: CHAR; a: ARRAY OF CHAR; len: INTEGER); BEGIN IF id = motorStartForward THEN SYSTEM.PUT(MCU.GPIOCBSRR, {15, 14+16}) ELSIF id = motorStartBackward THEN SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14}) ELSIF id = motorStop THEN SYSTEM.PUT(MCU.GPIOCBSRR, {15 + 16, 14 + 16}) END END Receive; PROCEDURE InitPort; VAR par: TPs.InitPar2; BEGIN par.n := TPs.USART1; par.RXPinPort := Pins.A; par.RXPinN := 10; par.TXPinPort := Pins.A; par.TXPinN := 9; par.UCLK := Sys.PCLK2; par.baud := 19200; par.parity := TPs.parityNone; par.receive := Receive; (* устанавливаем процедуру для вызова при приёме данных *) TPs.Init(p0, par) END InitPort; PROCEDURE Init; VAR ok: BOOLEAN; BEGIN InitPort; Pins.Configure(Pins.C, 14, Pins.outputPushPull2MHz); Pins.Configure(Pins.C, 15, Pins.outputPushPull2MHz); END Init; PROCEDURE MainLoop; BEGIN REPEAT TPs.Receive(p0); (* принимаем данные по UART *) ARMv7M.WFI UNTIL FALSE END MainLoop; BEGIN Init; MainLoop END Main.
Программа для ПК на языке Компонентный Паскаль:
MODULE KrisControl1; IMPORT MicroTPorts; TYPE MessagesHandler = POINTER TO RECORD (MicroTPorts.MessagesHandler) END; CONST motorStartForward = 021X; motorStartBackward = 022X; motorStop = 023X; VAR p: MicroTPorts.Port; mh: MessagesHandler; PROCEDURE (h: MessagesHandler) MessageReceived (id: SHORTCHAR; IN a: ARRAY OF SHORTCHAR; len: INTEGER); BEGIN END MessageReceived; PROCEDURE Open*(port: ARRAY OF CHAR); BEGIN IF p = NIL THEN p := MicroTPorts.NewPort(port, 19200, {}, mh); IF p # NIL THEN Log.String("успешно соединенился"); Log.Ln; END END END Open; PROCEDURE Close*; BEGIN MicroTPorts.Close(p); Log.String("успешно закрыл соединение"); Log.Ln; END Close; PROCEDURE Forward*; VAR a: ARRAY 1 OF SHORTCHAR; BEGIN MicroTPorts.SendMessage(p, motorStartForward, a, 1) END Forward; PROCEDURE Backward*; VAR a: ARRAY 1 OF SHORTCHAR; BEGIN MicroTPorts.SendMessage(p, motorStartBackward, a, 1) END Backward; PROCEDURE Stop*; VAR a: ARRAY 1 OF SHORTCHAR; BEGIN MicroTPorts.SendMessage(p, motorStop, a, 1) END Stop; BEGIN NEW(mh) CLOSE Close END KrisControl1. Комнады для управления: "KrisControl1.Open('\\.\COM10')" KrisControl1.Forward KrisControl1.Backward KrisControl1.Stop KrisControl1.Close
Эти команды возможно привязать к кнопкам, чтобы сделать графический интерфейс управления моторами: