前言
本篇文章正式带大家学习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
总结
本篇文章就介绍到这里,大家有什么问题可以留言或者私信。