链接
编码器:
编码器有读取电机转速的作用,是组成pid控制的必要部分,编码器上有6个口。读取转速的主流方法有两种:
1)pulsein读取脉冲的时间,
2)外部中断读取单位时间触发霍尔传感器的次数.
外部中断:
需要四个外部中断的接口(对于N个需要调速的电机,就需要N个端口),这里就把很多控制板给刷掉了,一般常见的UNO,NANO均不符合此条件,拥有6个外部中断的MEGA就可以使用。
原理:外部中断的本质是在loop运行时,如果其条件被触发(如某个端口的电平变化),就会跳出主程序去运行外部中断指定的函数。这里如果检测到A相电平变化了,说明磁环上的一个磁极经过了霍尔传感器,让计数器++,然后我们有了总共的脉冲数。但我们要的是速度,也就是单位时间的脉冲数,
于是我们就有了这样的思路:用一个t变量,t=系统时间,每过了30ms将in1赋值给M1S(速度变量),并将in1清零,用于下一个30ms的读取。
程序实现:(这里以PluseIn函数为例:)map(in1,620,210,0,50);这句话实现了将转速并映射到0-50.in1=pulseIn(ma_in,HIGH,2000);这句话读取了转速<br />然后看看pid核心代码(没d)float last1;void M1PWM(int ref,int real){ float error=0,PWMINC=0;error=ref-real;PWMINC=Kp*(error-last1);M1PWMOUT+=(PWMINC+Ki*error);if(M1PWMOUT<50) M1PWMOUT=50;if(M1PWMOUT>255) M1PWMOUT=255; last1=error;}
不明白:
in1=pulseIn(pin,HIGH,2000);
这句话读取了转速
