djjreal 发表于 2017-1-22 15:10:57

Arduino产生脉冲信号控制步进电机

第一次发帖,好紧张啊{:soso__3110130392203091378_3:}

之前在玩步进电机驱动的泵,一直在找怎么怎么用arduino产生脉冲信号,参考了几种方法,但输出的精度不够,特别是频率比较高的时候,误差就会增大。
自己写了个库,很好懂,发上来给大家参考一下(轻拍,please)。
输出引脚只能是0~7,占空比不能设置,有些语句加进去会增大误差。
输出的时候还是有点误差,不过可以通过方程计算一下,比如想输出1000Hz,代入方程算出Input = 1016,填入1016就能输出1000Hz的脉冲,公式是自己算的,不知道在其他板子里的公式对不对,不过可以自己去算。4000Hz以下误差可以小于1%,不过大于4000Hz的话,误差就会大一点。

还有个问题就是,loop里加入digitalWrite(Vin, 0);digitalWrite(dir, 0);这两句之后,误差会增大,不知道还有什么方法可以解决。

#include "StepPump.h"
StepPump PumpA(3);
#define dir 4
#define Vin 5

void setup(){
       pinMode(dir, OUTPUT);
       pinMode(Vin, OUTPUT);
}


void loop(){
/*digitalWrite(Vin, 0);
        digitalWrite(dir, 0);*/
        PumpA.pulseOut(1016); //15.6E-6 * INPUT - (1 - 601.2E-6)* INPUT + OUTPUT = 0, target_Hz = Output, 计算出对应的Input
}

最帅老饼 发表于 2017-2-4 13:15:25

Arduino 有个脉冲输出函数tone();为什么不用。
我家大门的开关工程,就用 tone 函数来控制步进电机的。

HzO 发表于 2017-1-22 17:30:51

我是第一次回复,,,,,,,,,,

itsia 发表于 2017-1-23 18:06:04

为什么要加到循环里面去?

djjreal 发表于 2017-1-24 09:49:30

itsia 发表于 2017-1-23 18:06
为什么要加到循环里面去?

你指的是?

itsia 发表于 2017-1-24 10:20:14

/*digitalWrite(Vin, 0);
      digitalWrite(dir, 0);*/
这两句为什么要加到循环里面?
实际的执行效果也就一次,就放在setup()里面呗,
要不或者放在 PumpA.pulseOut()里面作为两个参数传递,并且把这两句也用PORDD直接赋值。

djjreal 发表于 2017-1-24 12:16:34

哦,明白。
页: [1]
查看完整版本: Arduino产生脉冲信号控制步进电机