news 2026/6/20 2:17:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
寒假学习(14)(HAL库5)

搞了搞小车

PWM驱动

#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); } }
#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
#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 }
#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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:00:39

Maven 依赖管理

Maven 依赖管理 引言 Maven 是一个强大的构建自动化工具,主要用于 Java 项目的构建、测试、文档和报告。依赖管理是 Maven 的核心功能之一,它使得开发者能够轻松地引入外部库和框架,以支持项目开发。本文将详细介绍 Maven 的依赖管理机制,包括依赖的声明、解析、传递依赖…

作者头像 李华
网站建设 2026/6/18 12:51:02

SOAP 简介

SOAP 简介 引言 SOAP(Simple Object Access Protocol)是一种轻量级、简单、可扩展的协议,用于在网络上交换结构化信息。它允许不同平台、不同编程语言的应用程序之间进行通信。本文将详细介绍SOAP的基本概念、工作原理、优势以及应用场景。 SOAP的基本概念 SOAP是一种基…

作者头像 李华
网站建设 2026/6/19 16:27:26

信息安全毕业设计创新的项目选题怎么选

0 选题推荐 - 云计算篇 毕业设计是大家学习生涯的最重要的里程碑&#xff0c;它不仅是对四年所学知识的综合运用&#xff0c;更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要&#xff0c;它应该既能体现你的专业能力&#xff0c;又能满足实际应…

作者头像 李华
网站建设 2026/6/12 6:57:36

系统思考与组织效率

从系统思考的角度看&#xff0c;组织里“最忙”的人&#xff0c;往往承担着最多的局部优化。 大家在不断解决眼前问题&#xff0c;却被系统性地隔离在全局之外。 当系统只奖励响应速度&#xff0c;却不为全局理解预留空间&#xff0c;忙碌就会变成一种常态。 真正的效率&…

作者头像 李华
网站建设 2026/6/10 15:24:23

揭秘数据库性能优化:连接池的五大核心作用

文章目录揭秘数据库性能优化&#xff1a;连接池的五大核心作用前言一、什么是数据库连接池&#xff1f;二、为什么需要数据库连接池&#xff1f;三、连接池的五大核心作用1. 减少连接创建和销毁的开销2. 提高系统的响应速度3. 资源控制与隔离4. 提高系统的并发处理能力5. 提高资…

作者头像 李华
网站建设 2026/6/17 18:58:14

生物测试架构师稀缺性危机:数据透视与行业影响

2026年&#xff0c;生物测试架构师的全球缺口已演变为战略级危机。数据显示&#xff0c;AI测试人才缺口高达87万&#xff0c;其中生物测试架构师需求年增长率达25%&#xff0c;远超宇航员岗位的15%。这种差距源于生物技术行业的爆发&#xff1a;人口老龄化和慢性病发病率上升推…

作者头像 李华