基于arduino控制带编码器直流电机速度

基于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.主函数里计算速度时,需停止中断,否则容易出错。

你可能感兴趣的:(基于arduino控制带编码器直流电机速度)