RS232 communication code not working for controlling a 3 axis motor driver.

5 views (last 30 days)
Hello,
I am new to matlab, so help me out a bit here. I have a 3 axis controller (X,Y,Z) that I am trying to program using Matlab via RS232. So I know how to open the port and set the settings to the port. What I don't know, or I am having trouble understanding is how to send the commands to control each axis. According to the manufacturer the command to set the output for the X,Y and Z axis are XV, YV, and ZV. However, I am getting an error in my last section of the code when setting the voltages.
clear all
clc
priorPorts = instrfind ;%
delete(priorPorts); %
serialport = serial('COM1')
set(serialport, 'BaudRate', 115200)
set(serialport, 'DataBits', 8)
set(serialport, 'Parity', 'none')
set(serialport, 'StopBits', 1)
set(serialport, 'FlowControl', 'none')
fopen (serialport)
% SET Voltage Limits for each axis
minvoltage = 0
maxvoltage = 75
fprintf(serialport,['XL' num2str(minvoltage)]);
out = fscanf(serialport);
fprintf(serialport,['YL' num2str(minvoltage)]);
out = fscanf(serialport);
fprintf(serialport,['ZL' num2str(minvoltage)]);
out = fscanf(serialport);
fprintf(serialport,['XH' num2str(maxvoltage)]);
out = fscanf(serialport);
fprintf(serialport,['YH' num2str(maxvoltage)]);
out = fscanf(serialport);
fprintf(serialport,['ZH' num2str(maxvoltage)]);
out = fscanf(serialport);
fprintf(serialport,'XL?');
XL = fscanf(serialport);
fprintf(serialport,'YL?');
YL = fscanf(serialport);
fprintf(serialport,'ZL?');
ZL = fscanf(serialport);
fprintf(serialport,'XH?');
XH = fscanf(serialport);
fprintf(serialport,'YH?');
YH = fscanf(serialport);
fprintf(serialport,'ZH?');
ZH = fscanf(serialport);
if str2num(XL(1,2)) ~= minvoltage | str2num(YL(1,2)) ~= minvoltage | str2num(ZL(1,2)) ~= minvoltage | str2num(XH(1,2:3)) ~= maxvoltage | str2num(YH(1,2:3)) ~= maxvoltage | str2num(ZH(1,2:3)) ~= maxvoltage,
msgbox ('Error Setting All Voltages - Disconnecting Piezo Controller');
closepiezocontroller (serialport);
end
% Set individual voltage levels
% XV sets the output to the X-axis.
% YV sets the output to the X-axis.
% ZV sets the output to the X-axis.
% XR?, YR?, ZR? reads the output.
voltage = 1
fprintf(serialport,['XV' num2str(voltage)]);
fprintf(serialport,['YV' num2str(voltage)]);
fprintf(serialport,['ZV' num2str(voltage)]);
out = fscanf(serialport);
fprintf(serialport,'XR?')
XR = fscanf(serialport);
fprintf(serialport,'YR?')
YR = fscanf(serialport);
fprintf(serialport,'ZR?')
ZR = fscanf(serialport);
if length(XR) < 8 || length(YR) < 8 || length(ZR) < 8 || str2num(XR(1,3:8))...
>(voltage+1.5) || str2num(XR(1,3:8)) < (voltage-1.5)...
|| str2num(YR(1,3:8)) >(voltage+1.5)...
|| str2num(YR(1,3:8)) < (voltage-1.5)...
|| str2num(ZR(1,3:8))> (voltage+1.5)...
|| str2num(ZR(1,3:8)) < (voltage-1.5),
msgbox ('Error: All Voltages Could Not Be Set - Disconnecting Piezo Controller');
closepiezocontroller (serialport);
else
disp (['Voltage has been set to ' num2str(voltage) ' volts.'])
end
  4 Comments
AR
AR on 27 Apr 2013
Edited: AR on 27 Apr 2013
Hi, can I confirm that this code actually worked for you? There seems to be an issue with the terminators used.
Jean
Jean on 19 Sep 2013
Hy All, I tried this code using what I believe is the same Thorl... controler, but I have errors even in the firsts fprintf. It looks like there is indeed terminaison issues. Did anyone made any progress on this ? Best

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 22 Jan 2013
Do you need to include a space between the 'XV' and the number? Try
fprintf(serialport, 'XV %f\n', voltage);

More Answers (0)

Communities

More Answers in the  Power Electronics Control

Categories

Find more on MATLAB Support Packages in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!