Index

Motor controllers

  1. BMSBattery S series
    1. BMSBattery S06S
      1. S06ST (torque sensor version)
      2. S06S-BL (Bluetooth version)
      3. PWM signals
        1. very low speed - 6 steps
        2. low speed up to max speed - sineware
      4. Phase B current signal
      5. Throttle
    2. BMSBattery S06SC
    3. BMSBattery S12S
      1. Programming header
      2. PWM signal at max speed - sineware
      3. Phase B and motor total current signals
    4. BMSBattery bottle battery controller
    5. LCD control panel
      1. LCD protocol
    6. Kunteng mobile app
    7. Bluetooh
      1. DIY Bluetooth module
    8. How to open the controller and solder the programming header
    9. Hardware mods
  2. Other controllers
    1. BMSBattery S06P
      1. various info
        1. 01
        2. 02
    2. Kunteng 18 mosfets motor controller
    3. Lishui motor controllers
      1. LSW-675
        1. Datasheets
        2. PWM signals
    4. JinHui motor controllers
  3. GreenEBikeKit

Motors

  1. BMSBattery Q75
  2. BMSBattery Q85
  3. BMSBattery Q100
  4. BMSBattery Q100C
  5. Tongsheng TSDZx mid drive motors

Development tools

  1. Linux
    1. Step-by-step tutorial development tools
      1. Hardware tools to flash and debug the firmware
      2. Tools to build the firmware
        1. stm8-binutils-gdb
      3. Tools to flash the firmware
        1. How to erase and unlock protected read memory
      4. (optional) Tools to debug the firmware
      5. (optional) Tools to debug using serial port
      6. (optional) Tools to see diffs on the source code
  2. Windows
  3. C library
  4. Other tools
    1. Battery voltage boost step-up converter

Motor control

  1. Torque speed
  2. Motor control scheme of S06S controller
  3. BLDC 6 steps
  4. PWM schemes
    1. So, Which PWM Technique is Best? (Part 1)
    2. So, Which PWM Technique is Best? (Part 2)
    3. So, Which PWM Technique is Best? (Part 3)
    4. So, Which PWM Technique is Best? (Part 4)
    5. So, Which PWM Technique is Best? (Part 5)
    6. So, Which PWM Technique is Best? (Part 6)
    7. So, Which PWM Technique is Best? (Part 7)
  5. PWM control and Dead Time Insertion
  6. Low inductance motors
  7. Throttle Control Modes
  8. Phase angle FOC
  9. PWM frequency VS motor eRPM
    1. Max motor speed using FOC
    2. Kelly controllers ultra high speed
  10. Sinusoidal Control of BLDCM with Hall Sensors Based
  11. Self-Learn Hall Sensor Calibration Mode
  12. STM8S105 Alternatives
  13. PID algorithm - negative output values
  14. Regeneration
    1. Regen in SimonK firmware
  15. FOC
    1. Shane Colton documentation and firmware
      1. Firmware
      2. Part 1: Field-Oriented
      3. Part 2: Field-Oriented
      4. Sensorless Pneu Scooter - part 1
      5. Sensorless Pneu Scooter - part 2
      6. Sensorless Pneu Scooter - part 3
      7. Observer
        1. Sensorless - 2011.04.10
        2. Sensorless - 2011.07.05

Datasheets and application notes

  1. STM8S105C6T6
    1. Interrupts
  2. Endless-sphere.com forum messages
    1. 2017.04.25 - Initial forum message
    2. 2017.05.08 - First flash and debug on a dev board
    3. 2017.05.18 - First code flashing and running
    4. 2017.05.20 - more new information
    5. 2017.08.23 - SxxP versus SxxS versus LSW-675
    6. 2017.09.01 - Trying to figure out an algorithm to automatically adjust ui8_position_correction_value
    7. 2017.09.02 - How to do FOC on the BMSBattery S06S/Kunteng STM8 motor controllers
    8. 2017.09.03 - more ideas about zero crossing for FOC
    9. 2017.09.05 - measuring IQ current and manually adjusting position_correction_value
    10. 2017.09.15 - our OpenSource firmware efficiency compared to Lishui 12 FET FOC
    11. 2017.09.19 - measuring motor current
    12. 2017.10.23 - FOC and no FOC comparison
    13. 2018.01.10 - How to measure FOC_READ_ID_CURRENT_ANGLE_ADJUST
    14. 2018.02.20 - Reading motor phase current from the DC link current (shunt)

Torque sensors

  1. BMSBattery torque sensor

Various

  1. STM8S003 board
  2. 2017.12.01 - Regen ebrake like coast brakes
  3. BEMF

Clipping

  1. 2017.05.22 - Hackaday Links: May 21, 2017

Smart BMS with bluetooth

PID algorithm - negative output values

