How to store pwm duty level?

Hi!

I have a little project going on. Was going fine but then I came up with the problem. I should be able to record PWM duty level right before STOP button was pressed. And then continue the same duty level when left or right button is pressed. Code works so far.

Could somebody help me?

Here is my code:

//cuttingmachine 
// board PIC32MZ 
// motordriver cytron MD10C R3
// motor from ebay JGY-371 

int switchPin1 = 11;
int switchPin2 = 12;
int switchPin3 = 10;
int MotorPWM = 3;
int MotorDIR = 4;
int Leftbutton = 6;
int Rightbutton = 7;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean lastButton2 = HIGH;
boolean currentButton2 = HIGH;
int MotorPWMlevel = 0;
int buttonState = 1;
int buttonState2 = 1;
int buttonState3 = 1;



void setup()
{
  pinMode(switchPin1, INPUT_PULLUP);    // speed +
  pinMode(switchPin2, INPUT_PULLUP);    //speed -
  pinMode(switchPin3, INPUT_PULLUP);   //stop
  pinMode(MotorPWM, OUTPUT);           // output to cytron md10c R3 pwm pin
  pinMode(MotorDIR, OUTPUT);           // output to cytron md10c R3 dir pin
  pinMode(Leftbutton, INPUT_PULLUP);   // rotation direction pin
  pinMode(Rightbutton, INPUT_PULLUP);   //rotation direction pin
}

boolean debounce(boolean last)                    //speed up
{
  boolean current = digitalRead(switchPin1);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin1);
  }
  return current;
}

boolean debounce2(boolean last2)                    // speed down
{
  boolean current2 = digitalRead(switchPin2);
  if (last2 != current2)
  {
    delay(5);
    current2 = digitalRead(switchPin2);
  }
  return current2;
}
void loop()
{
  {
    currentButton = debounce(lastButton);               //speed up
  if (lastButton == HIGH && currentButton == LOW)    
  {
    MotorPWMlevel = MotorPWMlevel + 10;
  }
  lastButton = currentButton;
  
 // if (MotorPWMlevel > 255) MotorPWMlevel = 0;
  analogWrite(MotorPWM, MotorPWMlevel);
  }
  
{

  currentButton2 = debounce2(lastButton2);                // speed down
  if (lastButton2 == HIGH && currentButton2 == LOW)    
  {
    MotorPWMlevel = MotorPWMlevel - 10;
  }
  lastButton2 = currentButton2;
  
  //if (MotorPWMlevel > 0) MotorPWMlevel = 255;
  analogWrite(MotorPWM, MotorPWMlevel);
  }


  buttonState = digitalRead(switchPin3);                    //stop
  
  if (buttonState == LOW) {
    MotorPWMlevel = MotorPWMlevel = 0;
     digitalWrite(MotorPWM, MotorPWMlevel );
  
  
}

  
  buttonState2 = digitalRead(Leftbutton);                    // rotation left
  
  if (buttonState2 == LOW) {
       digitalWrite(MotorDIR, HIGH );
       delay(500);
  
} 
  buttonState3 = digitalRead(Rightbutton);                   // rotation right
  
  if (buttonState3 == LOW) {
        digitalWrite(MotorDIR, LOW );
        delay(500);
  
 }                                                            
}

In your stop routine, right before you assign the speed to 0, save a copy to a new global variable and then apply it when you detect the left or right button

//cuttingmachine
// board PIC32MZ
// motordriver cytron MD10C R3
// motor from ebay JGY-371

const int switchPin1 = 11;
const int switchPin2 = 12;
const int switchPin3 = 10;
const int MotorPWM = 3;
const int MotorDIR = 4;
const int Leftbutton = 6;
const int Rightbutton = 7;
boolean lastButton = HIGH;
boolean currentButton = HIGH;
boolean lastButton2 = HIGH;
boolean currentButton2 = HIGH;
byte MotorPWMlevel = 0;
byte PreviousMotorPWMlevel;
int buttonState = 1;
int buttonState2 = 1;
int buttonState3 = 1;


