霍尔编码器
编码器代码

网上找的代码
#include <MsTimer2.h>const int right_R1=8; const int right_R2=12;const int PWM_R=10;const int left_L1=7;const int left_L2=6;const int PWM_L=9;const int PinA_left = 5; //定义检测左电机脉冲的引脚为D5const int PinA_right = 4; //定义检测右电机脉冲的引脚为D4int times=0,newtime=0,d_time=100; //时间,最新的时间,时间间隔int valA=0,valB=0,flagA=0,flagB=0; //变量valA和valB用于计算脉冲数void setup(){ Serial.begin(9600); pinMode(right_R1,OUTPUT); //TB6612的引脚都设置为输出 pinMode(right_R2,OUTPUT); pinMode(PWM_R,OUTPUT); pinMode(left_L1,OUTPUT); pinMode(left_L2,OUTPUT); pinMode(PWM_L,OUTPUT); pinMode(PinA_left,INPUT); //设置检测脉冲的引脚为输入状态 pinMode(PinA_right,INPUT); MsTimer2::set(100, inter); // 100ms 触发一次中断,调用函数inter() MsTimer2::start(); //开启中断}void loop() { //两电机都正转 digitalWrite(right_R1,HIGH); digitalWrite(right_R2,LOW); digitalWrite(left_L1,HIGH); digitalWrite(left_L2,LOW); analogWrite(PWM_R,100); //写入PWM值0~255(速度) analogWrite(PWM_L,200); if(digitalRead(PinA_left)==HIGH&&flagA==0) //计算脉冲值 { valA++; flagA=1; } if(digitalRead(PinA_left)==LOW&&flagA==1) { valA++; flagA=0; } if(digitalRead(PinA_right)==HIGH&&flagB==0) { valB++; flagB=1; } if(digitalRead(PinA_right)==LOW&&flagB==1) { valB++; flagB=0; }}//中断函数void inter() { sei(); //允许全局中断 Serial.print("valA = "); //在串口监视器上打印出脉冲值 Serial.println(valA); Serial.print("valB = "); Serial.println(valB); valA = valB = 0; //清0}
自己写的代码
int GET_COUNTER(int AM1,int BM1) //返回值是脉冲数,传入的参数应该是和编码器接口的引脚 //传入int即可,不需要数组 { /*************定义部分**************/ int valA=0,valB=0; int flagA=0,flagB=0; double newtime=0; double d_time=1000; //这个d_time的数值是我瞎设的,单位是ms newtime=millis(); //获得从当前程序运行开始的毫秒数 //newtime表示计时的时间 //问题就是,millis()函数是不是这个函数结束之后就停止了? //应该是每次进函数的时候开始计时 /*************脉冲计数*************/ while((newtime)<d_time) //d_time应该表示计数的一段时间 { if(digitalRead(AM1)==HIGH && flagA==0) //A相的上升沿,计数 //这里的AM1应该是编码器的什么引脚 { valA++; flagA=1; } if(digitalRead(AM1)==LOW && flagA==1) //A相的下降沿,计数 { valA++; flagA=0; } if(digitalRead(BM1)==HIGH && flagB==0) //B相的上升沿,计数 { valB++; flagB=1; } if(digitalRead(BM1)==LOW && flagB==1) //B相的下降沿,计数 { valB++; flagB=0; } } return(valA+valB); //返回AB两相的脉冲数 //这个不是实际速度,是脉冲数,算速度在主函数里面 }