1.思路:用定时器1实现20ms中断一次,采集as5600编码器的计数值a并把数据作为上一次的值last_a,下一次进入中断把差值除以0.02即可得到每秒的计数值counter。counter / 4096 = n 转/秒。
电机16细分,步距角1.8°,即3200个脉冲转一圈,将设定的脉冲值与编码器的检测值比较,进行补偿,编码器计数值没有到预定值,或者超过预定值,通过改变dir引脚控制电机正反转使得电机转到既定角度,转到既定角度后关闭电机en引脚。
2.代码 :
//180 / PI / 360 = 0.1591
this_encoder = sensor.getAngle() * (0.159 * 10);
if(flag_timer1 == 1)
{
e = stepper_Target - this_encoder;
if((e<0.5f)&&(e>-0.5f))
{
e = 0;
}
if(e > 0)
{
one_Step = IncPIDCalc(this_encoder,stepper_Target);
one_Step = abs(one_Step);
digitalWrite(EN_PIN, LOW);
digitalWrite(DIR_PIN, HIGH);
}else if(e < 0)
{
digitalWrite(EN_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
}else
{
digitalWrite(EN_PIN, HIGH);
}