1.项目简介及材料
a.主要功能
通过oled和按键做了一个小菜单,按键控制小车的两种模式,详细代码我已经上传到了优快云,点我主页免费下载工程文件(免费)。欢迎各位大佬加我QQ2703867620讨论技术和指正我的错误,如果有新手有疑惑看不懂的也欢迎加我Q讨论。
为了方便移植修改引脚,我把引脚封装在了.h头文件里面了。
b.使用材料
4个麦轮+4个联轴器+4个TT电机
1个底板(网上有,也可以自己3D打印)
2对锂电池和降压器(7号5号干电池都可以,能输出7-12V都可以)
2个L298N驱动模块
1个oled屏幕
避障和循迹模块(网上一般都是10元以内,还包邮)
1个stm32板子(都可以,我把引脚封装在了.h头文件里面了,方便移植修改引脚)
若干字母线和按键
2.L298N驱动模块
每个L298N驱动模块可以独立驱动2个轮子,本项目为四麦轮使用使用2个L298N驱动模块,界限情况如下:
其中第一个L298N驱动模块接电源正极7V供电,此时另一个接单片机5.5V给单片机供电,GNG接单片机GND和带电源负极。另一个L298N驱动模块不需要接单片机。其中供电的电源我选择的是锂电池,然后在网上购买了一个变压器,可以调节输出电压(这里在7-12V都可以)
因为本项目需要使用pwm调速,所以要将L298N驱动模块的跳线帽拔掉接入单片机的通用计时器口(我使用的是tim3)
3.麦克纳姆轮
麦轮我采用的是ABBA的安装方式(请注意安装方式,会影响后续的程序调试,麦轮的具体原理可在B站抖音搜索麦克纳姆轮会有详细讲解,我就不再赘述了)
4.代码讲解(完整的工程文件我已经上传,在我上一篇博客下载免费,为了方便使用不同的板子移植我把GPIO口在.h头文件里面进行了封装)
a.电机驱动.c文件
void motor_init()
初始化四个轮子对应的8个GPIO口
void pwm_init()
初始化通用计时器使能PWM的4个通道(我选择的是TIM3,这里不懂的私我QQ2703867620)
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
回调函数(使能复用功能,开启通用计时器)
void motor_go(uint16_t speed)
目录
2.代码讲解(完整的工程文件我已经上传,在我上一篇博客下载免费,为了方便使用不同的板子移植我把GPIO口在.h头文件里面进行了封装)
void motor_right(uint16_t speed) 同上
void motor_left(uint16_t speed) 同上
void motor_back(uint16_t speed) 同上
c.oled部分代码和按键控制代码(使用状态机,不堵塞程序)
给GPIO口写入高低电平,使轮子转起来(传入速度参数,改变PWM占空比,控制速度)
void motor_right(uint16_t speed) 同上
void motor_left(uint16_t speed) 同上
void motor_back(uint16_t speed) 同上
void motor_stop() 同上
#include "./BSP/motor/motor.h"
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
TIM_HandleTypeDef tim3;
void motor_init()
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOF_CLK_ENABLE();
gpio_init_struct.Pin = motor_pin_IN_all;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(motor_gpio_IN, &gpio_init_struct);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_IN_all, GPIO_PIN_RESET);
}
void pwm_init()
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
tim3.Instance = TIM3;
tim3.Init.Prescaler = 36 - 1;
tim3.Init.CounterMode = TIM_COUNTERMODE_UP;
tim3.Init.Period = 100 - 1;
tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&tim3);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&tim3, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&tim3, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_ConfigChannel(&tim3, &sConfigOC, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&tim3,TIM_CHANNEL_4);
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM3)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM3_CLK_ENABLE();
gpio_init_struct.Pin = motor_pin_pwm1_ENA|motor_pin_pwm1_ENB;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ÍÆÍ츴Óà */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
HAL_GPIO_Init(motor_gpio_pwm1, &gpio_init_struct);
gpio_init_struct.Pin = motor_pin_pwm2_ENA|motor_pin_pwm2_ENB;
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* ÍÆÍ츴Óà */
gpio_init_struct.Pull = GPIO_PULLUP; /* ÉÏÀ */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* ¸ßËÙ */
HAL_GPIO_Init(motor_gpio_pwm2, &gpio_init_struct);
__HAL_RCC_AFIO_CLK_ENABLE();
}
}
void motor_go(uint16_t speed)
{
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}
void motor_right(uint16_t speed)
{
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}
void motor_left(uint16_t speed)
{
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}
void motor_back(uint16_t speed)
{
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_SET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, speed);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, speed);
}
void motor_stop()
{
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right1_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_left2_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(motor_gpio_IN, motor_pin_right2_2, GPIO_PIN_RESET);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_1, 0);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_2, 0);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_3, 0);
__HAL_TIM_SET_COMPARE(&tim3, TIM_CHANNEL_4, 0);
}
b.循迹模块.c文件
void xunji_init()
初始化循迹模块的两个GPIO口(启用为输入模式)
void xunji_control()
根据循迹模块输入信号,调用电机函数。
如果前面有路,循迹模块会在对应的GPIO口输入高电平即1。
如果前面无路,循迹模块会在对应的GPIO口输入低电平即0。
#define xunji_right HAL_GPIO_ReadPin(xunji_gpio, xunji_pin_right)
#define xunji_left HAL_GPIO_ReadPin(xunji_gpio, xunji_pin_left)
其中输入信号的在.h头文件里进行了如上封装(读取GPIO口输入高低电平)
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/xunji/xunji.h"
#include "./BSP/motor/motor.h"
#include "./BSP/weideng/weideng.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/oled/oled1.h"
void xunji_init()
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOD_CLK_ENABLE();
gpio_init_struct.Pin = xunji_pin_right|xunji_pin_left;
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(xunji_gpio, &gpio_init_struct);
}
void xunji_control()
{
if(xunji_right == 1 && xunji_left == 1)
{
oled_go();
motor_go(100);
weideng_of();
}
if(xunji_right == 1 && xunji_left == 0)
{
oled_right();
motor_right(80);
weideng_of();
}
if(xunji_right == 0 && xunji_left == 1)
{
oled_left();
motor_left(80);
weideng_of();
}
if(xunji_right == 0 && xunji_left == 0)
{
oled_stop();
motor_stop();
weideng_on();
}
}
注意:oled的对应程序在后面介绍。尾灯是我的附加模块,也在后面介绍
b.避障模块
void bizhang_init()
初始化避障模块的两个GPIO口(启用为输入模式)
void bizhang_control()
根据避障模块输入信号,调用电机函数。
如果前面无障碍物,循迹模块会在对应的GPIO口输入高电平即1。
如果前面有障碍物,循迹模块会在对应的GPIO口输入低电平即0。
#define bizhang_right HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_6)
#define bizhang_left HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1)
其中输入信号的在.h头文件里进行了如上封装(读取GPIO口输入高低电平)
#include "./BSP/bizhang/bizhang.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/motor/motor.h"
#include "./BSP/weideng/weideng.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/oled/oled1.h"
void bizhang_init()
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOE_CLK_ENABLE();
gpio_init_struct.Pin = E_bizhang_pin_right;
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &gpio_init_struct);
gpio_init_struct.Pin = F_bizhang_pin_left;
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOE, &gpio_init_struct);
}
void bizhang_control()
{
if(bizhang_right == 1 && bizhang_left == 1)
{
oled_go();
motor_go(100);
weideng_of();
}
if(bizhang_right == 1 && bizhang_left == 0)
{
oled_right();
motor_right(80);
weideng_of();
}
if(bizhang_right == 0 && bizhang_left == 1)
{
oled_left();
motor_left(80);
weideng_of();
}
if(bizhang_right == 0 && bizhang_left == 0)
{
oled_stop();
motor_stop();
weideng_on();
}
}
c.oled部分代码和按键控制代码(使用状态机,不堵塞程序)
oled的配置代码我是移植的江科大的。但他是标准库,使用我根据自己的理解将其改成了HAL库,可以正常使用,详细代码见我上一个博客,其中oled取模我使用的是PCtoLCD2002.exe软件,如下,如果想要这个软件的下载方式的私信我或者加我QQ2703867620免费。
以下是我的key.c文件
里面的代码逻辑我将单独创建一个博客讲解我的按键实现逻辑
#include "./BSP/key/key.h"
#include "./BSP/weideng/weideng.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./BSP/xunji/xunji.h"
#include "./BSP/bizhang/bizhang.h"
#include "./BSP/motor/motor.h"
TIM_HandleTypeDef tim6;
void key0_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOE_CLK_ENABLE();
gpio_init_struct.Pin = key0_pin;
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(key0_gpio, &gpio_init_struct);
gpio_init_struct.Pin = key1_pin;
gpio_init_struct.Mode = GPIO_MODE_INPUT;
gpio_init_struct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(key0_gpio, &gpio_init_struct);
}
void tim2_init()
{
tim6.Instance = TIM6;
tim6.Init.Prescaler = 71;
tim6.Init.Period = 999;
HAL_TIM_Base_Init(&tim6);
HAL_TIM_Base_Start_IT(&tim6);
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM6)
{
__HAL_RCC_TIM6_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM6_IRQn);
}
}
void TIM6_IRQHandler(void)
{
HAL_TIM_IRQHandler(&tim6);
}
uint8_t key0_flag = 0;
uint8_t key0_count = 1;
uint8_t key1_flag = 0;
uint8_t key1_count = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM6)
{
if(key0_read == 1 && key0_flag == 0)
{
key0_count++;
if(key0_count == 3) key0_count = 1;
key0_flag = 1;
key1_count = 0;
}
if(key0_read == 0)
{
key0_flag = 0;
}
if(key1_read == 0 && key1_flag == 0)
{
key1_count++;
if(key1_count == 2) key1_count = 1;
key1_flag = 1;
}
if(key1_read == 1)
{
key1_flag = 0;
}
}
}
//¹öÂÖ&·µ»Ø
//È·¶¨
void menu_1()
{
if(key1_count == 0)
{
switch(key0_count)
{
case 1:
{
motor_stop();
weideng_on();
OLED_ReverseArea(88, 0, 126, 20);
OLED_Update();
}break;
case 2:
{
motor_stop();
weideng_on();
OLED_ReverseArea(88, 20, 126, 20);
OLED_Update();
}break;
}
}
if(key1_count == 1 && key0_count == 1)
{
xunji_control();
}
if(key1_count == 1 && key0_count == 2)
{
bizhang_control();
}
}
#include "./BSP/oled/oled1.h"
#include "./BSP/oled/OLED_Data.h"
#include "./BSP/oled/OLED.h"
#include "./SYSTEM/delay/delay.h"
void oled_mode()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(90, 0, "寻迹");
OLED_ShowChinese(90, 20, "避障");
}
void oled_go()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(100, 0, "前");
OLED_ShowChinese(100, 20, "进");
OLED_ShowChinese(0, 48, "当前车速:");
OLED_ShowNum(75, 52, 100, 3, OLED_6X8);
OLED_Update();
}
void oled_right()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(100, 0, "右");
OLED_ShowChinese(100, 20, "转");
OLED_ShowChinese(0, 48, "当前车速:");
OLED_ShowNum(75, 52, 80, 2, OLED_6X8);
OLED_Update();
}
void oled_left()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(100, 0, "左");
OLED_ShowChinese(100, 20, "转");
OLED_ShowChinese(0, 48, "当前车速:");
OLED_ShowNum(75, 52, 80, 2, OLED_6X8);
OLED_Update();
}
void oled_stop()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(100, 0, "停");
OLED_ShowChinese(100, 20, "止");
OLED_ShowChinese(0, 48, "当前车速:");
OLED_ShowNum(75, 52, 0, 1, OLED_6X8);
OLED_Update();
}
void oled_qidong()
{
OLED_Clear();
OLED_ShowImage(0, 0, 100, 64, Diode);
OLED_ShowChinese(100, 0, "启");
OLED_ShowChinese(100, 20, "动");
OLED_ShowChinese(100, 40, "中");
OLED_Update();
}
d.附加尾灯模块
这部分就非常简单了,我们接触是他们32的第一个实验点灯(开个玩笑,不是点亮第一个电容哈)
#include "./BSP/weideng/weideng.h"
void weideng_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = weideng_pin_A1|weideng_pin_A2;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
GPIO_InitStruct.Pin = weideng_pin_B1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void weideng_on()
{
HAL_GPIO_WritePin(GPIOE, weideng_pin_A1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE, weideng_pin_A2, GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOB, weideng_pin_B1, GPIO_PIN_SET);
// HAL_GPIO_WritePin(GPIOA, weideng_pin_B2, GPIO_PIN_RESET);
}
void weideng_of()
{
HAL_GPIO_WritePin(GPIOE, weideng_pin_A1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE, weideng_pin_A2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, weideng_pin_B1, GPIO_PIN_RESET);
// HAL_GPIO_WritePin(GPIOA, weideng_pin_B2, GPIO_PIN_RESET);
}