slamugv小车使用说明--3.直流有刷电机正反转控制

直流有刷电机正反转控制
首先我们得了解电机的种类
![在这里插入图片描述]slamugv小车使用说明--3.直流有刷电机正反转控制_第1张图片
我们这个小项目用的是12v直流减速电机,减速比是30 的
1.电机正反转 cube配置教程
第一次使用会详细讲解怎么配置,以后的一些基础配置,就不重复说明了。
首先选用stm32f407ZGT6
slamugv小车使用说明--3.直流有刷电机正反转控制_第2张图片
选定需要设置的pin脚会出现下图所示
slamugv小车使用说明--3.直流有刷电机正反转控制_第3张图片
PA10在这个项目中是用来做正反转控制赋予高低电平的,是输出引脚,所以我们把PA10设置为GPIO_OUTPUT,下图所示
slamugv小车使用说明--3.直流有刷电机正反转控制_第4张图片
工具选择:MDK-ARM
slamugv小车使用说明--3.直流有刷电机正反转控制_第5张图片
代码.c和.h文件分开
slamugv小车使用说明--3.直流有刷电机正反转控制_第6张图片
生成代码
在这里插入图片描述

GPIO的端口常用的模式有以下几种:
1.输入浮空
2.输入上拉
3.输入下拉
4.模拟输入模式
5.具有上拉或下拉的功能的开漏输出
6.具有上拉或下拉的功能的推挽输出
7.具有上拉或下拉的功能的复用功能推挽
8.具有上拉或下拉的功能的复用功能开漏
手册里写的太繁琐了,我就用通俗的语言来描述一下,上面几种模式的用处
1.输入浮空,顾名思义,就是悬浮在空中,不上拉,不下拉,如果没有接外围设备,其电平是不确定的
2.输入上拉,电压输入=数字地,并且有30~50欧姆的电阻
3.输入下拉,电压输入=数字电源,并且有30~50欧姆的电阻
4.模拟功能,当stm32进行AD(模数)转换时,需要将端口设置为模拟输入模式,该模式需要配合ADC外设使用,否则没有意义
5.开漏输出,通用输出是普通用途的输出模式,GPIO是由一个PMOS管和NMOS管组合的反相器驱动,开漏电路中的“漏”是指MOS管的漏极(D),实际只用到NMOS管
6.推挽输出,推挽输出具有驱动能力,GPIO是由一个PMOS管和NMOS管组合的反相器驱动,开漏电路中的“漏”是指MOS管的漏极(D),实际只用到NMOS管
7.复用推挽,就是在开漏输出的模式下加了复用功能
8.复用开漏,就是在推挽输出的模式下加了复用功能
关键代码解读:
typedef struct
{
uint32_t Pin; /GPIO引脚选择
uint32_t Mode; / GPIO引脚模式
uint32_t Pull; / GPIO 引脚上,下拉配置
uint32_t Speed; / GPIO 引脚最大输出速度
uint32_t Alternate; / GPIO 引脚复用
}GPIO_InitTypeDef;

***这是C语言结构体的定义,如果不熟悉请自行翻阅资料
GPIO编程流程分析

  1. GPIO端口时钟
  2. 初始化GPIO引脚(为结构体成员赋值,然后调用HAL_GPIO_Init函数完成初始化设置
  3. 根据项目要求控制引脚输出高低电平

//引脚初始化
void MX_GPIO_Init(void)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
//等同于GPIO_InitTypeDef GPIO_ InitStruct;

/* GPIO Ports Clock Enable /
__HAL_RCC_GPIOA_CLK_ENABLE();
//因为我们要是用GPIOA_10,所以我们要使能GPIOA时钟
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
//PA10 电平拉低
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void HAL_GPIO_WritePin(GPIO_TypeDef
GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));

if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
}
HAL_GPIO_WritePin函数有三个形参,第一个为GPIO_TypeDef类似指针变量,用于指定端口,如GPIOA.GPIOB…….GPIOI 赋值,第二个为GPIO_Pin,指定引脚,如GPIO_PIN_0 ,GPIO_PIN_1 ………GPIO_PIN_15 赋值;第三个为引脚状态,可用GPIO_PIN_SET或者GPIO_PIN_RESET赋值,分别对应指定引脚输出高低电平。

电机正反转控制就是通过两个引脚的电平的控制,下一步就是通过pwm控制电机的速度

你可能感兴趣的:(slamugv,单片机)