基于arduino控制带编码器直流电机速度
模块:带减速的直流电机(减速比1:120),霍尔编码器(每圈13个信号单相)arduino UNO,TB6612FNG,3.7V电源
编码器连接在直流电机输入端,输出一圈单相有(13*120)个脉冲
#define AIN1 3
#define AIN2 4
#define PWMA 5
#define AA 2
int valA=0;
float n;
int flag=0;
int pwm=70;
unsigned long starttime,stoptime;
void timer()
{
valA++;
stoptime=millis();
if((stoptime-starttime)>100)
{
detachInterrupt(0);
flag=1;
}
}
void setup() {
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(PWMA,OUTPUT);
pinMode(AA,INPUT);
Serial.begin(9600);
attachInterrupt(0,timer,RISING);
starttime=millis();
Serial.println(starttime);
}
void loop() {
digitalWrite(AIN1,HIGH);
digitalWrite(AIN2,LOW);
analogWrite(PWMA,pwm);
if(flag==1) //if()前面加while(1)不行
{
n=valA*100/156.000; //放大一百倍串口绘图
Serial.println(n,3);
valA=0;
flag=0;
pwm=pwm+60-n; //speed 为60/100 r/s
if(pwm>255)
pwm=255;
if(pwm<0)
pwm=0;
delay(0);
starttime=millis();
attachInterrupt(0,timer,RISING);
}
}
电机控制为PID中的简单的P控制,可以调整参数从而改变调整速度和超调量
编写代码遇到的问题:
1.中断里面不能加 Serial.println()函数,否则速度快时会丢脉冲。
2.主函数里计算速度时,需停止中断,否则容易出错。