yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
L-Type Motor📖
1.About motor
  • About motor
2.ROS robot control board drive
  • 0. Notes (Must read!!)
  • 1. Control motor
  • 2. Timer captures encoder data
  • 3. PID control robot car
  • 4. Kinematic Analysis-Mecanum wheel structure
  • 5. Kinematic Analysis-Ackerman structure
  • 6. Kinematic Analysis-4WD structure
3.STM32 board car tutorials
0. Notes (Must read!!)
  • Notes
1. Get started quickly
  • 0. Installation Instructions
  • 1. Version configuration
  • 2. Smart car installation video
  • 3. Precautions for use
2. Introduction to STM32 development board
  • 0. Notes (must read)
  • 1. Learn about STM32
  • 2. Introduction to STM32 development board
  • 3. Development board pin assignment
  • 4. Introduction to HAL library and LL library
3. Setting up and using the development environment
  • 1. Common development tools
  • 2. STM32CubeMX Install - Use
  • 3. STM32CubeIDE Install - Use
  • 4. Common Driver Installation
  • 5. Program download and simulation
  • 6. Engineering experience and migration
4. Car expansion tutorial
  • 1. Servo control
  • 2. Basic use of ultrasonic steering gear gimbal
  • 3. Motor control
  • 4. OLED display light sensitivity value
  • 5. Infrared sensor
  • 6. Four-way tracking module
  • 7. Infrared remote control
  • 8. Ultrasonic ranging
  • 9. PS2 controller test
  • 10. Car line patrol
  • 11. Ultrasonic follow
  • 12. Ultrasonic obstacle avoidance
  • 13. Ultrasonic obstacle avoidance (servo gimbal version)
  • 14. Infrared sensor obstacle avoidance
  • 15. Infrared remote control
  • 16. PS2 handle remote control
4. 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
5. 4-channel motor drive module
Introduction and Debug
  • 1.Introduction to 4-channel motor drive board
  • 2. Control command
  • 3. 520 motor introduction and usage
  • 4. PC host
IIC communication
  • For MSPM0G3507
  • For MSPM0G3519new
  • For STM32
  • For ESP32
  • For Arduino
  • For PICO2
  • For Jetson NANO
  • For RPi5
  • For RDK X5
USART communication
  • For MSPM0G3507
  • For MSPM0G3519new
  • For STM32
  • For ESP32
  • For Arduino
  • For PICO2
  • For Jetson NANO
  • For RPi5
  • For RDK X5
Download
  • 3D-Model-File
  • Code
Download ZIP

Welcome to L-Type Motor repository

1.AT8236 drive tutorials

AT8236 drive tutorials

I. Learning Objectives

Read the motor encoder data.

II. Hardware Connection

MSPM0G3519 and AT8236 pin connection

image-20241210105955329

L1 motor:

MSPM0G3519AT8236
PA12AIN1
PA13AIN2
PA14E1A
PA15E1B

L2 motor:

MSPM0G3519AT8236
PA26BIN1
PA27BIN2
PA24E2A
PA25E2B

Note: You can use the ttl module, or just use the Type-C port of the MSPM0G3519 to connect to the computer.

AT8236 motor driver module pin description:

2

III. Program Description

This example sets the baud rate of the serial port printing to 115200 bps.

  • bsp_at8236.h

​x
#ifndef __BSP_TB6612_H_
#define __BSP_TB6612_H_

#include "ti_msp_dl_config.h"


void init_motor(void);

void L1_control(uint16_t motor_speed,uint8_t dir);
void L2_control(uint16_t motor_speed,uint8_t dir);
void R1_control(uint16_t motor_speed,uint8_t dir);
void R2_control(uint16_t motor_speed,uint8_t dir);

#endif

Define four motor control functions.

  • bsp_at8236.c

xxxxxxxxxx
void L1_control(uint16_t motor_speed,uint8_t dir)
{
    if(dir)
    {
            DL_TimerA_setCaptureCompareValue(PWM_L1_INST, motor_speed, DL_TIMER_CC_0_INDEX);
            DL_TimerA_setCaptureCompareValue(PWM_L1_INST, 0, DL_TIMER_CC_1_INDEX);
    }
    else
    {
            DL_TimerA_setCaptureCompareValue(PWM_L1_INST, 0, DL_TIMER_CC_0_INDEX);
            DL_TimerA_setCaptureCompareValue(PWM_L1_INST, motor_speed, DL_TIMER_CC_1_INDEX);
    }

}

The L1_control function is used to control the speed and direction of the L1 motor by adjusting the duty cycle of the PWM signal.

motor_speed and dir represent the motor speed and motor direction of the motor respectively.

  • bsp_delay.h

xxxxxxxxxx
#ifndef __BSP_DELAY_H_
#define __BSP_DELAY_H_


#include "ti_msp_dl_config.h"

void delay_ms(unsigned int ms);

#endif

Define a delay function delay_ms

  • bsp_delay.c

xxxxxxxxxx
#include "bsp_delay.h"
#include "ti_msp_dl_config.h"

volatile unsigned int delay_times = 0;

volatile unsigned int getspeed = 10;//Get speed flag, read once every 10ms

