码盘计数器的问题
本帖最后由 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]