No BSD License  

Highlights from
Stepper Motor ToolBox for MatLab v1.0

from Stepper Motor ToolBox for MatLab v1.0 by Sergio Alejandro González
Stepper Motor ToolBox for MatLab v1.0

srgenerator(profin,pts,SR,step,Vl,Vh,Ti,to,tf,Tn)
function [fout, velprof] = srgenerator(profin,pts,SR,step,Vl,Vh,Ti,to,tf,Tn)
% SRgenerator,  Step Rate Generator.
% Rutina generadora de los pasos que van hacia el indexador. 
% Se pueden generar los pasos como si fuera un sistema analogico 
% o un sistema discreto.
% La rutina deduce si se desea la primer modalidad de calculo o la 
% segunda, cuando se introduce el 7mo termino, el Ti.
% Si se introducen 3 terminos mas, es decir el to, tf y el Tn se muestra
% en pantalla las estadisticas del perfil a producir
% De cualquiera de las formas Vl y Vh son la amplitud minima y mxima de
% salida de la fout

%   Author: Sergio Alejandro Gonzalez 
%   Copyright (c) 1998-99 by S.A.Gonzalez.
%   $Revision: 1.0 $  $Date: 1999/02/25 16:17:20 $

error(nargchk(6,10,nargin))

if nargin == 6,			% Rutina generadora de pasos analogica, VCO:
   fs = 1/(step);
   profile = (2*profile)-1;	% se corrige la ampliud del perfil
   fout = VCO(0.999*profin(1:pts), [0 SR], fs);
   fout = 100*fout;
   Vlevel = 93;
	% Ac se genera el tren de pulsos.
	% La salida del VCO es una frec. variable fout:
	% se genera la salida frecuencial
	% Frecuencia maxima de salida de los pulsos, 1 cada T=1/f=1/(Q*SR)
   %
   % se recorta la salida (discriminador)
   %
   for k = 1:pts,
      if fout(k) >= Vlevel
         fout(k) = Vh;
      else
         fout(k) = Vl;
      end
   end
else										% Rutina generadora de pasos discreta, DSP:
%   NMax  = ((tf-to)/Ti);		% La salida tiene como maximo tf/Ti puntos.
%   Qk = (Ti/step);
   Qk = ceil(Ti/step);
   NMax = ceil(pts/Qk);
   fotmp = zeros(1, NMax);		% Numeric array preallocation
   proftmp = zeros(1, NMax);		% Numeric array preallocation
   proftmp([1:1:NMax]) = profin([1:Qk:pts]);
   j = 1;
   k = 1;
   while (k < NMax),
      if (SR*proftmp(k))*j*Ti >= 1	% >= y no > pues sino el perfil no llega a la velocidad maxima.
         fotmp(k) = 1;
         j = 1;
      else
         j = j + 1;
      end
      k = k + 1;
   end
%   plot([tf/length(fotmp):tf/length(fotmp):tf], fotmp);
%   plot([tf/length(proftmp):tf/length(proftmp):tf], SR*proftmp, [0:step:tf-step], SR*profin);
   % 
   % Detector de cruce por cero/flanco de subida:
   %
   k = 2;
   fout = Vl*ones(1, NMax);		% Numeric array preallocation
   count = 0;				% steps counter
   while (k < NMax),
%            if (fotmp(k) == 1) & (fotmp(k-1) ~= 1)
      if (fotmp(k) == 1)
         fout(k) = Vh;
         count  = count + 1;
      else
         fout(k) = Vl;
      end
      k = k + 1;
   end
   %
   % Clculo y visualizacin en pantalla del nmero de 
   % pasos a simular y de la velocidad promedio por segundo.
   %
   ind  = 0;
   inda = 0;
   indb = 0;
   velprof = zeros(1, NMax);		% Numeric array preallocation
   k = 2;
   while (k < NMax),
      if fout(k) == Vh			% busca una delta
         if inda ~= 0			% dice que no es la primera delta
            velprof(ind:k-1) = 1/(Ti*(indb+1));
            ind  = k;
            indb = 0;
         end
         ind  = k;
         inda = 1;			% dice que es la primer delta
         indb = 0;
      else
         indb = indb + 1;
      end
      k = k + 1;
   end
   if nargin == 10,			% Se precisa visualizacion	
      clc
      sprintf(	' Este perfil de velocidad produjo: %0.5g%s\n%s%0.5g%s\n\r%s\n', count,...
         ' pasos,',' es decir una razon de: ', count/(tf-to-Tn), ' pps.',...
         ' Pulse una tecla para ver el grfico comparativo de velocidades')
      %disp(' Strike any key to continue')
		%pause
   end
end

%error(nargchk(6,6,nargin));

% end SRgenerator

Contact us at files@mathworks.com