extern volatile int32_t gEncoderCount_L1,gEncoderCount_L2;
extern int speed,speed2;

//Accurate ms delay implemented with the SysTick timer
void delay_ms(unsigned int ms)//1ms timing
{
    delay_times = ms;
    while( delay_times != 0 );
}


//SysTick timer interrupt service function
void SysTick_Handler(void)
{
    if( delay_times != 0 )
    {
        delay_times--;
    }
        
         if( getspeed != 0 )
        {
                getspeed--;
        }
        else
        {
            getspeed = 10;
            speed = gEncoderCount_L1;
            speed2 = gEncoderCount_L2;
            gEncoderCount_L1 = 0;//clear to 0
            gEncoderCount_L2 = 0;//clear to 0
        }
        
        
}

It processes the counts of two encoders (L1 and L2) and updates their speed measurements every 10 milliseconds.

  • bsp_enconder.c

xxxxxxxxxx
void GROUP1_IRQHandler(void)
{
    //Get interrupt signal
    gpioA = DL_GPIO_getEnabledInterruptStatus(GPIOA,
    L1_Enconder_A_pin_14_PIN | L1_Enconder_B_pin_15_PIN|
        L2_Enconder_A_pin_24_PIN|L2_Enconder_B_pin_25_PIN);
 
    //If the interrupt is generated by GPIO_EncoderA_PIN_0_PIN
    if((gpioA & L1_Enconder_A_pin_14_PIN) == L1_Enconder_A_pin_14_PIN)
    {
        //Pin14 rising edge, check Pin15 level: low means reverse rotation, high means forward rotation
        if(!DL_GPIO_readPins(GPIOA,L1_Enconder_B_pin_15_PIN))//P15 is low
        {
            gEncoderCount_L1--;
        }
        else//P15 is high
        {
            gEncoderCount_L1++;
        }
    }
    
    else if((gpioA & L1_Enconder_B_pin_15_PIN) == L1_Enconder_B_pin_15_PIN)
    {
        //Pin15 rising edge
        if(!DL_GPIO_readPins(GPIOA,L1_Enconder_A_pin_14_PIN))//P14 is low
        {
            gEncoderCount_L1++;
        }
        else//P14 is high
        {
            gEncoderCount_L1--;
        }
    }

Used to handle encoder interrupts, read and update encoder data.

  • bsp_usart.h

xxxxxxxxxx
#ifndef __BSP_USART_H_
#define __BSP_USART_H_

#include "ti_msp_dl_config.h"
#include "bsp_delay.h"

void uart0_send_char(char ch);
void uart0_send_string(char* str);

#endif

A header file for serial communication is defined, which is mainly used to implement simple character and string sending functions.

  • bsp_usart.c

xxxxxxxxxx
//Send a single character via serial port
void uart0_send_char(char ch)
{
    //Wait while serial port 0 is busy; send the character when it is free
    while( DL_UART_isBusy(MYUART_INST) == true );
    //Send a single character
    DL_UART_Main_transmitData(MYUART_INST, ch);
}
//Send a string via serial port
void uart0_send_string(char* str)
{
    //Current string address is not at the end and the string start address is not null
    while(*str!=0&&str!=0)
    {
        //Send the character at the string start address, and increment the start address after sending
        uart0_send_char(*str++);
    }
}


//Serial port interrupt service function
void MYUART_INST_IRQHandler(void)
{
    //If a serial port interrupt occurs
    switch( DL_UART_getPendingInterrupt(MYUART_INST) )
    {
        case DL_UART_IIDX_RX://If it is a receive interrupt
            //Save the received data into a variable
            uart_data = DL_UART_Main_receiveData(MYUART_INST);
            //Send the saved data back out
            uart0_send_char(uart_data);
            break;

        default://Other serial port interrupts
            break;
    }
}

Use USART for serial communication. Includes the functions of sending single characters, sending strings, and a USART interrupt service routine.

  • main.c

xxxxxxxxxx
int main(void)
{
    SYSCFG_DL_init();
    
     //Clear the serial port interrupt flag
    NVIC_ClearPendingIRQ(MYUART_INST_INT_IRQN);
    //Enable the serial port interrupt
    NVIC_EnableIRQ(MYUART_INST_INT_IRQN);
//  
        NVIC_EnableIRQ(GPIO_MULTIPLE_GPIOA_INT_IRQN);//Enable external interrupt
        init_motor();//Start the motor timer
    
    while (1) 
    {    
            sprintf(buf,"speed1(10ms):%d\t speed2(10ms):%d\r\n",speed,speed2);
            uart0_send_string(buf);
            
            L1_control(600,0);//0-1000 
            L2_control(400,1);//0-1000 
            
            delay_ms(300);
            
       
    }
} 

Continuously update the speed of the two motors, and set the speed and direction of motors L1 and L2 respectively through the L1_control and L2_control functions. Use the sprintf function to format a message that contains the current speed information of the two motors, and send this message through the uart0_send_string function to monitor or record the status of the motors.

Note: The project source code must be placed in the SDK path for compilation,

For example, path: D:\TI\M0_SDK\mspm0_sdk_1_30_00_03\1.TB6612

4

TB6612 drive tutorials
TB6612 drive tutorials

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