Go Down

### Topic: Motor Acceleration Timer Deceleration Problem (Read 5218 times)previous topic - next topic

#### urthlight

##### Apr 23, 2013, 07:32 pmLast Edit: Apr 23, 2013, 09:29 pm by urthlight Reason: 1
I am having some trouble getting the following code to work. Any Ideas?

Code: [Select]
`//////////////////////////////#define STIRRING1_TIME 20  //   1200#define Srelay    51int stir_speed = 180;int time = 0;  int pump_pwm_del = 1;int second = 0;void setup() {  Serial.begin(57600);  Serial.println("setup");  digitalWrite(23,HIGH);    /////////////////////////////  pinMode(Srelay, OUTPUT); // Provides/Removes Power to motor controllers  pinMode(44, OUTPUT); //Shared PWM Signal to all 4 motor controllers  pinMode(23, OUTPUT);   //Stir motor  digitalWrite(Srelay,LOW);//Turn off power to motor controllers}void loop() {  digitalWrite(Srelay,HIGH);//Turn off power to motor controllers    Serial.println("23");  stir(10); }///////////////////////////////////////////////////////////Stirint stir(int time){  digitalWrite(23,LOW); // Release Brake Stir Motor     Serial.print("Brake On ");  for (int motorspeed = 0; motorspeed < stir_speed; motorspeed++) {    analogWrite(44, motorspeed);// Ramp up speed     Serial.print("motorspeed = ");    Serial.println(motorspeed);    delay(4);  }  //motor at speed start counting  Serial.print("motorspeed = MAX ");  static unsigned long lastTick = 0; // set up a local variable to hold the last time we moved forward one second  // (static variables are initialized once and keep their values between function calls)  if (millis() - lastTick >= 1000) {        lastTick = millis();    second++;          Serial.print("Second = ");    Serial.println(second);      if (second > time){   // Count over decel motor      Serial.print("Time Out");       for (int motorspeed = stir_speed; motorspeed >= 0; motorspeed--) {    analogWrite(44, motorspeed);  //Ramp down     Serial.print("motorspeed = ");    Serial.println(motorspeed);    delay(4);  }    Serial.print("motorspeed = MIN ");  digitalWrite(23, HIGH);// Set Brake stir Motor   Serial.print("Brake On ");    }  }  delay(1000);}`

It is supposed to Ramp up and  do the timer code and then ramp down.

motorspeed = 176
motorspeed = 177
motorspeed = 178
motorspeed = 179
motorspeed = MAX 25
Brake On motorspeed = 0
motorspeed = 1
motorspeed = 2
motorspeed = 3
motorspeed = 4
motorspeed = 5
motorspeed = 6

#### PaulS

#1
##### Apr 23, 2013, 08:32 pm
Quote
It is supposed to do the timer code and then ramp down.

I fail to see the purpose of using millis() to create a non-blocking function and then using delay() in the same function.

#### urthlight

#2
##### Apr 23, 2013, 09:38 pmLast Edit: Apr 23, 2013, 09:45 pm by urthlight Reason: 1
Quote

motorspeed = 176
motorspeed = 177
motorspeed = 178
motorspeed = 179
motorspeed = MAX 25
Brake On motorspeed = 0
motorspeed = 1
motorspeed = 2
motorspeed = 3
motorspeed = 4
motorspeed = 5
motorspeed = 6

Quote
I fail to see the purpose of using millis() to create a non-blocking function and then using delay() in the same function.

The millis keeps track of time and the delay smooths out the accel/decel ramps

#### JimEli

#3
##### Apr 23, 2013, 09:46 pm
What happens if this statement is false?

Code: [Select]
`  if (millis() - lastTick >= 1000) `

#### UKHeliBob

#4
##### Apr 23, 2013, 09:55 pm

http://arduino.cc/forum/index.php/topic,160843.0.html
Please do not send me PMs asking for help.  Post in the forum then everyone will benefit from seeing the questions and answers.

#### urthlight

#5
##### Apr 23, 2013, 10:02 pm
Yup, Still wrestling with this issue. I seem to get comments and criticisms instead of help.

#### AWOL

#6
##### Apr 23, 2013, 10:08 pm
Quote
It's an understandable side-effect of cross-posting.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

#### urthlight

#7
##### Apr 23, 2013, 10:43 pm
Quote
It's an understandable side-effect of cross-posting.

Actually I posted a new question because I was receiving critique instead of help. Seems there is no shortage of people to tell you you are doing it wrong, and only a few pathfinders.

#### AWOL

#8
##### Apr 23, 2013, 10:48 pm
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

#### JimEli

#9
##### Apr 24, 2013, 01:09 am
bigger hint:

Code: [Select]
`  if (millis() - 0 >= 1000)`

#### Henry_Best

#10
##### Apr 24, 2013, 03:54 am

I am having some trouble getting the following code to work. Any Ideas?

Code: [Select]
`    if (second > time){   // Count over decel motor      Serial.print("Time Out");       for (int motorspeed = stir_speed; motorspeed >= 0; motorspeed--) { `

Assuming stir_speed is a positive number, then motorspeed will always be >0 and your for loop won't do anything. That's why it's not ramping up. Try:
Code: [Select]
`for (motorspeed = stir_speed; motorspeed <= 0; motorspeed--) `

#### PeterH

#11
##### Apr 24, 2013, 02:56 pm

Assuming stir_speed is a positive number, then motorspeed will always be >0 and your for loop won't do anything. That's why it's not ramping up. Try:

Unless I'm missing something, your proposal causes the problem you're describing.

#### urthlight

#12
##### Apr 24, 2013, 04:28 pm
Quote
bigger hint:

Code: [Select]
`if (millis() - 0 >= 1000)`

I am confused by this code. I have it working elsewhere. It counts 1000 millisec and increments the second variable.
But, I think I am tracking that  millis() returns a rather large number (elapsed time) and - 0 it is still >= 1000.
So I need to initialize
Code: [Select]
` static unsigned long lastTick = 0; ` this differently?

#### AWOL

#13
##### Apr 24, 2013, 04:31 pm
Quote
So I need to initialize
Code:

static unsigned long lastTick = 0;

this differently?

You don't need to initialise it at all - it is static, so the compiler makes it zero, unless you tell it otherwise.
But you do need to update it.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

#### urthlight

#14
##### Apr 24, 2013, 04:58 pm
Quote
You don't need to initialise it at all - it is static, so the compiler makes it zero, unless you tell it otherwise.
But you do need to update it.

Code: [Select]
` static unsigned long lastTick = 0;`
So something more like
Code: [Select]
` static unsigned long lastTick = millis();`

Go Up