STM32 2轮PID智能小车第一章驱动电机让小车动起来

举报
yd_274589494 发表于 2023/07/25 11:31:07 2023/07/25
【摘要】 @TOC 前言本篇文章正式带大家学习STM32智能小车。这篇文章先带大家了解一下如何让小车动起来。 一、LM298N1.LM298N模块接线原理图。根据下图可知一个LM298N可以控制两个电机模块。12V输入需要接入电源,电源地接GND。单片机IO口接到STM32的GPIO口。2.LM298N和STM32接线图及LM298N和电机接线图将电机接到LM298N上,LM298N接到STM32上,...

@TOC


前言

本篇文章正式带大家学习STM32智能小车。这篇文章先带大家了解一下如何让小车动起来。

一、LM298N

1.LM298N模块接线原理图。
根据下图可知一个LM298N可以控制两个电机模块。
12V输入需要接入电源,电源地接GND。单片机IO口接到STM32的GPIO口。
在这里插入图片描述
2.LM298N和STM32接线图及LM298N和电机接线图
将电机接到LM298N上,LM298N接到STM32上,通过STM32控制控制GPIO引脚的电平高低驱动电机转动。
在这里插入图片描述

二、驱动电机模块

//硬件连接说明:
//PB0----PWMA 右电机PWM
//PB12----AIN2 控制右电机正反
//PB13----AIN1 控制右电机正反
//PB14----BIN1 控制左电机正反
//PB15----BIN2 控制左电机正反
//PB1----PWMB 左电机PWM
LM298N上面的ENA,ENB控制小车PWM调速,IN1,IN2,IN3,IN4控制电机的正转和反转。

电机的正转、反转、停转

1.首先实现电机的停转是最简单的只要将电机的两个GPIO口都设置为相同的电平。
代码:
停转

  HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);  
  HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);

2.电机正转和反转将两个GPIO口设置为不同电平即可
正转

  HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);  
  HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);

反转

  HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);  
  HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);

二、cubeMX配置

让小车动起来只需配置如下引脚。
在这里插入图片描述

三、程序代码编写

Moto.c

#include "Moto.h"

//小车模式定义
#define GO 0
#define Back 1
#define Stop 2

/*
函数功能:小车电机初始化
*/
void Moto_Iint(void)
{
    car_move(Stop);
}

/*
函数功能:左电机模式设置
Mode:模式选择 GO:前进 Back:后退 Stop:停止
*/
void Left_mode(char Mode)
{
  switch(Mode)
  {
    case GO:
    {
        BIN1_RESET();
        BIN2_SET();
    }
    break;
    case Back:
    {
        BIN2_RESET();
        BIN1_SET();        
    }
    break;
    case Stop:
    {
        BIN1_RESET();
        BIN2_RESET();
    }
    break;
  }
}

/*
函数功能:右电机模式设置
Mode:模式选择 GO:前进 Back:后退 Stop:停止
*/
void Rright_mode(char Mode)
{
  switch(Mode)
  {
    case GO:
    {
        AIN1_RESET();
        AIN2_SET();        
    }
    break;
    case Back:
    {
        AIN1_RESET();
        AIN2_SET();        
    }
    break;
    case Stop:
    {
        AIN1_RESET();
        AIN2_RESET();
    }
    break;
  }
}

/*
函数功能:小车移动
Mode:模式选择 GO:前进 Back:后退 Stop:停止
*/
void car_move(char Mode)
{
  switch(Mode)
  {
    case GO:
    {
        Left_mode(GO);
        Rright_mode(GO);
    }
    break;
    case Back:
    {
        Left_mode(Back);
        Rright_mode(Back);        
    }
    break;
    case Stop:
    {
        Left_mode(Stop);
        Rright_mode(Stop);        
    }
    break;
  }
}

Moto.h

#ifndef _MOTO_H_
#define _MOTO_H_


#include "main.h"

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

//电机IO定义

//右电机
#define AIN1_RESET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)
#define AIN1_SET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)

#define AIN2_RESET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET)
#define AIN2_SET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET)

//左电机
#define BIN1_RESET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET)
#define BIN1_SET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET)

#define BIN2_RESET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET)
#define BIN2_SET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET)



void Moto_Iint(void);
void car_move(char Mode);
void Left_mode(char Mode);
void Rright_mode(char Mode);


#endif

总结

本篇文章就介绍到这里,大家有什么问题可以留言或者私信。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。