From ff529c2a699c8864ff66854a64eff49aa32bb5e5 Mon Sep 17 00:00:00 2001 From: Tim Otto Date: Thu, 9 Sep 2021 06:45:44 +0200 Subject: [PATCH 1/3] config option for motor driver min PWM value --- sunray/config_example.h | 2 +- sunray/robot.cpp | 2 +- sunray/src/driver/AmRobotDriver.cpp | 6 +++--- sunray/src/driver/AmRobotDriver.h | 4 +++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sunray/config_example.h b/sunray/config_example.h index a908cf2e1..9bb8a53fc 100644 --- a/sunray/config_example.h +++ b/sunray/config_example.h @@ -133,6 +133,7 @@ Also, you may choose the serial port below for serial monitor output (CONSOLE). // ----- gear motors -------------------------------------------------- // for brushless motors, study the sections (drivers, adapter, protection etc.) in the Wiki (https://wiki.ardumower.de/index.php?title=DIY_Brushless_Driver_Board) // #define MOTOR_DRIVER_BRUSHLESS 1 // uncomment this for new brushless motor drivers +#define MOTOR_DRIVER_MIN_PWM 2 // set this to 0 if you use custom motor drivers and your motors do not stop spinning when stopped #define MOTOR_OVERLOAD_CURRENT 0.8 // gear motors overload current (amps) @@ -514,4 +515,3 @@ Also, you may choose the serial port below for serial monitor output (CONSOLE). // 2. Locate file 'packages/arduino/hardware/sam/xxxxx/cores/arduino/RingBuffer.h #define SERIAL_BUFFER_SIZE 1024 - diff --git a/sunray/robot.cpp b/sunray/robot.cpp index 0ed46f9fb..6f74540f7 100644 --- a/sunray/robot.cpp +++ b/sunray/robot.cpp @@ -57,7 +57,7 @@ MPU9250_DMP imu; SerialRainSensorDriver rainDriver(robotDriver); #else AmRobotDriver robotDriver; - AmMotorDriver motorDriver; + AmMotorDriver motorDriver(MOTOR_DRIVER_MIN_PWM); AmBatteryDriver batteryDriver; AmBumperDriver bumper; AmStopButtonDriver stopButton; diff --git a/sunray/src/driver/AmRobotDriver.cpp b/sunray/src/driver/AmRobotDriver.cpp index da9b99e32..c040d725b 100644 --- a/sunray/src/driver/AmRobotDriver.cpp +++ b/sunray/src/driver/AmRobotDriver.cpp @@ -46,7 +46,7 @@ void OdometryRightISR(){ odomTicksRight++; } -AmMotorDriver::AmMotorDriver(){ +AmMotorDriver::AmMotorDriver(int _minPwm) : minPwm(_minPwm) { } @@ -134,11 +134,11 @@ void AmMotorDriver::setBrushless(int pinDir, int pinPWM, int speed) { //DEBUGLN(speed); if (speed < 0) { digitalWrite(pinDir, HIGH) ; - if (speed >= -2) speed = -2; + if (abs(speed) < minPwm) speed = -minPwm; pinMan.analogWrite(pinPWM, ((byte)abs(speed))); } else { digitalWrite(pinDir, LOW) ; - if (speed <= 2) speed = 2; + if (abs(speed) < minPwm) speed = minPwm; pinMan.analogWrite(pinPWM, ((byte)abs(speed))); } } diff --git a/sunray/src/driver/AmRobotDriver.h b/sunray/src/driver/AmRobotDriver.h index f0ca0ce9c..1b8d85636 100644 --- a/sunray/src/driver/AmRobotDriver.h +++ b/sunray/src/driver/AmRobotDriver.h @@ -21,8 +21,10 @@ class AmRobotDriver { class AmMotorDriver: public MotorDriver { + private: + int minPwm; public: - AmMotorDriver(); + AmMotorDriver(int _minPwm); void begin() override; void run() override; void setMotorPwm(int leftPwm, int rightPwm, int mowPwm) override; From 14ba2523a2f1a4e401cc82be1626216c00fc278c Mon Sep 17 00:00:00 2001 From: Tim Otto Date: Thu, 9 Sep 2021 06:50:33 +0200 Subject: [PATCH 2/3] refactoring --- sunray/src/driver/AmRobotDriver.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/sunray/src/driver/AmRobotDriver.cpp b/sunray/src/driver/AmRobotDriver.cpp index c040d725b..babfdf246 100644 --- a/sunray/src/driver/AmRobotDriver.cpp +++ b/sunray/src/driver/AmRobotDriver.cpp @@ -128,19 +128,12 @@ void AmMotorDriver::setMC33926(int pinDir, int pinPWM, int speed) { // IN1 PinPWM IN2 PinDir // PWM L Forward // PWM H Reverse -// verhindert dass das PWM Signal 0 wird. Der Driver braucht einen kurzen Impuls um das PWM zu erkennen. -// Wenn der z.B. vom max. PWM Wert auf 0 bzw. das Signal auf Low geht, behält er den vorherigen Wert bei und der Motor stoppt nicht +// minPwm verhindert, dass das PWM Signal 0 wird. Manche Driver brauchen einen kurzen Impuls, um das PWM zu erkennen. +// Wenn der z.B. vom max. PWM Wert auf 0 bzw. das Signal auf Low geht, behalten diese den vorherigen Wert bei und der Motor stoppt nicht. void AmMotorDriver::setBrushless(int pinDir, int pinPWM, int speed) { //DEBUGLN(speed); - if (speed < 0) { - digitalWrite(pinDir, HIGH) ; - if (abs(speed) < minPwm) speed = -minPwm; - pinMan.analogWrite(pinPWM, ((byte)abs(speed))); - } else { - digitalWrite(pinDir, LOW) ; - if (abs(speed) < minPwm) speed = minPwm; - pinMan.analogWrite(pinPWM, ((byte)abs(speed))); - } + digitalWrite(pinDir, speed < 0 ? HIGH : LOW); + pinMan.analogWrite(pinPWM, (byte) max(minPwm, abs(speed)) ); } From 1fed382f957cea2fea7bc6f6ae9d1c0e80412b58 Mon Sep 17 00:00:00 2001 From: Tim Otto Date: Tue, 16 Nov 2021 21:14:02 +0100 Subject: [PATCH 3/3] allow different min-pwm for drive and mow --- sunray/config_example.h | 1 + sunray/robot.cpp | 2 +- sunray/src/driver/AmRobotDriver.cpp | 10 +++++----- sunray/src/driver/AmRobotDriver.h | 7 ++++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/sunray/config_example.h b/sunray/config_example.h index 9bb8a53fc..34e65bfb0 100644 --- a/sunray/config_example.h +++ b/sunray/config_example.h @@ -134,6 +134,7 @@ Also, you may choose the serial port below for serial monitor output (CONSOLE). // for brushless motors, study the sections (drivers, adapter, protection etc.) in the Wiki (https://wiki.ardumower.de/index.php?title=DIY_Brushless_Driver_Board) // #define MOTOR_DRIVER_BRUSHLESS 1 // uncomment this for new brushless motor drivers #define MOTOR_DRIVER_MIN_PWM 2 // set this to 0 if you use custom motor drivers and your motors do not stop spinning when stopped +#define MOWER_DRIVER_MIN_PWM 2 // set this to 0 if you use custom mower drivers and your motors do not stop spinning when stopped #define MOTOR_OVERLOAD_CURRENT 0.8 // gear motors overload current (amps) diff --git a/sunray/robot.cpp b/sunray/robot.cpp index 6f74540f7..eb3c70c87 100644 --- a/sunray/robot.cpp +++ b/sunray/robot.cpp @@ -57,7 +57,7 @@ MPU9250_DMP imu; SerialRainSensorDriver rainDriver(robotDriver); #else AmRobotDriver robotDriver; - AmMotorDriver motorDriver(MOTOR_DRIVER_MIN_PWM); + AmMotorDriver motorDriver(MOTOR_DRIVER_MIN_PWM, MOWER_DRIVER_MIN_PWM); AmBatteryDriver batteryDriver; AmBumperDriver bumper; AmStopButtonDriver stopButton; diff --git a/sunray/src/driver/AmRobotDriver.cpp b/sunray/src/driver/AmRobotDriver.cpp index babfdf246..13add5ec9 100644 --- a/sunray/src/driver/AmRobotDriver.cpp +++ b/sunray/src/driver/AmRobotDriver.cpp @@ -46,7 +46,7 @@ void OdometryRightISR(){ odomTicksRight++; } -AmMotorDriver::AmMotorDriver(int _minPwm) : minPwm(_minPwm) { +AmMotorDriver::AmMotorDriver(int _motorMinPwm, int _mowerMinPwm) : motorMinPwm(_motorMinPwm), mowerMinPwm(_mowerMinPwm) { } @@ -130,7 +130,7 @@ void AmMotorDriver::setMC33926(int pinDir, int pinPWM, int speed) { // PWM H Reverse // minPwm verhindert, dass das PWM Signal 0 wird. Manche Driver brauchen einen kurzen Impuls, um das PWM zu erkennen. // Wenn der z.B. vom max. PWM Wert auf 0 bzw. das Signal auf Low geht, behalten diese den vorherigen Wert bei und der Motor stoppt nicht. -void AmMotorDriver::setBrushless(int pinDir, int pinPWM, int speed) { +void AmMotorDriver::setBrushless(int pinDir, int pinPWM, int speed, int minPwm) { //DEBUGLN(speed); digitalWrite(pinDir, speed < 0 ? HIGH : LOW); pinMan.analogWrite(pinPWM, (byte) max(minPwm, abs(speed)) ); @@ -139,9 +139,9 @@ void AmMotorDriver::setBrushless(int pinDir, int pinPWM, int speed) { void AmMotorDriver::setMotorPwm(int leftPwm, int rightPwm, int mowPwm){ #ifdef MOTOR_DRIVER_BRUSHLESS - setBrushless(pinMotorLeftDir, pinMotorLeftPWM, leftPwm); - setBrushless(pinMotorRightDir, pinMotorRightPWM, rightPwm); - setBrushless(pinMotorMowDir, pinMotorMowPWM, mowPwm); + setBrushless(pinMotorLeftDir, pinMotorLeftPWM, leftPwm, motorMinPwm); + setBrushless(pinMotorRightDir, pinMotorRightPWM, rightPwm, motorMinPwm); + setBrushless(pinMotorMowDir, pinMotorMowPWM, mowPwm, mowerMinPwm); #else setMC33926(pinMotorLeftDir, pinMotorLeftPWM, leftPwm); setMC33926(pinMotorRightDir, pinMotorRightPWM, rightPwm); diff --git a/sunray/src/driver/AmRobotDriver.h b/sunray/src/driver/AmRobotDriver.h index 1b8d85636..bc5cbee8c 100644 --- a/sunray/src/driver/AmRobotDriver.h +++ b/sunray/src/driver/AmRobotDriver.h @@ -22,9 +22,10 @@ class AmRobotDriver { class AmMotorDriver: public MotorDriver { private: - int minPwm; + int motorMinPwm; + int mowerMinPwm; public: - AmMotorDriver(int _minPwm); + AmMotorDriver(int _motorMinPwm, int _mowerMinPwm); void begin() override; void run() override; void setMotorPwm(int leftPwm, int rightPwm, int mowPwm) override; @@ -34,7 +35,7 @@ class AmMotorDriver: public MotorDriver { void getMotorEncoderTicks(int &leftTicks, int &rightTicks, int &mowTicks) override; protected: void setMC33926(int pinDir, int pinPWM, int speed); - void setBrushless(int pinDir, int pinPWM, int speed); + void setBrushless(int pinDir, int pinPWM, int speed, int minPwm); }; class AmBatteryDriver : public BatteryDriver {