shihaipeng05 发表于 2020-10-17 23:07:52

码盘计数器的问题

本帖最后由 shihaipeng05 于 2020-10-17 23:09 编辑

做了一个绕圈的东西,需要记录旋转圈数,前前后后弄了3,4个模块样子也各异,奇怪的是大部分模块会多记,在旋转盘上沾了一个小翅膀会通过模块,可见的模块灯会闪一次,但是计数器有时候会记录3,4次。我是用中断函数记的,不知道是哪里的问题,请大神们给指点一下。


只有右边这个计数比较准。另外2个,总是差异很大。我的电机转速也不高,大约1分钟90转左右。


模块接的 2#, 3#是一个舵机可以忽略,10,11#是电机的控制端口
int la=0,ra=90;//舵机左右角度


#define buttonpin 2    //定义按键引脚、外部中断0

int spd=17;//速度
int turns=111;//圈数 大约长度/3

#include <Servo.h>

int flag = 0;

Servo myservo;// create servo object to control a servo


int pos = 0;    // variable to store the servo position

void setup() {
Serial.begin(115200);
pinMode(3, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);

myservo.attach(3);// attaches the servo on pin 9 to the servo object
digitalWrite(10, 0);

pinMode(buttonpin, INPUT_PULLUP);   //内部上拉
pinMode(13, OUTPUT);
attachInterrupt(0, inter,FALLING);//外部中断,下降沿触发

}

void inter(){   //调用的中断函数

flag++;
Serial.print(flag);
Serial.print("   |      ");
Serial.println(millis()/1000);

}


void loop() {


for(int sqq=0;sqq<255;sqq++)
{
   analogWrite(11, sqq);
   delay(10);
}
//电机加速


while (flag < turns)   //达到要求的圈数就停机

{
      //下面是电机旋转时的操作可以忽略   
       for (pos = ra; pos > la; pos--) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
      myservo.write(pos);            // tell servo to go to position in variable 'pos'
      delay(spd);                     // waits 15ms for the servo to reach the position
    }
   
   
}

analogWrite(11, 0); //电机停机


while(1)
{

}

   

}
页: [1]
查看完整版本: 码盘计数器的问题