yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
310 Motor📖
1.Hardware parameter
  • Hardware parameter
2.ROS robot control board tutorials
  • 3.0 ReadMe
  • 3.1 Control motor
  • 3.2 Timer got encoder data
  • 3.3 PID control robot movement
  • 3.4 4WD Robot kinematics analysis
  • 3.5 Ackerman Robot kinematics analysis
  • 3.6 Mecanum wheel kinematics analysis
3.STM32 smart car tutorials
0. Get started quickly
  • 14.Infrared sensor obstacle avoidance
  • 0. Installation Instructions
  • 1. Version configuration
  • 2. Smart car installation video
  • 3. Precautions for use
1. Introduction to STM32 board
  • 1. Learn about STM32
  • 2. Introduction to STM32 development board
  • 3. Development board pin assignment
  • 4. Introduction to HAL library and LL library
2. 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
3. Car expansion tutorial
  • 1.Servo control
  • 2.Basic use ultrasonic servo PTZ
  • 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 PTZ version)
  • 15.Infrared remote control
  • 16.PS2 handle remote control
4.2-channel motor drive module tutorial
  • 2.1 Introduction of Module
  • 2.2 For STM32
  • 2.3 For Arduino
  • 2.4 For RaspberryPi
  • 2.5 For RaspberryPi Pico
  • 2.6 For jetson nano
  • 2.7 For MSPM0G3507
  • 2.8 For MSPM0G3519new
5.4-channel motor drive tutorials
Introduction and debugging
  • 0.Motor introduction and usage
  • 1.Introduction to 4-channel motor drive board
  • 2.Control command
  • 3.PC host
USART communication
  • For Arduino
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
IIC communication
  • For Arduino
  • For ESP32
  • For ESP32
  • For Jetson NANO
  • For MSPM0G3507
  • For MSPM0G3519new
  • For PICO2
  • For RDK X5
  • For RPi5
  • For STM32
Download
  • Motor_3D_Model_File
  • Annex_ROSRobotControlBoard
  • Annex_STM3RobotCar
  • Annex_2-channelMotorDriveModule
  • Annex_4-channelMotorDriveModule
Download ZIP

Welcome to 310 Motor repository

2.8 For MSPM0G3519

Got encoder data

I. Learning Objectives

Read the motor encoder data.

II. Hardware Connection

MSPM0G3519 and AT8236 pin connection

image-20241210113356046

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.

3

  • 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, the path: D:\TI\M0_SDK\mspm0_sdk_1_30_00_03\1.TB6612

4

For MSPM0G3507
Motor introduction and usage

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