链接CSND博客编码器:
编码器的主要计算公式:
转速=时间t内测出有n个脉冲 / (单位时间发出的脉冲数 减速比 t )
这也就是利用编码器测得电机的实际速度。
获得编码器的实际speed之后,
所以接下来就需要使用PID控制代码了。
简单解释一下,编码器如果转一圈呢是11个脉冲。但是电机外有个减速器,而且减速比是34:1,那么就是电机输出轴转1圈,输入轴就要转34圈。
即电机输出轴转1圈,编码器就要输出11x34=374个脉冲。那么就是如果我们在时间t内测出一相有n个脉冲,那么转速=n/(374xt)。
代码:*
/ 描述: 电机测速/
/两相/
const int d_time=100;//设定单位时间
int flagA=0;
int flagB=0;//标志位设定
/—————设定引脚接口但是我不知道接口————————/
int AM1=a;
int BM1=b; //A相B相输入引脚的定义
int AIN1=c;
int AIN2=d;
int PWMA=e; //AIN1、2和PWMA是电机输出引脚的定义
/——————————————————————————————*/
int valA=0;
int valB=0;//用来储存A相B相记录的脉冲数
double n;//存储转速的变量
unsigned long times;
unsigned long newtime;//时间变量
void setup()
{
//Serial.begin(9600);//串口初始化,可能会用到
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(PWMA,OUTPUT);//AIN1、2和PWMA引脚的输出方式
pinMode(AM1,INPUT);
pinMode(BM1,INPUT);//AM1、BM2引脚的输入方式
}
void loop()
{
//这里要调用一个函数,电机运动的函数,但是时间太晚了,还没找
newtime=times=millis();//获得从当前程序运行开始的毫秒数
while((newtime-times)
if(digitalRead(AM1)==HIGH && flagA==0)
{
valA++;
flagA=1;
}
if(digitalRead(AM1)==LOW && flagA==1)
{
valA++;
flagA=0;
}
if(digitalRead(BM1)==HIGH && flagB==0)
{
valB++;
flagB=1;
}
if(digitalRead(BM1)==LOW && flagB==1)
{
valB++;
flagB=0;
}
newtime=millis();
}//计算AB两相的脉冲数
n=(valA+valB)/(1.496*d_time);//计算转速
Serial.print(n);
Serial.println(“rad/s”);//输出转速数值
valA=valB=0;//清零储存脉冲数的变量
}
void loop()
{
go(255);//调用go()子函数
newtime=times=millis();
while((newtime-times)
if(digitalRead(AM1)==HIGH)
{
valA++;
}
if(digitalRead(BM1)==HIGH )
{
valB++;
}
newtime=millis();
}//计算AB两相的脉冲数
n=(valA+valB)/(1.496*d_time);//计算转速
Serial.print(n);
Serial.println(“rad/s”);//输出转速数值
valA=valB=0;//清零储存脉冲数的变量
}
