I'm not sure why this has been so difficult for me, but I'm trying to control the acceleration of a 10v DC motor with an Arduino UNO and an L298n H-Bridge. Using a 12v regulated power supply to power the motor
For the life of me, I can't get a smooth acceleration/deceleration for this. I want the motor to move back and forth with a potentiometer, slowing down as it reaches the '0' and '10' positions. This works, but it's not very smooth
const byte motorUp = 4;
const byte motorDown = 5;
const byte motorPWM = 6;
const int speed1 = 85;
const int speed2 = 92;
const int speed3 = 100;
const int speed4 = 110;
const int speed5 = 130;
const int speed6 = 190;
int state = 0;
const byte wiper = A0; //Position of fader relative to GND (Analog 0)
double faderMax = 0; //Value read by fader's maximum position (0-1023)
double faderMin = 0; //Value read by fader's minimum position (0-1023)
byte motorSpeed = 255; // Raise if the fader is too slow (0-255)
byte tolerance = 10; // Raise if the fader is too shaky (0-1023)
void setup() {
Serial.begin(250000);
pinMode(motorDown, OUTPUT);
pinMode(motorUp, OUTPUT);
pinMode(motorPWM, OUTPUT);
analogWrite(motorPWM, motorSpeed);
calibrateFader(); }
void calibrateFader() {
digitalWrite(motorUp, HIGH);
analogWrite(motorPWM, 155);
delay(300);
digitalWrite(motorUp, LOW);
faderMax = analogRead(wiper) - tolerance;
digitalWrite(motorDown, HIGH);
analogWrite(motorPWM, 155);
delay(300);
digitalWrite(motorDown, LOW);
faderMin = analogRead(wiper) + tolerance;
delay(2500); }
void loop () {
moveMotorUp();}
void moveMotorUp() {
while (analogRead(A0) <= 100) {
analogWrite(motorPWM, speed1);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 100) && (analogRead(A0) <= 200)) {
analogWrite (motorPWM, speed2);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 200) && (analogRead(A0) <= 300)) {
analogWrite (motorPWM, speed3);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 300) && (analogRead(A0) <= 400)) {
analogWrite (motorPWM, speed4);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 400) && (analogRead(A0) <= 500)) {
analogWrite (motorPWM, speed5);
digitalWrite (motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 500) && (analogRead(A0) <= 600)) {
analogWrite (motorPWM, speed6);
digitalWrite (motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 600) && (analogRead(A0) <= 700)) {
analogWrite (motorPWM, speed5);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 700) && (analogRead(A0) <= 800)) {
analogWrite (motorPWM, speed4);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 800) && (analogRead(A0) <= 900)) {
analogWrite (motorPWM, speed3);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while ((analogRead(A0) > 900) && (analogRead(A0) <= 1000)) {
analogWrite (motorPWM, speed2);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW); }
while (analogRead(A0) > 1000) {
analogWrite (motorPWM, speed1);
digitalWrite(motorUp, HIGH);
digitalWrite(motorDown, LOW);
moveMotorDown(); } }
void moveMotorDown() {
while (analogRead(A0) > 1000) {
analogWrite(motorPWM, speed1);
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 900) && (analogRead(A0) <= 1000)) {
analogWrite (motorPWM, speed2);
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 800) && (analogRead(A0) <= 900)) {
analogWrite (motorPWM, speed3);
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 700) && (analogRead(A0) <= 800)) {
analogWrite (motorPWM, speed4);
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 600) && (analogRead(A0) <= 700)) {
analogWrite (motorPWM, speed5);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 500) && (analogRead(A0) <= 600)) {
analogWrite (motorPWM, speed6);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 400) && (analogRead(A0) <= 500)) {
analogWrite (motorPWM, speed5);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 300) && (analogRead(A0) <= 400)) {
analogWrite (motorPWM, speed4);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 200) && (analogRead(A0) <= 300)) {
analogWrite (motorPWM, speed3);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 100) && (analogRead(A0) <= 200)) {
analogWrite (motorPWM, speed2);
digitalWrite (motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while ((analogRead(A0) > 10) && (analogRead(A0) <= 100)) {
analogWrite(motorPWM, speed1);
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW); }
while (analogRead(A0) <= 10) {
digitalWrite(motorDown, HIGH);
digitalWrite(motorUp, LOW);
moveMotorUp(); } }
I hope it's simpler than this - Any ideas? Thanks