寒假学习(14)(HAL库5)

搞了搞小车

PWM驱动

cpp 复制代码
#include "PWM.h"

// Ignore PWM dead band  忽略PWM信号死区
static int16_t Motor_Ignore_Dead_Zone(int16_t pulse)
{
    if (pulse > 0)
        return pulse + MOTOR_IGNORE_PULSE;
    if (pulse < 0)
        return pulse - MOTOR_IGNORE_PULSE;
    return 0;
}

// All motors stopped  所有电机停止
void Motor_Stop(uint8_t brake)
{
    if (brake != 0)
        brake = 1;
    PWM_M1_A = brake * MOTOR_MAX_PULSE;
    PWM_M1_B = brake * MOTOR_MAX_PULSE;
    PWM_M2_A = brake * MOTOR_MAX_PULSE;
    PWM_M2_B = brake * MOTOR_MAX_PULSE;
    PWM_M3_A = brake * MOTOR_MAX_PULSE;
    PWM_M3_B = brake * MOTOR_MAX_PULSE;
    PWM_M4_A = brake * MOTOR_MAX_PULSE;
    PWM_M4_B = brake * MOTOR_MAX_PULSE;
}

// 设置电机速度,speed:±(3600-MOTOR_IGNORE_PULSE), 0为停止
// Set motor speed, speed:± (3600-MOTOR_IGNORE_PULSE), 0 indicates stop
void Motor_Set_Pwm(uint8_t id, int16_t speed)
{
    int16_t pulse = Motor_Ignore_Dead_Zone(speed);
    // Limit input  限制输入
    if (pulse >= MOTOR_MAX_PULSE)
        pulse = MOTOR_MAX_PULSE;
    if (pulse <= -MOTOR_MAX_PULSE)
        pulse = -MOTOR_MAX_PULSE;

    switch (id)
    {
    case L_F:
    {
        pulse = -pulse;
        if (pulse >= 0)
        {
            PWM_M1_A = pulse;
            PWM_M1_B = 0;
        }
        else
        {
            PWM_M1_A = 0;
            PWM_M1_B = -pulse;
        }
        break;
    }

    case L_R:
    {
        pulse = -pulse;
        if (pulse >= 0)
        {
            PWM_M2_A = pulse;
            PWM_M2_B = 0;
        }
        else
        {
            PWM_M2_A = 0;
            PWM_M2_B = -pulse;
        }
        break;
    }

    case R_F:
    {

        if (pulse >= 0)
        {
            PWM_M3_A = pulse;
            PWM_M3_B = 0;
        }
        else
        {
            PWM_M3_A = 0;
            PWM_M3_B = -pulse;
        }
        break;
    }
    case R_R:
    {

        if (pulse >= 0)
        {
            PWM_M4_A = pulse;
            PWM_M4_B = 0;
        }
        else
        {
            PWM_M4_A = 0;
            PWM_M4_B = -pulse;
        }
        break;
    }

    default:
        break;
    }
}


void Motion_Set_Pwm(int16_t Motor_1, int16_t Motor_2, int16_t Motor_3, int16_t Motor_4)
{
    if (Motor_1 >= -MOTOR_MAX_PULSE && Motor_1 <= MOTOR_MAX_PULSE)
    {
        Motor_Set_Pwm(L_F, Motor_1);
    }
    if (Motor_2 >= -MOTOR_MAX_PULSE && Motor_2 <= MOTOR_MAX_PULSE)
    {
        Motor_Set_Pwm(L_R, Motor_2);
    }
    if (Motor_3 >= -MOTOR_MAX_PULSE && Motor_3 <= MOTOR_MAX_PULSE)
    {
        Motor_Set_Pwm(R_F, Motor_3);
    }
    if (Motor_4 >= -MOTOR_MAX_PULSE && Motor_4 <= MOTOR_MAX_PULSE)
    {
        Motor_Set_Pwm(R_R, Motor_4);
    }
}
cpp 复制代码
#ifndef __PWM_H
#define __PWM_H
#include "main.h"

enum motor
{
	L_F=0,//左前
	L_R,//左后
	R_F,
	R_R,
};

#define PWM_M1_A TIM8->CCR1
#define PWM_M1_B TIM8->CCR2
#define PWM_M2_A TIM8->CCR3
#define PWM_M2_B TIM8->CCR4

#define PWM_M3_A TIM1->CCR1
#define PWM_M3_B TIM1->CCR2
#define PWM_M4_A TIM1->CCR3
#define PWM_M4_B TIM1->CCR4

#define MOTOR_MAX_PULSE 3600

#define MOTOR_IGNORE_PULSE 2000


void Motor_Set_Pwm(uint8_t id, int16_t speed);

void Motion_Set_Pwm(int16_t Motor_1, int16_t Motor_2, int16_t Motor_3, int16_t Motor_4);


#endif
cpp 复制代码
#include "RedRay.h"

void car_irtrack(void)
{

	if((IN_X1 == 0 && IN_X3 == 0) && IN_X2 == 1 && IN_X4 == 1) //直走 go straight
	{
		Motion_Set_Pwm(600,600,600,600);
	}


	if(IN_X1 == 0 && IN_X3 == 1 && IN_X4 == 1 && IN_X2 == 1)//小幅度调整 small adjustment
	{
			Motion_Set_Pwm(0,0,500,500);
	}
	else	if(IN_X1 == 1 && IN_X3 == 0 && IN_X4 == 1 && IN_X2 == 1)
	{
			Motion_Set_Pwm(500,500,0,0);
	}


	if(IN_X2 == 0 && IN_X3 == 1 ) //大幅度左右转 Turn left and right sharply
	{
			Motion_Set_Pwm(-500,-500,500,500);
	}
	else if(IN_X4 == 0 && IN_X1 == 1 )
	{
			Motion_Set_Pwm(500,500,-500,-500);
	}

	//其它情况保持不变 Other things remain unchanged
}
cpp 复制代码
#ifndef __REDRAY_H
#define __REDRAY_H


#include "main.h"
#include "PWM.h"

#define IN_X1 HAL_GPIO_ReadPin(X1_GPIO_Port,X1_Pin)//读取X1引脚的状态 Read the status of X1 pin
#define IN_X2 HAL_GPIO_ReadPin(X2_GPIO_Port,X2_Pin)//读取X2引脚的状态 Read the status of X2 pin
#define IN_X3 HAL_GPIO_ReadPin(X3_GPIO_Port,X3_Pin)//读取X3引脚的状态 Read the status of X3 pin
#define IN_X4 HAL_GPIO_ReadPin(X4_GPIO_Port,X4_Pin)//读取X4引脚的状态 Read the status of X4 pin

void car_irtrack(void);

#endif
相关推荐
二哈赛车手1 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
wj3055853782 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
吃好睡好便好2 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~2 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
abigriver2 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
YDS8292 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
wangqiaowq2 小时前
windows下nginx的安装
linux·服务器·前端
nashane2 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
YYRAN_ZZU3 小时前
Petalinux新建自动脚本启动
linux
charlie1145141913 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发