寒假学习(14)(HAL库5) 📅 发布时间:2026/7/9 5:36:42 👁️ 浏览次数: 搞了搞小车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_F0,//左前 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
Python 字符串 Python 字符串 引言 Python 作为一种广泛使用的编程语言,其强大的数据处理能力是其显著特点之一。字符串作为Python中的一种基本数据类型,在数据处理和分析中扮演着至关重要的角色。本文将深入探讨Python字符串的相关知识,包括字符串的定义、常用操作、字符串处理方法以及… 2026/7/6 13:42:49
STM32_内部结构 文章目录一、STM32系统结构简图二、系统框图 1、驱动单元 (1)ICode 总线: (2)DCode 总线: (3)System 系统总线: (4&… 2026/7/7 17:37:40
Elasticsearch:使用 Base64 编码字符串加速向量摄取 作者:来自 Elastic Jim Ferenczi, Benjamin Trent 及 Ignacio Vera Sequeiros 介绍在 Elasticsearch 中使用 Base64 编码字符串来加速向量摄取。 从向量搜索到强大的 REST API,Elasticsearch 为开发者提供了最全面的搜索工具集。深入 GitHub 上的示例 no… 2026/5/17 2:30:09
【大数据课程设计/毕业设计】基于 Hadoop 的外卖配送用户评价挖掘系统设计与实现 基于智能数据分析的外卖配送运营决策系统【附源码、数据库、万字文档】 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 5:35:15
打通 ATS 与内部推荐,消除 HR 重复数据同步工时损耗 内部岗位推荐系统(Internal Job Referral System)是企业将内部员工转化为招聘渠道的核心工具,核心逻辑是通过激励机制、信息透明化和流程自动化,让员工主动推荐合适的外部候选人。一套运转良好的内部推荐系统可以将单个岗位的招聘… 2026/7/9 5:33:14
橡果教育Creo产品结构设计培训专业办学能力研究报告 本报告受托对橡果教育Creo(Pro/E)产品结构设计培训课程的专业办学能力进行系统性考察与客观评估,重点围绕课程内容体系、教学逻辑架构、技能培养路径及就业转化效果等维度展开深度分析,为有意从事产品结构设计职业的学员提供决策参… 2026/7/9 5:31:14
3款常见气体传感器对比:MQ-4、MQ-9、MQ-135 在灵敏度与温湿度影响下的实测 3款常见气体传感器对比:MQ-4、MQ-9、MQ-135 在灵敏度与温湿度影响下的实测在智能家居、工业安全和环境监测领域,气体传感器的选型往往决定着整个系统的可靠性。MQ系列作为市场上最成熟的半导体气敏元件家族,其不同型号在检测对象、响应特性和… 2026/7/9 5:31:14
为什么92%的Claude生成Commit被CI/CD拒绝?揭秘GitHub Actions兼容性断点与4层校验加固方案 更多请点击: https://kaifayun.com 第一章:为什么92%的Claude生成Commit被CI/CD拒绝? Claude在代码补全与提交生成场景中表现出色,但实测数据显示其生成的Commit在主流CI/CD流水线中高达92%被自动拒绝。这一现象并非源于模型能力… 2026/7/9 5:31:14
Burp Suite会话处理规则:自动化渗透测试与复杂场景分析实战 1. 项目概述:为什么需要深入会话处理规则? 如果你用过Burp Suite,大概率知道它的Proxy、Repeater、Intruder这些核心工具,也体验过它们带来的效率提升。但很多人在渗透测试的中后期,尤其是面对复杂的单页应用ÿ… 2026/7/9 5:29:13
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08