使用树莓派和Matlab控制步进电机

时间:2018-04-04 09:33:48

标签: matlab raspberry-pi3 motordriver

我们正在尝试使用Rasberry pi 3和使用Matlab的数字步进驱动器DM556以特定步数旋转步进电机(Nema23 57HS22-A)。

我们设法使用以下python代码以特定步数(此代码中为3000步)旋转步进电机:

引脚29连接到DM556的PUL +,每当它从“LOW”变为“HIGH”时,它就会旋转步进电机。 引脚31连接到DIR +,DIR +决定步进电机旋转的方向。 引脚32连接到ENA +,使步进电机处于“低电平”状态。 PUL-,DIR-,ENA-连接到GND(不在代码中)。 此代码将步进电机3000步旋转到一侧,并在无限循环中向另一侧旋转3000步。

Import RPi.GPIO as GPIO
Import time

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(29,GPIO.out) // GPIO 5
GPIO.setup(31,GPIO.out) // GPIO 6
GPIO.setup(32,GPIO.out) // GPIO 12

GPIO.output(32.GPIO.LOW) 

While True:
    GPIO.output(31,GPIO.HIGH) 
    For i in range(0,3000): 
        GPIO.output(29,GPIO.HIGH)
        Time.sleep(0.0005) 
        GPIO.output(29,GPIO.LOW)
        Time.sleep(0.0005)
    GPIO.output(31,GPIO.LOW)
    For i in range(0,3000):
        GPIO.output(29,GPIO.HIGH)
        Time.sleep(0.0005) 
        GPIO.output(29,GPIO.LOW)
        Time.sleep(0.0005)

我们尝试将此代码转换为matlab,我们编写了不会旋转电机的代码:

clear all; close all; clc;

rpi1 = raspi('192.168.67.187','pi','raspberry');

pul_x = 5;
dir_x = 6;
ena_x = 12;

configurePin(rpi1,pul_x,'DigitalOutput');
configurePin(rpi1,dir_x,'DigitalOutput');
configurePin(rpi1,ena_x,'DigitalOutput');

writeDigitalPin(rpi1,pul_x,1);
writeDigitalPin(rpi1,dir_x,0);
writeDigitalPin(rpi1,ena_x,0);


for i = 1:200
    writeDigitalPin(rpi1,pul_x,1);
    pause(0.001);
    writeDigitalPin(rpi1,pul_x,0);
    pause(0.001);
end

我们成功使用这个matlab代码旋转步进电机,但没有特定的步骤:

clear all; close all; clc;

rpi1 = raspi('192.168.67.187','pi','raspberry');

pul_x = 5;
dir_x = 6;
ena_x = 12;

configurePin(rpi1,pul_x,'PWM');
configurePin(rpi1,dir_x,'DigitalOutput');
configurePin(rpi1,ena_x,'DigitalOutput');

writeDigitalPin(rpi1,dir_x,0);
writeDigitalPin(rpi1,ena_x,1);
writePWMDutyCycle(rpi1, pul_x, 0.5);
writePWMFrequency(rpi1, pul_x, 1000);

for i = 1:200
    writeDigitalPin(rpi1,ena_x,0);
end

writeDigitalPin(rpi1,ena_x,1);

我们试图修复第二个代码以使步进电机移动,但我们很高兴听到任何其他建议以特定步数旋转步进电机。

提前致谢。

编辑:

我们发现我们发布的第二个代码实际上有效,但问题是writeDigitalPin命令需要花费太多时间(20毫秒),因此步进电机移动速度太慢而无法看到。 是否有任何其他功能或方法可以缩短时间以使电机运行更快?

1 个答案:

答案 0 :(得分:0)

要控制伺服电机,您可以使用Raspberry Pi支持包中的伺服obj和writePosition()函数。

r = raspi;
servoControlPin = 29;
s = servo(r,servoControlPin);
for i = 1:3000
    position = (180*i)/3000
    writePosition(s,position);
end

请参阅doc page of servo以了解有关如何配置最小/最大脉冲持续时间的更多信息。