yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Self-balancing Robot Car📖
00.Get started quickly
  • 01.Balance car manual
  • 02.Balancing car assembly
  • 03.Get started quickly
  • 04.Balance car interface description
  • 05.Common Problem Analysis
  • 06.Balance Car V2 Library Function Development Manual
01.Environment development
  • 01.MDK-ARM installation
  • 02.STM32CubeIDE installation
  • 03.Common driver installation
  • 04.Download the program
  • 05.MDK-ARM project usage
  • 06.Program simulation
  • 07. VSCode Installation
02.STM32 getting started course
  • 01.Project creation
  • 02.LED Control(GPIO)
  • 03.Buzzer control(GPIO)
  • 04.Button control(EXTI)
  • 05.Serial communication(USART)
  • 06.Voltage detection(ADC)
  • 07.Basic timer(TIM)
  • 08.Universal timer(TIM)
  • 09.Advanced Timer(TIM)
  • 10.I2C Communication(I2C)-OLED
  • 11.SPI communication(SPI)-2.4G handle
  • 12.Independent Watchdog (IWDG)
  • 13.Window Watchdog (WWDG)
  • 14.DMA-USART
  • 15.DMA-I2C
03.STM32 expansion course
  • 01.Battery voltage detection (ADC)
  • 02.Ultrasonic module-measuring distance (TIM)
  • 03.Motor drive+encoder (TIM)
  • 04.OLED Data-Display(I2C)
  • 05.MPU6050-Data Read (I2C)
  • 06.Bluetooth module-Data reading (USART)
  • 07.2.4G handle-Data reading (SPI)
  • 08.Tracking module-Read status (GPIO)
  • 09.CCD module-Reading data (ADC)
  • 10.Electromagnetic module-Reading data (ADC)
  • 11.K210 module-Serial communication (USART)
  • 12.Tmini-Plus lidar-Reading data (USART)
04.Robot car PID control course
  • 01.PID basic concept
  • 02.PID example analysis
  • 03.P, PI, PD controller theory
  • 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)
05.Robot car basic course
  • 01.Car parameter adjustment
  • 02.Ultrasonic obstacle avoidance
  • 03.Ultrasonic follow
  • 04.Bluetooth remote control
  • 05.Load balance
06.Robot car advanced course
  • 01.4-channel tracking
  • 02.4-channel tracking avoid
  • 03.2.4G handle control
  • 04.CCD tracking
  • 05.CCD tracking avoid
  • 06.Electromagnetic tracking
  • 07.K210-QR code recognition
  • 08.K210-Color line tracking
  • 09.K210-Color follow
  • 10.K210-Self learning
  • 11.K210-Number recognition
  • 12.Lidar avoid
  • 13.Lidar guard
  • 14.Lidar follow
  • 15.Lidar patrol
  • 16.Lidar wall tracking-straight line
  • 17.Lidar wall tracking-multiple walls
  • 18. DIY Automatic driving car
07.Robot car LQR control
  • Robot car LQR control
08.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
09.Mathematical model
  • Mathematical model
10.Expand course
  • Autonomous Driving
Download
  • APP(Android)
  • Codes
  • Hardware-Info
  • SCH
  • Software Tools
  • STM32_Chip_DataSheet
  • 3D_Model_File
  • Video_PPT
Download ZIP

Welcome to Self-balancing Robot Car repository

09.Advanced Timer(TIM)

Advanced Timer (TIM)

Advanced Timer (TIM)Hardware connectionControl principlePin definitionSoftware codeControl functionExperimental phenomenon

Tutorial demonstrating advanced timer (TIM8) PWM driving motor.

xxxxxxxxxx
The tutorial only introduces the standard library project code

Hardware connection

image-20240825203848090

Since we have configured a special connection line, we only need to install it to the corresponding interface:

PeripheralsDevelopment BoardDescription
Motor 1: M+ (M1A)PC6The PC6 pin of the development board controls the input pin of the motor driver chip, and the output pin of the driver chip controls motor 1: M+
Motor 1: M- (M1B)PC7The PC7 pin of the development board controls the input pin of the motor driver chip, and the output pin of the driver chip controls motor 1: M-
Motor 1: Encoder VCC3.3VConnect the development board 3.3V to power the encoder
Motor 1: Encoder GNDGNDConnect the development board GND to the encoder common ground
Motor 1: Encoder A phase (H1A)PA7Encoder A of motor 1 is connected to pin PA7 of the development board
Motor 1: Encoder B phase (H1B)PA6Encoder B of motor 1 is connected to pin PA6 of the development board
Motor 2: M+ (M2A)PC8The PC8 pin of the development board controls the input pin of the motor driver chip, and the output pin of the driver chip controls motor 2: M+
Motor 2: M- (M2B)PC9The PC9 pin of the development board controls the input pin of the motor driver chip, and the output pin of the driver chip controls motor 2: M-
Motor 2: Encoder VCC3.3VConnect the development board 3.3V to power the encoder
Motor 2: Encoder GNDGNDConnect the development board GNDV to the encoder common ground
Motor 2: Encoder A phase (H2A)PB7Encoder A of motor 2 is connected to pin PB7 of the development board
Motor 2: Encoder B phase (H2B)PB6Encoder B of motor 2 is connected to pin PB6 of the development board