http://forum.arduino.cc/index.php?topic=297543.0

PID: should negative error [1] decrease PWM-value or [2] reverse motor direction
Feb 03, 2015, 09:02 pm


The procedure that drives my motors accepts positive and negative inputs [-100, +100].
The sign determines the direction of the motor, the number the speed.


if (motorSpeed >= 0)
{
digitalWrite(m1In1, HIGH); // Forward
digitalWrite(m1In2, LOW);
}
else
{
digitalWrite(m1In1, LOW); // Backward
digitalWrite(m1In2, HIGH);

I use the number to calculate the desired time between the pulses of the wheel encoder (=set point).

The error is the difference between set point and the encoder reading (m1Pulse)

error = (long)desiredPulse -(long)m1Pulse;


My PID-code is as follows:

Kp = 50;
Ki = 0;
Kd = 0;

m1Pwm = Kp * error / 100; // m1Pwm is Pwm value of motor #1
m1Pwm += Ki * sumError / 100;
m1Pwm += Kd * (error - lastError) / 100;

lastError = error; // set the last and sumerrors for next loop iteration
sumError += error;


if (m1Pwm > 255) { m1Pwm = 255;}
if (m1Pwm <= 0) {m1Pwm 0;}
analogWrite(m1D2,m1Pwm);


The error signal can be positive or negative.
If the error is positive it's the speed goes step by step towards set point => ok
But if the error is negative the Pwm-signal equals 0 => no smooth operation

Question: what to do with negative error values?

1)
Decrease pwm-value gradually (if yes, how?)

I tried the following (no satisfactory results)

if (m1Pwm > 127) { m1Pwm = 127;}
if (m1Pwm < -127) {m1Pwm = -127;}
m1Pwm = 127 - m1Pwm;
analogWrite(m1D2,abs(m1Pwm));


2)
Reverse motor direction and apply the abs value of the error as Pwm-value (breaking on the motor)?
MarkT
images/116-1.png
images/116-2.pngimages/116-3.pngimages/116-4.pngimages/116-5.pngimages/116-6.png
• Brattain Member
• Posts: 26,758
• Karma: 1305 [add]
• Arduino rocks
images/116-7.pngRe: PID: should negative error [1] decrease PWM-value or [2] reverse motor direction#1
Feb 03, 2015, 11:47 pm


The output of the PID is a signed value that should be passed to a routine that can drive
the motor either direction according to the sign.

You mention using the number to set the desired time between encoder pulses - that's
wrong, you want the input number to set the frequency of pulses, thats proportional to speed.[ I will NOT respond to personal messages, I WILL delete them, use the forum please ]

kegde


• Guest
images/116-8.pngRe: PID: should negative error [1] decrease PWM-value or [2] reverse motor direction#2
Feb 04, 2015, 09:44 am


I will adapt the code to work with pulse frequency, that's a good point, thnx.

I still don't understand the conversion form the signed PID-value to the motor drive comand. In see it this way (but I am not sure if that's ok):

1)
the direction stays the same;
positive PID => increase Pwm
negative PID => decrease Pwm
Pseudo implementation:
Pwm = Pwm + PID // adjust value
If Pwm > 255 Then Pwm = 255
If Pwm <=0 Then Pwm = 0;
I experimented with this implementation => bad and jitttery results (maybe because I worked withe pulse time in stead of frequency)

2)
I also experimented with:
Pwm = PID
If Pwm > 255 Then Pwm = 255
If Pwm <=0 Then Pwm = 0;
Better results, but great spread @ Pwm-values (if error is negave => Pwm = 0 => next Pwm value verry high +250).

3)
And I tried:
If error changes sign Then Reverse Motor direction
Pwm = abs (PID) [0-255]
Poor, jittery results.

Is option 1) indeed the way to go?
Or should I go for option 2) or 3)?
Or something else?

MarkT
images/116-9.png
images/116-10.pngimages/116-11.pngimages/116-12.pngimages/116-13.pngimages/116-14.png
• Brattain Member
• Posts: 26,758
• Karma: 1305 [add]
• Arduino rocks
images/116-15.pngRe: PID: should negative error [1] decrease PWM-value or [2] reverse motor direction#3
Feb 04, 2015, 02:02 pm

Last Edit: Feb 04, 2015, 02:03 pm by MarkT



In general 3) is the way to go. You must have fast-decay mode (synchronous rectification) on
the H-bridge for servo drive like this, otherwise the system is highly non-linear as a whole.

The jitter you may be seeing is the PID actually working. Such jitter can arise
from noise in the sensing system or in having the gain too high (oscillation is
also caused by this).

Your input to the PID algorithm must be a speed, not a pulse-time, since that's the
reciprocal of speed (again that's a highly non-linear system, avoid like the plague).