当前位置: 首页 > news >正文

寒假学习(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
http://www.jsqmd.com/news/347124/

相关文章:

  • 第七十八篇-CentOS-7+安装cmake-3.24.3
  • 【claude】2026年推特最火的10个Claude Skills——Vibe Video的Remotion霸榜
  • 关于排障
  • SOAP 简介
  • vs2013工具库v120分享
  • 【claude】震惊!140万AI代理建立“甲壳教“,Claude成功驾驭火星车400米
  • Day37-20260205
  • TypeScript 测验
  • 跳过 MLOps:通过 Cloud Connect 使用 EIS 为自管理 Elasticsearch 提供托管云推理
  • 介绍 Elastic Workflows:用于 Elasticsearch 的原生自动化
  • Highcharts 配置说明
  • 三面阿里,四面京东,終拿offer!Java面经分享!
  • Maven 依赖管理
  • 【Linux命令大全】009.备份压缩之zip命令(实操篇)
  • Elasticsearch:使用 Base64 编码字符串加速向量摄取
  • Python 条件语句
  • STM32_内部结构
  • STM32_芯片介绍
  • 保姆级最新OpenClaw(原 Clawdbot/Moltbot)安装指南,建立隧道,外网浏览器也能访问,并接入飞书,让AI在聊天软件里帮你干活
  • 梁实秋《中年》
  • tensorflow-gpu==1.14.0 测试cuda是否成功
  • DeepSeek可以投广告投流吗? - 品牌2025
  • github加速
  • C++ 循环
  • [硬核选型] 蒸汽眼罩的“架构重构”:从粉包到薄片芯,一场非典型的供应链Benchmark
  • 移动设备统计:行业趋势与市场洞察
  • 揭秘浏览器渲染引擎的“像素炼金术”
  • XQuery 选择和过滤
  • 美通卡回收不用愁,春节前轻松盘活闲置资源 - 京顺回收
  • 智能算法(粒子群算法、布谷鸟算法和飞蛾火焰算法)彩色图像多阈值分割(算法+软件界面)