【树莓派步进电机】【2.1】PWM篇:控制代码

零.PWM参考

【1】【Arduino步进电机】【5.1】PWM代码(1)
【2】【Arduino步进电机】【5.2】PWM代码(2)语句自动生成代码
【3】【Arduino步进电机】【5.3】PWM代码(2)语句自动生成代码-GUI自动化程序

一.Matlab代码

1.1 主程序

%% 1.步进电机PWM计算代码
clc
clear
close all
%% 原始值
A=25.40;%振幅*2,两倍振幅,即伸缩杆的移动范围
MBJL=0.0254;%每步距离,电机固定参数(与细分数有关)
T=0.5;%三角函数的周期,秒
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);


func函数

function y=func(x,A)
y=A/2*cos(x)+A/2;

效果
周期2秒,40个时间单元

【树莓派控制步进电机】以三角函数的方式运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值