Motor Driver Evaluation Kit NEVB-MTR1-t01-1.3.1
Firmware for NEVB-MTR1-KIT1 for trapezoidal control of BLDC motors using Hall-effect sensors
Loading...
Searching...
No Matches
scpi.cpp
Go to the documentation of this file.
1/* This file has been prepared for Doxygen automatic documentation generation.*/
27
28#include "scpi.h"
29#include "config.h"
30#include "scpi_config.h"
31#include "scpi_helper.h"
32
33// Forward declarations
34static void ScpiCoreIdnQ(SCPI_C commands, SCPI_P parameters, Stream &interface);
35static void ScpiSystemErrorCountQ(SCPI_C commands, SCPI_P parameters, Stream &interface);
36static void ScpiSystemErrorNextQ(SCPI_C commands, SCPI_P parameters, Stream &interface);
37static void GetMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface);
38static void ConfigureMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface);
39static void GetConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface);
40static void ConfigureMotorDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface);
41static void ConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface);
42static void GetConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface);
43static void ConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface);
44static void GetConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface);
45static void MeasureMotorSpeed(SCPI_C commands, SCPI_P parameters, Stream &interface);
46static void MeasureMotorCurrentVBus(SCPI_C commands, SCPI_P parameters, Stream &interface);
47static void MeasureMotorCurrentPhaseU(SCPI_C commands, SCPI_P parameters, Stream &interface);
48static void MeasureMotorCurrentPhaseV(SCPI_C commands, SCPI_P parameters, Stream &interface);
49static void MeasureMotorCurrentPhaseW(SCPI_C commands, SCPI_P parameters, Stream &interface);
50static void MeasureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface);
51static void MeasureMotorVoltage(SCPI_C commands, SCPI_P parameters, Stream &interface);
52static void MeasureGateDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface);
53#if (SPEED_CONTROL_METHOD == SPEED_CONTROL_OPEN_LOOP)
54static void ConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface);
55#elif (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP)
56static void ConfigureMotorSpeedSource(SCPI_C commands, SCPI_P parameters, Stream &interface);
57static void GetMotorSpeedSource(SCPI_C commands, SCPI_P parameters, Stream &interface);
58static void ConfigureMotorSpeed(SCPI_C commands, SCPI_P parameters, Stream &interface);
59#endif
60
61// Instantiate the SCPI Parser
63
71void ScpiInit(void)
72{
73 /* IEEE Mandated Commands (SCPI std V1999.0 4.1.1) */
74 // "*CLS" and "*RST" are not supported
75 scpiParser.RegisterCommand(F("*IDN?"), &ScpiCoreIdnQ);
76
77 /* Required SCPI commands (SCPI std V1999.0 4.2.1) */
78 // "SYSTem:VERSion?" and "SYSTem:ERRor:NEXT?" are not supported
79 scpiParser.SetCommandTreeBase(F("SYSTem"));
80 scpiParser.RegisterCommand(F(":ERRor?"), &ScpiSystemErrorNextQ);
81 scpiParser.RegisterCommand(F(":ERRor:COUNt?"), &ScpiSystemErrorCountQ);
82
83 /* Motor Configuration Commands */
84 scpiParser.SetCommandTreeBase(F("CONFigure"));
85 scpiParser.RegisterCommand(F(":ENABle"), &ConfigureMotorEnable);
86 scpiParser.RegisterCommand(F(":ENABle?"), &GetMotorEnable);
87#if (SPEED_CONTROL_METHOD == SPEED_CONTROL_OPEN_LOOP)
88 scpiParser.RegisterCommand(F(":DUTYcycle:SOURce"), &ConfigureMotorDutyCycleSource);
89 scpiParser.RegisterCommand(F(":DUTYcycle:SOURce?"), &GetConfigureMotorDutyCycleSource);
90 scpiParser.RegisterCommand(F(":DUTYcycle"), &ConfigureMotorDutyCycle);
91#else
92 scpiParser.RegisterCommand(F(":SPEED:SOURce"), &ConfigureMotorSpeedSource);
93 scpiParser.RegisterCommand(F(":SPEED:SOURce?"), &GetMotorSpeedSource);
94 scpiParser.RegisterCommand(F(":SPEED"), &ConfigureMotorSpeed);
95#endif
96 scpiParser.RegisterCommand(F(":FREQuency"), &ConfigureMotorFrequency);
97 scpiParser.RegisterCommand(F(":FREQuency?"), &GetConfigureMotorFrequency);
98 scpiParser.RegisterCommand(F(":DIREction"), &ConfigureMotorDirection);
99 scpiParser.RegisterCommand(F(":DIREction?"), &GetConfigureMotorDirection);
100
101 /* Motor Measurement Commands */
102 scpiParser.SetCommandTreeBase(F("MEASure"));
103 scpiParser.RegisterCommand(F(":SPEEd?"), &MeasureMotorSpeed);
104 scpiParser.RegisterCommand(F(":CURRent:IBUS?"), &MeasureMotorCurrentVBus);
105 scpiParser.RegisterCommand(F(":CURRent:IPHU?"), &MeasureMotorCurrentPhaseU);
106 scpiParser.RegisterCommand(F(":CURRent:IPHV?"), &MeasureMotorCurrentPhaseV);
107 scpiParser.RegisterCommand(F(":CURRent:IPHW?"), &MeasureMotorCurrentPhaseW);
108 scpiParser.RegisterCommand(F(":VOLTage?"), &MeasureMotorVoltage);
109 scpiParser.RegisterCommand(F(":DIREction?"), &MeasureMotorDirection);
110 scpiParser.RegisterCommand(F(":DUTYcycle?"), &MeasureGateDutyCycle);
111}
112
122void ScpiInput(Stream &interface)
123{
124 scpiParser.ProcessInput(interface, SCPI_CMD_TERM);
125}
126
138static void ScpiCoreIdnQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
139{
140 interface.print(F(SCPI_IDN_MANUFACTURER));
141 interface.print(F(","));
142 interface.print(F(SCPI_IDN_MODEL));
143 interface.print(F(","));
144 interface.print((unsigned long)MOTOR_POLES, HEX);
145 interface.print('-');
146 interface.print((unsigned long)F_MOSFET, HEX);
147 interface.print('-');
148 interface.print((unsigned long)DEAD_TIME, HEX);
149 interface.print('-');
150 interface.print((unsigned long)EMULATE_HALL, HEX);
151 interface.print('-');
152 interface.print((unsigned long)TIM3_FREQ, HEX);
153 interface.print('-');
154 interface.print((unsigned long)COMMUTATION_TICKS_STOPPED, HEX);
155 interface.print('-');
156 interface.print((unsigned long)TURN_OFF_MODE, HEX);
157 interface.print('-');
158 interface.print((unsigned long)IPHASE_GAIN, HEX);
159 interface.print('-');
160 interface.print((unsigned long)IPHASE_SENSE_RESISTOR, HEX);
161 interface.print('-');
162 interface.print((unsigned long)IBUS_GAIN, HEX);
163 interface.print('-');
164 interface.print((unsigned long)IBUS_SENSE_RESISTOR, HEX);
165 interface.print('-');
166 interface.print((unsigned long)IBUS_WARNING_THRESHOLD, HEX);
167 interface.print('-');
168 interface.print((unsigned long)IBUS_ERROR_THRESHOLD, HEX);
169 interface.print('-');
170 interface.print((unsigned long)IBUS_FAULT_ENABLE, HEX);
171 interface.print('-');
172 interface.print((unsigned long)SPEED_CONTROL_METHOD, HEX);
173 interface.print('-');
174 interface.print((unsigned long)SPEED_CONTROLLER_TIME_BASE, HEX);
175 interface.print('-');
176 interface.print((unsigned long)SPEED_CONTROLLER_MAX_DELTA, HEX);
177 interface.print('-');
178 interface.print((unsigned long)SPEED_CONTROLLER_MAX_SPEED, HEX);
179 interface.print('-');
180 interface.print((unsigned long)PID_K_P, HEX);
181 interface.print('-');
182 interface.print((unsigned long)PID_K_I, HEX);
183 interface.print('-');
184 interface.print((unsigned long)PID_K_D_ENABLE, HEX);
185 interface.print('-');
186 interface.print((unsigned long)PID_K_D, HEX);
187 interface.print('-');
188 interface.print((unsigned long)VBUS_RTOP, HEX);
189 interface.print('-');
190 interface.print((unsigned long)VBUS_RBOTTOM, HEX);
191 interface.print('-');
192 interface.print((unsigned long)WAIT_FOR_BOARD, HEX);
193 interface.print('-');
194 interface.print((unsigned long)REMOTE_DEBUG_MODE, HEX);
195 interface.print('-');
196 interface.print((unsigned long)PID_MAX_I_TERM, HEX);
197 interface.print('-');
198 interface.print((unsigned long)PID_OUTPUT_MAX, HEX);
199 interface.print('-');
200 interface.print((unsigned long)VBUS_MIN_THRESHOLD, HEX);
201 interface.print(F(","));
202 interface.println(F(SCPI_IDN_FIRMWARE_VERSION));
203}
204
216static void ScpiSystemErrorCountQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
217{
218 interface.println(scpiParser.last_error == ErrorCode::NoError ? 0 : 1);
219}
220
232static void ScpiSystemErrorNextQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
233{
234 switch (scpiParser.last_error)
235 {
237 interface.println(F("Buffer overflow error"));
238 break;
240 interface.println(F("Communication timeout error"));
241 break;
243 interface.println(F("Unknown command received"));
244 break;
246 interface.println(F("No Error"));
247 break;
249 interface.println(F("Missing or invalid parameter"));
250 break;
251 default:
252 interface.println(F("Unknown error"));
253 }
254 scpiParser.last_error = ErrorCode::NoError;
255}
256
267static void GetMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface)
268{
269 interface.println(motorFlags.enable);
270}
271
287static void ConfigureMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface)
288{
289 bool param;
290 if (!ScpiParamBool(parameters, param))
291 {
293 return;
294 }
295 if (param)
296 {
297 // Set the enable pin
298 PORTD |= (1 << ENABLE_PIN);
299 }
300 else
301 {
302 // Clear the enable pin
303 PORTD &= ~(1 << ENABLE_PIN);
304 }
305
306 scpiParser.last_error = ErrorCode::NoError;
307}
308
320#if (SPEED_CONTROL_METHOD == SPEED_CONTROL_OPEN_LOOP)
321static void ConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
322#elif (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP)
323static void ConfigureMotorSpeedSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
324#endif
325{
326 uint8_t param;
327
328 // read first parameter if present
329 if (!ScpiParamChoice(parameters, inputSources, INPUT_SOURCE_OPTIONS, param))
330 {
332 return;
333 }
334
335 if (param == SPEED_INPUT_SOURCE_LOCAL)
336 {
337 motorConfigs.speedInputSource = SPEED_INPUT_SOURCE_LOCAL;
338 return;
339 }
340 else
341 {
342 motorConfigs.speedInputSource = SPEED_INPUT_SOURCE_REMOTE;
343 speedInput = 0;
344 return;
345 }
346 scpiParser.last_error = ErrorCode::NoError;
347}
348
349#if (SPEED_CONTROL_METHOD == SPEED_CONTROL_OPEN_LOOP)
360static void GetConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
361#elif (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP)
372static void GetMotorSpeedSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
373#endif
374{
375 String name;
377 interface.println(name);
378}
379
380#if (SPEED_CONTROL_METHOD == SPEED_CONTROL_OPEN_LOOP)
391static void ConfigureMotorDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface)
392{
393 double param;
394 if (!ScpiParamDouble(parameters, param) || param < 0.0 || param > 100.0)
395 {
397 return;
398 }
399 speedInput = param;
400 scpiParser.last_error = ErrorCode::NoError;
401}
402#elif (SPEED_CONTROL_METHOD == SPEED_CONTROL_CLOSED_LOOP)
414static void ConfigureMotorSpeed(SCPI_C commands, SCPI_P parameters, Stream &interface)
415{
416 double param;
417 if (!ScpiParamDouble(parameters, param) || param > ((((uint32_t)SPEED_CONTROLLER_MAX_SPEED * 15) << 3) / MOTOR_POLES))
418 {
420 return;
421 }
422 speedInput = ((uint32_t)(param * SPEED_CONTROLLER_MAX_INPUT * MOTOR_POLES) >> 3) / ((uint32_t)SPEED_CONTROLLER_MAX_SPEED * 15);
423 scpiParser.last_error = ErrorCode::NoError;
424}
425#endif
426
439static void ConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface)
440{
441 // Clear the enable pin to stop the motor before changing frequency
442 PORTD &= ~(1 << ENABLE_PIN);
443
444 uint32_t param;
445
446 // Read first parameter if present and within range
447 if (!ScpiParamUInt32(parameters, param) || param < F_MOSFET_MIN || param > F_MOSFET_MAX)
448 {
450 return;
451 }
452
453 // Reload the configs
454 motorConfigs.tim4Freq = param;
455 motorConfigs.tim4Top = (uint16_t)TIM4_TOP(motorConfigs.tim4Freq);
456
457 // Wait until motor is stopped
458 while (faultFlags.motorStopped == FALSE)
459 {
460 ;
461 }
462
463 // Re-init timers with the new frequency
464 TimersInit();
465 scpiParser.last_error = ErrorCode::NoError;
466}
467
478static void GetConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface)
479{
480 interface.println(motorConfigs.tim4Freq);
481}
482
498static void ConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
499{
500 uint8_t param;
501
502 // read first parameter if present
504 {
506 return;
507 }
508
509 if (param)
510 {
511 // Set the direction pin if param is 1 (DIRECTION_REVERSE)
512 PORTD |= (1 << DIRECTION_COMMAND_PIN);
513 }
514 else
515 {
516 // Clear the direction pin if param is 0 (DIRECTION_FORWARD)
517 PORTD &= ~(1 << DIRECTION_COMMAND_PIN);
518 }
519 scpiParser.last_error = ErrorCode::NoError;
520}
521
533static void GetConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
534{
535 String name;
536 ScpiChoiceToName(motorDirections, MOTOR_DIRECTION_OPTIONS, motorFlags.desiredDirection, name);
537 interface.println(name);
538}
539
551static void MeasureMotorSpeed(SCPI_C commands, SCPI_P parameters, Stream &interface)
552{
553 if (lastCommutationTicks == 0xffff)
554 {
555 interface.println(0.0);
556 }
557 else
558 {
559 interface.println(
560 (motorConfigs.tim4Freq * 20.0) / (lastCommutationTicks * MOTOR_POLES));
561 }
562}
563
574static void MeasureMotorCurrentVBus(SCPI_C commands, SCPI_P parameters, Stream &interface)
575{
576 interface.println(((double)ibus * 5.0 * 1000000.0) / ((double)1023.0 * IBUS_GAIN * IBUS_SENSE_RESISTOR));
577}
578
590static void MeasureMotorCurrentPhaseU(SCPI_C commands, SCPI_P parameters, Stream &interface)
591{
592 interface.println(((double)(iphaseU - 511) * 5.0 * 1000000.0) / ((double)1023.0 * IPHASE_GAIN * IPHASE_SENSE_RESISTOR));
593}
594
606static void MeasureMotorCurrentPhaseV(SCPI_C commands, SCPI_P parameters, Stream &interface)
607{
608 interface.println(((double)(iphaseV - 511) * 5.0 * 1000000.0) / ((double)1023.0 * IPHASE_GAIN * IPHASE_SENSE_RESISTOR));
609}
610
622static void MeasureMotorCurrentPhaseW(SCPI_C commands, SCPI_P parameters, Stream &interface)
623{
624 interface.println(((double)(iphaseW - 511) * 5.0 * 1000000.0) / ((double)1023.0 * IPHASE_GAIN * IPHASE_SENSE_RESISTOR));
625}
626
638static void MeasureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
639{
640 if (motorFlags.actualDirection == DIRECTION_UNKNOWN)
641 {
642 interface.println(F("UNKN"));
643 }
644 else
645 {
646 String name;
647 ScpiChoiceToName(motorDirections, MOTOR_DIRECTION_OPTIONS, motorFlags.actualDirection, name);
648 interface.println(name);
649 }
650}
651
662static void MeasureMotorVoltage(SCPI_C commands, SCPI_P parameters, Stream &interface)
663{
664 interface.println(((double)vbusVref * 5.0 * (VBUS_RTOP + VBUS_RBOTTOM)) / ((double)1023.0 * VBUS_RBOTTOM));
665}
666
679static void MeasureGateDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface)
680{
681 if (motorFlags.enable == TRUE)
682 {
683 // Reading 16 bit register so disabling interrupts for atomic operation
684 cli();
685 uint16_t duty = 0xff & OCR4A;
686 duty |= (0x03 & TC4H) << 8;
687 sei();
688
689 interface.println((double)duty / (double)motorConfigs.tim4Top * 100.0);
690 }
691 else
692 {
693 interface.println(0.0);
694 }
695}
696
705const SCPI_choice_def_t motorDirections[MOTOR_DIRECTION_OPTIONS] = {
706 {"FORW", "ard", DIRECTION_FORWARD},
707 {"REVE", "rse", DIRECTION_REVERSE},
708};
709
718const SCPI_choice_def_t inputSources[INPUT_SOURCE_OPTIONS] = {
719 {"LOCA", "l", SPEED_INPUT_SOURCE_LOCAL},
720 {"REMO", "te", SPEED_INPUT_SOURCE_REMOTE},
721};
SCPI Parser class.
Definition scpi_parser.h:55
Motor config header file.
#define TIM4_TOP(tim4Freq)
Definition config.h:1302
#define DIRECTION_FORWARD
Forward direction flag value.
Definition config.h:785
#define DIRECTION_COMMAND_PIN
Pin where direction command input is located.
Definition config.h:839
#define SPEED_INPUT_SOURCE_LOCAL
Speed input source - Local or speed input pin.
Definition config.h:849
#define SPEED_CONTROLLER_MAX_INPUT
Maximum Speed Reference Input.
Definition config.h:891
#define DIRECTION_REVERSE
Reverse direction flag value.
Definition config.h:787
#define ENABLE_PIN
Enable input pin.
Definition config.h:841
#define SPEED_INPUT_SOURCE_REMOTE
Speed input source - Remote input.
Definition config.h:851
#define TRUE
TRUE constant value, defined to be compatible with comparisons.
Definition config.h:747
#define FALSE
FALSE constant value.
Definition config.h:745
#define DIRECTION_UNKNOWN
Unknown direction flag value.
Definition config.h:789
#define IBUS_WARNING_THRESHOLD
Hi-side Current (IBUS) Warning Threshold (Register Value)
Definition config.h:367
#define TURN_OFF_MODE
Turn Off Mode.
Definition config.h:259
#define PID_K_P
PID Controller Proportional Gain Constant (Only for Closed Loop)
Definition config.h:509
#define EMULATE_HALL
Emulate Motor Spinning.
Definition config.h:220
#define IBUS_GAIN
Hi-side Current (IBUS) Gain for Current Measurement.
Definition config.h:314
#define SPEED_CONTROL_METHOD
Speed Control Method.
Definition config.h:433
#define IPHASE_SENSE_RESISTOR
Hi-side Current (IBUS) Sense Resistor Value.
Definition config.h:294
#define F_MOSFET
Desired Switching Frequency for MOSFET Gate Signals.
Definition config.h:157
#define IBUS_FAULT_ENABLE
Hi-side Current (IBUS) Fault Enable.
Definition config.h:419
#define IBUS_ERROR_THRESHOLD
Hi-side Current (IBUS) Error Threshold (Register Value)
Definition config.h:406
#define WAIT_FOR_BOARD
Wait for inverter board connection before starting execution.
Definition config.h:719
#define VBUS_MIN_THRESHOLD
Minimum VBUS Threshold for Motor Operation (Register Value)
Definition config.h:692
#define IBUS_SENSE_RESISTOR
Hi-side Current (IBUS) Sense Resistor Value.
Definition config.h:332
#define F_MOSFET_MAX
Maximum allowed gate switching frequency.
Definition config.h:99
#define SPEED_CONTROLLER_MAX_DELTA
Speed Controller Maximum Delta (Applicable for Open Loop Control)
Definition config.h:469
#define PID_MAX_I_TERM
Maximum PID Integrator Sum (Anti-Windup Limit)
Definition config.h:594
#define VBUS_RBOTTOM
Bottom resistor value in the VBUS voltage potential divider.
Definition config.h:655
#define TIM3_FREQ
Desired Electrical Rotational Frequency for "Emulated" Motor.
Definition config.h:236
#define MOTOR_POLES
Number of poles in the motor.
Definition config.h:85
#define PID_OUTPUT_MAX
Maximum PID Controller Output (Only for Closed Loop)
Definition config.h:615
#define PID_K_D
PID Controller Derivative Gain Constant (Only for Closed Loop)
Definition config.h:566
#define SPEED_CONTROLLER_MAX_SPEED
Speed Controller Maximum Speed.
Definition config.h:490
#define PID_K_D_ENABLE
PID Controller Derivative Control Enable Flag (Only for Closed Loop)
Definition config.h:547
#define SPEED_CONTROLLER_TIME_BASE
Speed Controller Time Base.
Definition config.h:448
#define COMMUTATION_TICKS_STOPPED
Commutation Stopped Limit.
Definition config.h:246
#define IPHASE_GAIN
In-line Phase Current Gain for Current Measurement.
Definition config.h:276
#define PID_K_I
PID Controller Integral Gain Constant (Only for Closed Loop)
Definition config.h:528
#define VBUS_RTOP
Top resistor value in the VBUS voltage potential divider.
Definition config.h:635
#define REMOTE_DEBUG_MODE
Set the remote debug mode.
Definition config.h:730
#define DEAD_TIME
Dead Time Specification.
Definition config.h:186
volatile uint16_t vbusVref
VBUS voltage measurement (Register Value)
Definition main.ino:255
volatile uint8_t speedInput
The most recent "speed" input measurement.
Definition main.ino:101
volatile uint16_t ibus
Hi-side Current (IBUS) measurement (Register Value).
Definition main.ino:137
volatile motorconfigs_t motorConfigs
Motor Configs.
Definition main.ino:66
volatile int16_t iphaseW
In-line Phase W current current measurement (Register Value).
Definition main.ino:226
volatile uint16_t lastCommutationTicks
The number of 'ticks' between two hall sensor changes (store).
Definition main.ino:94
void TimersInit(void)
Initializes and synchronizes Timers.
Definition main.ino:455
volatile int16_t iphaseU
In-line Phase U current current measurement (Register Value).
Definition main.ino:167
volatile int16_t iphaseV
In-line Phase V current current measurement (Register Value).
Definition main.ino:196
static void GetConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
Retrieves the configured direction of the motor.
Definition scpi.cpp:533
static void GetConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
Retrieves the configured motor's duty cycle source.
Definition scpi.cpp:360
static void MeasureMotorCurrentPhaseV(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the motor's phase V current.
Definition scpi.cpp:606
static void ScpiSystemErrorNextQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
Implements the SYSTem:ERRor? (System Error Next Query) command.
Definition scpi.cpp:232
static void MeasureMotorSpeed(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures the motor speed.
Definition scpi.cpp:551
static void MeasureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and reports the current direction of the motor.
Definition scpi.cpp:638
static void ScpiSystemErrorCountQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
Implements the SYSTem:ERRor:COUNt? (System Error Count Query) command.
Definition scpi.cpp:216
static void MeasureMotorCurrentPhaseU(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the motor's phase U current.
Definition scpi.cpp:590
static void MeasureMotorCurrentVBus(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the motor's VBUS current.
Definition scpi.cpp:574
static void ConfigureMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface)
Configures the motor's enable state.
Definition scpi.cpp:287
static void ScpiCoreIdnQ(SCPI_C commands, SCPI_P parameters, Stream &interface)
Implements the *IDN? (Identification Query) command.
Definition scpi.cpp:138
static void GetConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface)
Retrieves the configured motor frequency.
Definition scpi.cpp:478
static void ConfigureMotorDutyCycleSource(SCPI_C commands, SCPI_P parameters, Stream &interface)
Configures the motor's speed input source.
Definition scpi.cpp:321
static void GetMotorEnable(SCPI_C commands, SCPI_P parameters, Stream &interface)
Retrieves the current motor enable state.
Definition scpi.cpp:267
static void ConfigureMotorDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface)
Configures the motor's speed input by setting the duty cycle.
Definition scpi.cpp:391
static void MeasureMotorCurrentPhaseW(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the motor's phase W current.
Definition scpi.cpp:622
static void ConfigureMotorDirection(SCPI_C commands, SCPI_P parameters, Stream &interface)
Sets the motor's direction based on the input parameter.
Definition scpi.cpp:498
static void MeasureMotorVoltage(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the VBUS voltage of the motor.
Definition scpi.cpp:662
void ScpiInput(Stream &interface)
Processes incoming data from a serial interface for SCPI commands.
Definition scpi.cpp:122
void ScpiInit(void)
Initializes the SCPI command parser and registers all supported commands.
Definition scpi.cpp:71
const SCPI_choice_def_t inputSources[2]
Array defining the possible input sources for speed/duty cycle control.
Definition scpi.cpp:718
SCPI_Parser scpiParser
Speed input source options array.
Definition scpi.cpp:62
static void MeasureGateDutyCycle(SCPI_C commands, SCPI_P parameters, Stream &interface)
Measures and returns the gate PWM duty cycle as a percentage.
Definition scpi.cpp:679
static void ConfigureMotorFrequency(SCPI_C commands, SCPI_P parameters, Stream &interface)
Configures the motor's operating frequency.
Definition scpi.cpp:439
const SCPI_choice_def_t motorDirections[2]
Array defining the possible motor directions for SCPI commands.
Definition scpi.cpp:705
SCPI implementation header file.
#define INPUT_SOURCE_OPTIONS
Motor direction options array.
Definition scpi.h:39
#define MOTOR_DIRECTION_OPTIONS
Motor direction options array.
Definition scpi.h:35
SCPI parser configuration header file.
#define SCPI_IDN_MODEL
Model number identification string for the *IDN? command.
#define SCPI_CMD_TERM
Command termination character used to identify the end of a SCPI command.
#define SCPI_IDN_MANUFACTURER
Manufacturer identification string for the *IDN? command.
#define SCPI_IDN_FIRMWARE_VERSION
Firmware version identification string for the *IDN? command.
uint8_t ScpiParamChoice(SCPI_P &parameters, const SCPI_choice_def_t *options, size_t optionsSize, uint8_t &param)
Extracts a choice parameter from the SCPI parameter list and maps it to a numerical tag.
uint8_t ScpiParamBool(SCPI_P &parameters, bool &param)
Extracts a boolean parameter ('ON', '1', 'OFF', or '0') from the SCPI parameter list.
uint8_t ScpiParamUInt32(SCPI_P &parameters, uint32_t &param)
Extracts an unsigned 32-bit integer parameter from the SCPI parameter list.
uint8_t ScpiParamDouble(SCPI_P &parameters, double &param)
Extracts a double-precision floating-point parameter from the SCPI parameter list.
uint8_t ScpiChoiceToName(const SCPI_choice_def_t *options, size_t optionsSize, int8_t value, String &name)
Converts a numerical choice tag back to its string representation.
SCPI helper header file.
@ MissingOrInvalidParameter
A required parameter was missing or an invalid parameter was provided.
Definition scpi_types.h:132
@ BufferOverflow
The message buffer was exceeded during message reception.
Definition scpi_types.h:129
@ NoError
No error occurred.
Definition scpi_types.h:120
@ Timeout
A timeout occurred before receiving the expected termination characters.
Definition scpi_types.h:126
@ UnknownCommand
An unknown command was received that could not be matched to a known handler.
Definition scpi_types.h:123
SCPI_Parameters SCPI_P
Alias for SCPI_Parameters.
Definition scpi_types.h:106
SCPI_Commands SCPI_C
Alias for SCPI_Commands.
Definition scpi_types.h:102