yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Motor with Encoder📖
1.Introduction
  • 1.Introduction
2.2-channel motor drive module tutorials
For Arduino
  • 1.AT8236 drive tutorials
For STM32
  • 1.AT8236 drive tutorials
For MSPM0G3507
  • 1.AT8236 drive tutorials
  • 2.TB6612 drive tutorials
For MSPM0G3519
  • 1.AT8236 drive tutorialsnew
  • 2.TB6612 drive tutorialsnew
3.4-channel motor drive module tutorials
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
Download
  • Annex_2-channel motor drive module tutorials
  • Annex_4-channel motor drive module tutorials
Download ZIP

Welcome to Motor with Encoder 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
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文