yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
520 Motor📖
1.About motor
  • About motor
2.ROS robot control board drive
  • 2.1 Control motor
  • 2.2 Timer captures encoder data
  • 2.3 PID control robot car
  • 2.4 Kinematic Analysis-Mecanum wheel structure
  • 2.5 Kinematic Analysis-Ackerman structure
  • 2.6 Kinematic Analysis-4WD structure
3.STM32 Self-balancing car tutorials
Get started quickly
  • 03.P, PI, PD controller theory
  • 01.Balancing car assembly
  • 02.Get started quicklyy
  • 03.Balance car interface description
  • 04.Common Problem Analysis
  • 05.Balance Car V2 Library Function Development Manual
Environment construction and development
  • 01.MDK-ARM installation
  • 02.STM32CubeIDE installation
  • 03.Common driver installation
  • 04.Download the program
  • 05.MDK-ARM project usage
  • 06.Program simulation
Robot car PID control course
  • 01.PID basic concept
  • 02.PID example analysis
  • 04.Position PID
  • 05.Incremental PID
  • 06.Cascade PID
  • 07.Balance principle of car
  • 08.Car upright control (PD)
  • 09.Car speed ​​control (PI)
  • 10.Car steering control (PD)
  • 11.Got angle and angular velocity (DMP algorithm)
  • 12.Got angle and angular velocity (Kalman filter algorithm)
  • 13.Got angle and angular velocity(Complementary filter algorithm)
Robot car basic course
  • 01.Car parameter adjustment
  • 02.Ultrasonic obstacle avoidance
  • 03.Ultrasonic follow
  • 04.Bluetooth remote control
  • 05.Load balance
Robot car LQR control
  • Robot car LQR control
Circuit design
  • 01.Overall circuit design
  • 02.STM32 minimum system
  • 03.Serial port circuit design
  • 04.Power circuit design
  • 05.MPU6050 Circuit Design
  • 06.Motor drive circuit design
Mathematical model
  • Balance car mathematical model
4.4-channel motor drive module
Introduction and Debug
  • 1.Introduction to 4-channel motor drive board
  • 2.Control command
  • 3.Motor introduction and usage
  • 4.PC host
IIC communication
  • For Arduino
  • For ESP32
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
USART communication
  • For Arduino
  • For ESP32
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
5.2-channel motor drive module
For MSPM0G3507
  • 1.AT8236 drive tutorials
  • 2.TB6612 drive tutorials
For MSPM0G3519
  • 1.AT8236 drive tutorialsnew
  • 2.TB6612 drive tutorialsnew
Download
  • Model File
  • Annex_ROS_robot_board
  • Annex_STM32_balancing_car
  • Annex_4channel_motor_drive
  • Annex_2channel_motor_drive
Download ZIP

Welcome to 520 Motor repository

06.Cascade PID

Cascade PID

Cascade PIDCascade PIDSingle-stage/cascade differenceSingle-stage PIDCascade PIDCode implementationSoftware codeExperimental phenomenon

Tutorial demonstrates cascade PID control of motor.

Cascade PID

Cascade PID: The output of the previous PID controller is used as the input of the next PID controller.

In cascade PID control, the speed loop is used as the inner loop and the position loop is used as the outer loop: the output of the position PID is used as the input of the speed PID, that is, the output of the position PID is used as the target value of the speed PID for control.

Example: Control the motor to reach a specified distance at a specified speed.

Single-stage/cascade difference

Single-stage PID

Position PID can make the motor run a specified number of turns, but the speed control during the movement is relatively poor.

Incremental PID can make the motor run at a specified speed, but does not directly control the position or angle of the motor.

The specified number of turns and speed can be converted through motor parameters and encoder count values

Cascade PID

Position PID can control the distance/number of turns of the motor, and incremental PID can control the speed of the motor.

PID inner loop: incremental PID

PID outer loop: position PID

Code implementation

The output of position PID is used as the input of speed PID, that is, the output of position PID is used as the target value of speed PID for control

​x
void TIM6_IRQHandler(void)
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //Check whether TIM update interrupt occurs
{
TIM_ClearITPendingBit(TIM6, TIM_IT_Update); //Clear TIMx update interrupt flag

Encoder_Left = Read_Encoder(MOTOR_ID_ML);
Encoder_Right = -Read_Encoder(MOTOR_ID_MR);

Position_L +=Encoder_Left;
Position_R +=Encoder_Right;

Position_Motor_L = Position_PID(Position_L,Target_Position);
Position_Motor_R = Position_PID(Position_R,Target_Position); motor_L = Incremental_PI(Encoder_Left,Position_Motor_L); motor_R = Incremental_PI(Encoder_Right,Position_Motor_R); motor_L = PWM_Ignore(motor_L); motor_R = PWM_Ignore(motor_R); motor_L = PWM_Limit(motor_L, 2500,-2500); motor_R = PWM_Limit(motor_R,2500,-2500); Set_Pwm(motor_L,motor_R); } } int Position_PID (int position,int target) { static float error,Pwm,Integral_error,Last_error; error=target-position; //Calculate deviation Integral_error+=error; //Calculate the integral of the deviation

Integral_error=PWM_Limit(Integral_error,Target_Velocity,-Target_Velocity); //Integral limit

Pwm=Position_KP*error+Position_KI*Integral_error+Position_KD*(error-Last_error); //Position PID controller

Last_error=error; //Save the last deviation

Pwm=PWM_Limit(Pwm,Target_Velocity,-Target_Velocity); //Position to incremental output limit

return Pwm; //Incremental output
}

int Incremental_PI (int Encoder,int Target)
{
static float error,Pwm,Last_error,Last_last_error;
error=Target-Encoder; //Calculate the deviation
Pwm+=Incremental_KP*(error-Last_error)+
Incremental_KI*error +
Incremental_KD*(error-2*Last_error+Last_last_error); //Incremental PID controller

Last_error=error; //Save the last deviation

Last_last_error = Last_error; //Save the last deviation

return Pwm; //Incremental output
}

Software code

Since the relevant peripheral driver tutorial has been introduced before, it will not be introduced here!

xxxxxxxxxx
Product supporting data source code path: Attachment → Source code summary → 3.PID_Course → 06.Contact_PID

Experimental phenomenon

The Contact_PID.hex file generated by the project compilation is located in the OBJ folder of the Contact_PID project. Find the Contact_PID.hex file corresponding to the project and use the FlyMcu software to download the program into it.

After the program is downloaded successfully: the motor will rotate to the preset encoder count value, the serial port will print the button status and motor speed and encoder value (corresponding to the distance the motor rotates), the button can switch the LED status and control the motor to run to the set pulse position and stop.

Note: Since each motor is different, the value printed by the serial port may be slightly different from the value set by the program; we can modify the Kp, Ki, Kd parameters in the program to make the encoding value as close to the value set by the program as possible.

image-20240812170440704

Incremental PID
Balance principle of car

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文