%% 1.步进电机PWM计算代码
clc
clear
close all
%% 原始值,A,T,UN
A=25.40;%振幅*2,两倍振幅,即伸缩杆的移动范围
MBJL=0.0254;%每步距离,电机固定参数(与细分数有关)
T=4;%三角函数的周期,秒
T=T*1000*1000;%换算为微秒
SN=A/MBJL;%StepNumber,三角函数一个周期内的脉冲步数,振幅固定后SN即固定
TPSN=T/SN;%TimePerStep,每步的时长的平均值
UN=20;%UnitNumber,一个周期平均分割的单元总数
%函数
x=2*pi/SN:2*pi/SN:2*pi;%自变量
y=func(x,A);%函数
% %函数:脉冲数-位移图
% figure(1)
% plot(1:SN,y,'b.','markersize',15,'LineWidth',1)
% xlabel('脉冲数')
% ylabel('位移/mm')
% ZT=30;%字体30号
% set(gca,'FontSize',ZT);
% aaa=2;
% set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
% set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);
%
% %目标函数图(理想函数图)
% figure(2)
% plot((1:SN)*TPSN,y,'b.','markersize',15,'LineWidth',1)
% xlabel('时间/微秒')
% ylabel('位移/mm')
% ZT=30;%字体30号
% set(gca,'FontSize',ZT);
% aaa=2;
% set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
% set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);
%%
NN=1:SN/UN:SN;%平均分割的脉冲坐标
NN(length(NN)+1)=SN;
x0=zeros(1,length(NN));
for i=1:length(NN)
x0(1,i)=x(NN(1,i));%平均分割的脉冲坐标对应的x坐标
end
y0=func(x0,A);%x坐标对应的位移
y01=y0(1:(length(NN)-1));
y02=y0(2:(length(NN)));
y00=y02-y01;
%求解
MCZS=abs(y00/0.0254);%一个单元内的脉冲总数
% MCZS=round(MCZS);
UnitTime=T/UN/1000/1000;%每个单元的时长/秒
MCPL=MCZS/UnitTime;%脉冲频率,Hz
MCPL=round(MCPL);
PJBC=(T/UN)./MCZS;%每单元的平均步长,微秒,脉冲总数需要四舍五入
PJBC=round(PJBC);
%结果
Result_UT=UnitTime;%每个单元的时长/秒
Result_PL=MCPL;%脉冲频率,Hz
%% 还原函数图
MCZS000=UnitTime*MCPL;%一个单元内的脉冲总数
MCZS000=round(MCZS000);
x1=MCZS000*MBJL;
x1(1:length(x1)/2)=-x1(1:length(x1)/2);
JLJL=zeros(1,UN);%积累距离,mm
for i=1:UN
JLJL(i)=sum(x1(1:i));
end
x2=MCZS.*PJBC;
JLSJ=zeros(1,UN);%积累时间,微秒
for i=1:UN
JLSJ(i)=sum(x2(1:i));
end
figure(3)
plot((1:SN)*TPSN,y,'b.-','markersize',5,'LineWidth',5)
hold on
plot(JLSJ,JLJL+abs(min(JLJL)),'r*-','markersize',10,'LineWidth',2)
xlabel('时间/微秒')
ylabel('位移/mm')
legend('理想时间位移函数','还原时间位移关系')
ZT=30;%字体30号
set(gca,'FontSize',ZT);
aaa=2;
set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);
RaspberryCode(Result_PL,Result_UT);