void setup()
{
  pinMode(switchPin1, INPUT_PULLUP);    // speed +
  pinMode(switchPin2, INPUT_PULLUP);    //speed -
  pinMode(switchPin3, INPUT_PULLUP);   //stop
  pinMode(MotorPWM, OUTPUT);           // output to cytron md10c R3 pwm pin
  pinMode(MotorDIR, OUTPUT);           // output to cytron md10c R3 dir pin
  pinMode(Leftbutton, INPUT_PULLUP);   // rotation direction pin
  pinMode(Rightbutton, INPUT_PULLUP);   //rotation direction pin
}

boolean debounce(boolean last)                    //speed up
{
  boolean current = digitalRead(switchPin1);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin1);
  }
  return current;
}

boolean debounce2(boolean last2)                    // speed down
{
  boolean current2 = digitalRead(switchPin2);
  if (last2 != current2)
  {
    delay(5);
    current2 = digitalRead(switchPin2);
  }
  return current2;
}
void loop()
{
  {
    currentButton = debounce(lastButton);               //speed up
    if (lastButton == HIGH && currentButton == LOW)
    {
      MotorPWMlevel = MotorPWMlevel + 10;
    }
    lastButton = currentButton;

    // if (MotorPWMlevel > 255) MotorPWMlevel = 0;
    analogWrite(MotorPWM, MotorPWMlevel);
  }

  currentButton2 = debounce2(lastButton2);                // speed down
  if (lastButton2 == HIGH && currentButton2 == LOW)
  {
    MotorPWMlevel = MotorPWMlevel - 10;
  }
  lastButton2 = currentButton2;

  //if (MotorPWMlevel > 0) MotorPWMlevel = 255;
  analogWrite(MotorPWM, MotorPWMlevel);

  buttonState = digitalRead(switchPin3);                    //stop

  if (buttonState == LOW) {
    PreviousMotorPWMlevel = MotorPWMlevel;
    MotorPWMlevel = 0;
    digitalWrite(MotorPWM, MotorPWMlevel );
  }

  buttonState2 = digitalRead(Leftbutton);                    // rotation left

  if (buttonState2 == LOW) {
    digitalWrite(MotorDIR, HIGH );
    MotorPWMlevel = PreviousMotorPWMlevel;
    analogWrite(MotorPWM, MotorPWMlevel);
    delay(500);
  }
  buttonState3 = digitalRead(Rightbutton);                   // rotation right

  if (buttonState3 == LOW) {
    digitalWrite(MotorDIR, LOW );
    MotorPWMlevel = PreviousMotorPWMlevel;
    analogWrite(MotorPWM, MotorPWMlevel);
    delay(500);
  }
}

Thans. I have to try that tomorrow.

You already have the PWM value saved in 'MotorPWMLevel'. There is no need to set it to 0 when the stop button is pressed. If you move the 'analogWrite(MotorPWM, MotorPWMlevel)' lines from the speed setting buttons to the Left and Right buttons the motor will go back to the set speed when you set a direction.

void loop()
{
  {
    currentButton = debounce(lastButton);               //speed up
    if (lastButton == HIGH && currentButton == LOW)
    {
      MotorPWMlevel += 10;
      if (MotorPWMlevel > 255)
        MotorPWMlevel = 255;
    }
    lastButton = currentButton;
  }


  {
    currentButton2 = debounce2(lastButton2);                // speed down
    if (lastButton2 == HIGH && currentButton2 == LOW)
    {
      MotorPWMlevel -= 10;
      if (MotorPWMlevel < 0)
        MotorPWMlevel = 0;
    }
    lastButton2 = currentButton2;
  }


  buttonState = digitalRead(switchPin3);                    //stop
  if (buttonState == LOW)
  {
    analogWrite(MotorPWM, 0);
  }


  buttonState2 = digitalRead(Leftbutton);                    // rotation left
  if (buttonState2 == LOW)
  {
    analogWrite(MotorPWM, MotorPWMlevel);
    digitalWrite(MotorDIR, HIGH );
    delay(500);
  }


  buttonState3 = digitalRead(Rightbutton);                   // rotation right
  if (buttonState3 == LOW)
  {
    analogWrite(MotorPWM, MotorPWMlevel);
    digitalWrite(MotorDIR, LOW );
    delay(500);
  }
}