Control principle

Use the PWM output function of TIM8 of the advanced timer on the STM32F103RCT6 development board to change the duty cycle of the PWM signal to control the speed of the motor rotation.

  • PWM (Pulse Width Modulation)

PWM is the abbreviation of pulse width modulation, which is a technology that controls the level by adjusting the pulse width of the signal.

Period: The duration of a complete PWM waveform;

Duty cycle: The ratio of the duration of the high level to the period time;

Frequency: The reciprocal of the period is called the frequency, that is, the number of PWM periods generated per second;

  • Advanced timer

Timer typeAdvanced timer
Timer nameTIM1, TIM8
Counter digits16
Counting modeIncremental/decremental/center alignment
Prescaler coefficient1-65536
Generate DMA requestYes
Capture/compare channel4
Complementary outputYes
Clock frequency72MHz (maximum)
Mount busAPB2

Pin definition

Main control chipPinMain function (after reset)Default multiplexing functionRedefine function
STM32F103RCT6PC6PC6I2S2_MCK/TIM8_CH1/SDIO_D6TIM3_CH1
STM32F103RCT6PC7PC7I2S3_MCK/TIM8_CH2/SDIO_D7TIM3_CH2
STM32F103RCT6PC8PC8TIM8_CH3/SDIO_D0TIM3_CH3
STM32F103RCT6PC9PC9TIM8_CH4/SDIO/D1TIM3_CH4

Software code

Since the default function of the pin is the normal IO pin function, we need to use the multiplexing function.

xxxxxxxxxx
Product supporting materials source code path: Attachment → Source code summary → 1.Base_Course → 9.Advanced_Timer

Control function

The tutorial only briefly introduces the code, you can open the project source code to read the details.

Balance_Motor_Init

xxxxxxxxxx
void Balance_Motor_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //Enable PC port clock
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //Port configuration
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //Push-pull output
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M
    GPIO_Init(GPIOC, &GPIO_InitStructure); //Initialize GPIOC according to the set parameters
}

Balance_PWM_Init

xxxxxxxxxx
void Balance_PWM_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
    TIM_DeInit(TIM8);
    TIM_TimeBaseStructure.TIM_Period = arr - 1; //Set the value of the auto-reload register period to load the activity at the next update event
    TIM_TimeBaseStructure.TIM_Prescaler = psc; //Set the prescaler value used as the divisor of the TIMx clock frequency. No division
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //Set the clock division: TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM up counting mode
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //Initialize the time base unit of TIMx according to the parameters specified in TIM_TimeBaseInitStruct

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Select timer mode: TIM pulse width modulation mode 1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //Comparison output enable
    TIM_OCInitStructure.TIM_Pulse = 0; //Set the pulse value to be loaded into the capture comparison register
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Output polarity: TIM output comparison polarity high

    TIM_OC1Init(TIM8, &TIM_OCInitStructure); //Initialize peripheral TIMx according to the parameters specified in TIM_OCInitStruct
    TIM_OC2Init(TIM8, &TIM_OCInitStructure); //Initialize peripheral TIMx according to the parameters specified in TIM_OCInitStruct
    TIM_OC3Init(TIM8, &TIM_OCInitStructure); //Initialize peripheral TIMx according to the parameters specified in TIM_OCInitStruct
    TIM_OC4Init(TIM8, &TIM_OCInitStructure); //Initialize peripheral TIMx according to the parameters specified in TIM_OCInitStruct

    TIM_CtrlPWMOutputs(TIM8,ENABLE); //MOE main output enable

    TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH1 preload enable
    TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH2 preload enable
    TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH3 preload enable
    TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH4 preload enable

    TIM_ARRPreloadConfig(TIM8, ENABLE); //Enable TIMx preload register on ARR

    /* TIM8 enable counter */
    TIM_Cmd(TIM8, ENABLE); //Enable timer 8
}

Set_Pwm

xxxxxxxxxx
void Set_Pwm(int motor_left,int motor_right)
{
    if(motor_left == 0)// stop
    {
        L_PWMA = 0;
        L_PWMB = 0;
    }
    if(motor_right == 0)
    {
        R_PWMA = 0;
        R_PWMB = 0;
    }
    //left wheel
  if(motor_left>0)   // forward  
    {
        L_PWMB = myabs(motor_left);
        L_PWMA = 0;
    }       
    else // backward
    {
        L_PWMB = 0;
        L_PWMA = myabs(motor_left);
    }
    //right wheel
    if(motor_right>0) // forward 
    {
        R_PWMA = myabs(motor_right);
        R_PWMB = 0;
    }
    else // backward
    {
        R_PWMA = 0;
        R_PWMB = myabs(motor_right);    
    }
}

myabs

int myabs(int a)
{          
    int temp;
    if(a<0)  temp=-a;  
    else temp=a; 
    return temp;
}

Experimental phenomenon

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

After the program is successfully downloaded: the two motors will continue to run according to the rule of moving forward for 2s, stopping for 1s, moving backward for 2s, and stopping for 1s.

When using the serial port debugging assistant, you need to pay attention to the serial port settings. If the settings are wrong, the phenomenon may be inconsistent
Universal timer(TIM)
I2C Communication(I2C)-OLED

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/中文