DC Motor CHM-1203-1M

Hi, I have built a system using Motor shield and UNO board to driving two DC motors. One of them is CHM-1203-1m. The same code runs good at the other motor, which runing current is about 0.02A. But when it runing for CHM motor, it always keep working for a while, then can not stop. and the running current is about 0.2A.
Have anybody used this type of motor before? Please give me some suggestions. Should I connect a capacitor between motor jack and power?
I have attached my code, which receive the compass data and GPS data, and based on these to drive motor.

void setup ( )
{
  pinMode(chASpeed, OUTPUT); // Motor drives-----------
  pinMode(chABrake, OUTPUT); 
  pinMode(chADirection, OUTPUT); 
  pinMode(chBSpeed, OUTPUT); // Motor drives-----------
  pinMode(chBBrake, OUTPUT); 
  pinMode(chBDirection, OUTPUT); 

  Serial.begin(4800);
  Wire.begin();
  compass.init();
  compass.enableDefault();
  
  // Calibration values. Use the Calibrate example program to get the values for
  // your compass.
  compass.m_min.x = -1004; compass.m_min.y = -658; compass.m_min.z = -845;
  compass.m_max.x = +652; compass.m_max.y = +938; compass.m_max.z = 778;
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
  
    st.pdat = &(st.pd); /* point to the structure for convenience */
  
    st.S_init (st.pdat);
}

void loop(){

    long retval;              
  
  
    /**************  Begin demo program **************/
    
    if (stringComplete) 
    {                                                                                  
      inputString = "";  // clear the string:
      if(label == true)
      {
        label = false;

        compass.read();
        headingAngle = compass.heading((LSM303::vector){0,-1,0});
        pitchAngle = atan(compass.a.y/sqrt(pow(compass.a.x,2)+pow(compass.a.z,2)));
        pitchAngle = pitchAngle *(180.0/PI);    
        
       if((abs(headingAngle-preheadingAngle)>=5)||(abs(pitchAngle-prepitchAngle)>= 3))
       {
         //preheadingAngle = headingAngle;
         //prepitchAngle = pitchAngle;
         Serial.println("Bad data!");
       }
       else
       {         
          comAngle = 90 - st.pdat->elevref;

          distance_TC = abs(pitchAngle - comAngle);
          if (pitchAngle >= comAngle)
          {
            digitalWrite(chBDirection,0);  // 0-move downwards

            if (distance_TC > 1)          
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,128);      
              delay(5000);
              digitalWrite(chBBrake,1);
            } 
            else if ((distance_TC > 0.4) &&(distance_TC <= 1)) 
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,16);       
              delay(5000);
              digitalWrite(chBBrake,1);
            } 
            else if (distance_TC <= 0.4) 
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,8);       
              delay(3000);
              digitalWrite(chBBrake,1);
            } 
            delay(3000);
          }
          else if (pitchAngle < comAngle)
          {
            digitalWrite(chBDirection,1);  //1-move upwards      
            
            if (distance_TC > 1)            
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,128);     
              delay(5000);


              Serial.println("xixi");                  //Every Time the motor keep working from here   


                          
              digitalWrite(chBBrake,1);
            }
            else if ((distance_TC > 0.4) &&(distance_TC <= 1)) 
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,16);      
              delay(5000);
              digitalWrite(chBBrake,1);
            }        
            else if (distance_TC <= 0.4) 
            {
              digitalWrite(chBBrake,0);
              digitalWrite(chBSpeed,8);       // solar speed
              delay(3000);
              digitalWrite(chBBrake,1);
            }   
            //digitalWrite(chBSpeed,LOW);  
            Serial.println("end up");   
            delay(3000);
          }
       }         // end of else                  
      }          // end of label true
      preheadingAngle = headingAngle;
      prepitchAngle = pitchAngle;
      stringComplete = false; 
      Serial.println("end loop");
      delay(1000);
    }              //end of string complete
    
       
    while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read(); 
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') 
    {
       length = inputString.length();
       if (length>5)
       {
         if (inputString.startsWith("$GPRMC"))
         {
            if(inputString.substring(17,19) == ",A")
           {
            // length = inputString.length();
             inputString.substring(7,9).toCharArray(temp,12);
             hourValue = atoi(temp);
                 
             inputString.substring(9,11).toCharArray(temp,12);
             minValue = atoi(temp);
             
             inputString.substring(11,13).toCharArray(temp,12);
             secValue = atoi(temp);
             
             inputString.substring(20,22).toCharArray(temp,12);
             tempDeg = atoi(temp);
             
             inputString.substring(22,26).toCharArray(temp,12);
             tempMin = atoi(temp)/60.00;
  
             if(inputString.substring(30,31) == "N")
             {
                latValue = tempDeg + tempMin;
             }
             else if(inputString.substring(30,31) == "S")
             {
               latValue = -(tempDeg + tempMin);
             }
  
             inputString.substring(32,35).toCharArray(temp,12);
             tempDeg = atoi(temp);
  
             inputString.substring(35,39).toCharArray(temp,12);
             tempMin = atoi(temp)/60.00;
  
             if(inputString.substring(43,44) == "E")
             {
                lonValue = tempDeg + tempMin;
             }
             else if(inputString.substring(43,44) == "W")
             {
               lonValue = -(tempDeg + tempMin);
             }
             
             inputString.substring(length-15,length-13).toCharArray(temp,12);
             dayValue = atoi(temp);
  
             inputString.substring(length-13,length-11).toCharArray(temp,12);
             monthValue = atoi(temp);
  
             inputString.substring(length-11,length-9).toCharArray(temp,12);
             yearValue = atoi(temp);
             label = true;   
             Serial.println("label set true");
            }
          }
       }
        stringComplete = true;
        Serial.flush();
        Serial.println("flush");
        break;
     } 
  }
}

source code.txt (6.43 KB)