news 2026/9/8 7:11:40

STM32两轮差速小车开环控制:从PWM原理到工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32两轮差速小车开环控制:从PWM原理到工程实践

1. 项目概述与核心价值

最近在整理工作室的物料,翻出来一堆之前做智能小车剩下的电机、轮子和几块STM32F103的开发板。看着这些零件,我突然想到,很多朋友在入门嵌入式开发时,总觉得第一步就卡在了“闭环控制”、“PID算法”这些听起来就有点吓人的概念上。其实,完全可以从更基础、更直观的“开环控制”开始玩起。这次,我们就用最经典的STM32单片机,来搭建一个两轮差速小车,并实现它的基础开环控制。所谓开环控制,简单说就是“我发指令,你执行,至于执行得准不准、外界有没有干扰,我暂时不管”。这就像你蒙着眼睛指挥别人往前走三步,你只关心“发出了走三步的指令”,而不去核实他是不是真的只走了三步,或者路上有没有被石头绊到。对于单片机学习而言,开环控制是理解GPIO、PWM、定时器等核心外设,以及建立“程序控制物理世界”这一概念最直接的桥梁。

这个项目非常适合刚学完STM32基本外设(比如点灯、按键),想找个综合小项目练手的朋友。你不需要任何复杂的传感器(如编码器、陀螺仪),只需要一块STM32核心板、一个电机驱动模块(比如L298N或TB6612)、两个直流减速电机和轮子,再加上一个电源(建议用18650电池组),就能动手了。通过这个项目,你将清晰地掌握如何用程序产生PWM波来控制电机转速,如何组合两个电机的转速来实现小车的前进、后退、转向和停止。虽然它没有“智能”,跑起来可能因为电池电量、地面摩擦不同而画不出一条直线,但这个过程能让你把书本上的寄存器配置、时钟树、中断等知识,实实在在地转化为一个能跑起来的物理实体,这种成就感是单纯调代码无法比拟的。我们接下来会从硬件选型、软件设计、代码实现到调试心得,完整地走一遍。

2. 硬件系统设计与核心模块解析

2.1 主控与电机驱动选型考量

主控芯片的选择几乎是确定的:STM32F103C8T6,也就是常说的“蓝色药丸”或“最小系统板”。它资源足够(72MHz主频,64KB Flash,20KB RAM,多个定时器),社区资料极其丰富,价格也便宜。最关键的是,它几乎所有的通用定时器(TIM1, TIM2, TIM3, TIM4)都支持PWM输出,这正是我们控制电机速度所需要的。

电机驱动模块的选择则需要一些权衡。常见的有L298N和TB6612FNG。

  • L298N:经典、皮实、易获取。但它采用的是线性放大原理,效率较低,工作时发热比较明显,需要加装散热片。其控制逻辑简单,用两个GPIO口控制方向,一个PWM口控制速度。
  • TB6612FNG:MOSFET H桥驱动,效率高,发热小,体积也更小巧。控制方式与L298N类似,但驱动能力和性能通常更好。

对于这个开环小车项目,两者都能完美胜任。我手头正好有TB6612,所以本次以它为例。它的接线逻辑非常清晰:VM接电机电源(7-12V),VCC接逻辑电源(3.3V或5V,接STM32的3.3V),GND共地。每个电机需要三个控制信号:PWMA(PWM速度信号)、AIN1和AIN2(方向控制信号)。STBY(待机)引脚直接接高电平(VCC)使其一直处于工作状态。

2.2 电源系统设计与布线要点

小车的“动力心脏”是电源系统,设计不好轻则电机无力,重则单片机复位甚至烧毁。核心原则是:电机电源与单片机逻辑电源必须隔离

电机启动和堵转时会产生很大的瞬时电流和电压波动,如果和单片机共用一套电源,这些噪声会直接耦合进单片机的供电线路,导致程序跑飞。因此,标准的做法是使用两套独立的电源:

  1. 动力电源:用于给电机驱动模块(TB6612的VM端)供电。推荐使用两节18650锂电池串联(约7.4V-8.4V),容量大,放电电流足够。直接接到驱动模块的VM和GND。
  2. 逻辑电源:用于给STM32单片机、TB6612的VCC(逻辑供电)供电。可以从动力电源引出,但必须经过一个降压稳压模块(如AMS1117-3.3或效率更高的DC-DC降压模块)稳定到3.3V。这个3.3V再给单片机和TB6612的VCC供电。

重要提示:务必确保单片机、TB6612的逻辑地(GND)和动力电源的地最终连接在一起,即“共地”。这是信号正确参考的基础,否则控制信号会失效。

布线时,尽量将电机动力线(粗线)与单片机信号线(细线)分开走,避免平行长距离走线,以减少电磁干扰。如果小车运行时单片机异常复位,首先就要怀疑电源干扰问题。

2.3 小车底盘与机械结构搭建

对于开环控制,机械结构的对称性和稳定性尤为重要,因为它直接影响了两个轮子运动的一致性。建议使用现成的亚克力或金属小车底盘套件,它们通常已经设计好了电机安装孔和电池盒位置。安装时需要注意:

  • 电机安装紧固:确保两个减速电机牢固地安装在底盘上,不能有晃动。晃动会在运行时引入不可预测的摩擦变化。
  • 轮子安装同轴:尽量让两个轮子保持在同一直线上。可以目测或者用直尺辅助。轮子不同心会导致小车天生就跑偏。
  • 万向轮或尾轮:两轮差速小车需要至少一个辅助支撑点。常见的是在底盘前部或后部安装一个万向球轮。确保这个支撑轮高度合适,使小车底盘基本水平,两个驱动轮均匀着地。
  • 重心分配:电池和主板尽量布置在底盘中心附近,降低重心,避免小车在启动、停止时因重心过高而晃动剧烈。

3. 软件架构与PWM驱动原理

3.1 定时器与PWM生成机制详解

在STM32中,PWM(脉冲宽度调制)波通常由通用定时器(TIMx)的PWM输出模式产生。其本质是通过一个自动重装载寄存器(ARR)和一个捕获/比较寄存器(CCR)来控制一个引脚的输出电平。

你可以把定时器想象成一个向上计数的秒表。ARR决定了这个秒表的最大值(比如计数到1000就归零重来)。CCR是你设定的一个比较值(比如300)。定时器从0开始累加,在计数值小于CCR时,引脚输出高电平(或低电平,取决于极性配置);当计数值大于等于CCR但小于等于ARR时,引脚输出相反的电平。如此循环,就产生了周期固定、但高低电平比例可调的方波,也就是PWM波。

关键参数计算

  • PWM频率Fpwm = 定时器时钟源频率 / ((ARR + 1) * (PSC + 1))
    • 定时器时钟源频率:如果APB总线时钟是72MHz,且定时器挂在APB1上(默认2分频后为36MHz),但STM32有一个倍频机制,如果APB预分频系数≠1,定时器时钟会×2,所以TIM2-4的时钟通常是72MHz。
    • ARR:自动重装载值。
    • PSC:预分频器值。
  • PWM占空比Duty Cycle = CCR / (ARR + 1)
    • CCR值直接决定了高电平时间在一个周期内的占比。

对于直流电机,PWM频率不宜太低(否则电机会抖动、啸叫),也不宜太高(否则驱动模块可能无法响应)。通常选择在5kHz到20kHz之间。我们以10kHz为例,定时器时钟72MHz,设置PSC=71,ARR=999,则:Fpwm = 72,000,000 / ((71+1)*(999+1)) = 72,000,000 / 72,000 = 1000Hz。哦,这里算错了,是1kHz。要达到10kHz,可以设PSC=71,ARR=99,则Fpwm = 72,000,000 / (72*100) = 10,000Hz

3.2 GPIO配置与电机控制逻辑抽象

控制一个电机需要3个GPIO引脚。以控制右轮电机的TIM3_CH1(PA6)作为PWM,PA4和PA5作为方向控制为例:

  • PWM引脚:必须配置为复用推挽输出(AF_PP),并映射到对应的定时器通道上。
  • 方向控制引脚:配置为通用推挽输出(GPIO_PP)即可。

对于TB6612,其控制真值表如下:

AIN1AIN2PWMA电机状态
00X停止(刹车)
10PWM正转
01PWM反转
11X停止(刹车)

在软件中,我们应该将这三个引脚的操作封装成一个“电机”结构体或对象,并为其编写清晰的接口函数,如Motor_Init(),Motor_SetSpeed(int16_t speed)。其中speed参数可以设计为-100到+100,负数代表反转,正数代表正转,绝对值大小代表占空比。这样,上层控制逻辑会非常清晰。

3.3 开环控制下的运动学模型

两轮差速小车的运动学模型是理解其如何运动的基础。假设两个轮子间距为L(轮距),轮子半径为R

  • 前进/后退:当左轮转速V_left等于右轮转速V_right时,小车沿直线前进(同正)或后退(同负)。
  • 原地旋转:当V_left = -V_right时,小车将围绕两轮中心点原地旋转。左正右负则顺时针转,反之逆时针转。
  • 转向:更一般的情况是,小车会围绕一个瞬时旋转中心(ICR)做圆弧运动。转弯半径ρ与两轮速度差有关。ρ = (L/2) * (V_left + V_right) / (V_right - V_left)

在开环控制中,我们无法精确测量V_leftV_right的实际值(因为没有编码器),所以我们控制的是期望的PWM占空比。我们预设“当左右轮PWM占空比都设置为60%时,小车应该直行”。但实际上,由于电机个体差异、电池电压波动、轮子摩擦不同,即使给相同的PWM,两个轮子的实际转速也可能有细微差别,导致小车跑偏。这就是开环控制的局限性,也是我们后续引入闭环(如编码器PID)需要解决的问题。但在项目初期,通过手动微调左右轮的基础PWM值(一个略高于另一个),可以在特定场地大致实现直行,这是一个很实用的调试技巧。

4. 代码实现与分步调试

4.1 工程初始化与定时器PWM配置

我们使用STM32CubeMX进行初始化配置,这样效率最高。关键步骤如下:

  1. 选择你的STM32型号。
  2. 配置时钟树(RCC),将HSE设置为外部晶振,并使能PLL,将系统时钟调到72MHz。
  3. 配置两个定时器用于PWM生成。例如,用TIM3的Channel1和Channel2控制右轮,TIM4的Channel1和Channel2控制左轮。将对应的GPIO(如PA6, PA7, PB6, PB7)自动配置为复用功能。
  4. 在定时器参数设置中:
    • Prescaler (PSC): 设置为71。
    • Counter Mode: Up(向上计数)。
    • Counter Period (ARR): 设置为99。这样PWM频率为10kHz。
    • Pulse (CCR): 初始值设为0。这是占空比初始值。
    • CH Polarity: 设置为High。表示默认有效电平为高。
  5. 生成代码(IDE选择Keil MDK或STM32CubeIDE)。

生成的代码会自动完成GPIO和定时器的初始化。我们需要在main.c中手动开启PWM输出通道:

HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 右轮PWM HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // 左轮PWM HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);

4.2 电机驱动层封装与API设计

接下来,我们创建motor.cmotor.h文件,封装电机控制逻辑。

// motor.h typedef struct { TIM_HandleTypeDef *htim; // 定时器句柄 uint32_t channel; // PWM通道 GPIO_TypeDef *GPIOx_AIN1; // AIN1端口 uint16_t GPIO_Pin_AIN1; // AIN1引脚 GPIO_TypeDef *GPIOx_AIN2; // AIN2端口 uint16_t GPIO_Pin_AIN2; // AIN2引脚 int16_t current_speed; // 当前速度设定值 (-100 ~ 100) } Motor_t; void Motor_Init(Motor_t *motor, TIM_HandleTypeDef *htim, uint32_t channel, GPIO_TypeDef* GPIOx_AIN1, uint16_t GPIO_Pin_AIN1, GPIO_TypeDef* GPIOx_AIN2, uint16_t GPIO_Pin_AIN2); void Motor_SetSpeed(Motor_t *motor, int16_t speed);

motor.c中实现:

// motor.c void Motor_SetSpeed(Motor_t *motor, int16_t speed) { // 限幅 if(speed > 100) speed = 100; if(speed < -100) speed = -100; motor->current_speed = speed; // 设置方向 if(speed > 0) { // 正转 HAL_GPIO_WritePin(motor->GPIOx_AIN1, motor->GPIO_Pin_AIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(motor->GPIOx_AIN2, motor->GPIO_Pin_AIN2, GPIO_PIN_RESET); } else if(speed < 0) { // 反转 HAL_GPIO_WritePin(motor->GPIOx_AIN1, motor->GPIO_Pin_AIN1, GPIO_PIN_RESET); HAL_GPIO_WritePin(motor->GPIOx_AIN2, motor->GPIO_Pin_AIN2, GPIO_PIN_SET); } else { // 停止(刹车) HAL_GPIO_WritePin(motor->GPIOx_AIN1, motor->GPIO_Pin_AIN1, GPIO_PIN_SET); HAL_GPIO_WritePin(motor->GPIOx_AIN2, motor->GPIO_Pin_AIN2, GPIO_PIN_SET); // 也可以同时置低,取决于驱动模块逻辑 } // 设置PWM占空比,取绝对值 uint16_t pulse = (uint16_t)((__HAL_TIM_GET_AUTORELOAD(motor->htim) + 1) * abs(speed) / 100); __HAL_TIM_SET_COMPARE(motor->htim, motor->channel, pulse); }

这样,我们就有了一个可以方便控制速度和方向的电机对象。

4.3 上层运动控制函数实现

基于封装好的电机驱动,我们可以实现小车的基本运动函数,放在car.c中:

// car.h extern Motor_t motor_left, motor_right; // 在car.c中定义 void Car_Init(void); void Car_Stop(void); void Car_Run(int16_t speed); // 速度范围 -100~100 void Car_Turn(int16_t speed, float ratio); // ratio为转向系数,-1~1,负左转,正右转 void Car_Spin(int16_t angular_speed); // 原地旋转,正为顺时针
// car.c Motor_t motor_left, motor_right; void Car_Init(void) { // 初始化左电机,假设使用TIM4_CH1 (PB6)为PWM, PB0为AIN1, PB1为AIN2 Motor_Init(&motor_left, &htim4, TIM_CHANNEL_1, GPIOB, GPIO_PIN_0, GPIOB, GPIO_PIN_1); // 初始化右电机,假设使用TIM3_CH1 (PA6)为PWM, PA4为AIN1, PA5为AIN2 Motor_Init(&motor_right, &htim3, TIM_CHANNEL_1, GPIOA, GPIO_PIN_4, GPIOA, GPIO_PIN_5); } void Car_Run(int16_t speed) { // 简单直行,左右轮同速 Motor_SetSpeed(&motor_left, speed); Motor_SetSpeed(&motor_right, speed); } void Car_Turn(int16_t speed, float ratio) { // ratio在 -1 到 1 之间 // ratio = 0 直行, ratio > 0 右转(右轮减速), ratio < 0 左转(左轮减速) int16_t left_speed = speed; int16_t right_speed = speed; if(ratio > 0) { // 右转 right_speed = speed * (1.0f - ratio); } else if(ratio < 0) { // 左转 left_speed = speed * (1.0f + ratio); // ratio为负,所以是 1 - |ratio| } Motor_SetSpeed(&motor_left, left_speed); Motor_SetSpeed(&motor_right, right_speed); }

main函数中,我们就可以通过调用Car_Run(60)让小车以60%的占空比前进了。

4.4 调试技巧与参数微调实录

代码写完下载后,别急着让小车跑。分步调试是成功的关键:

  1. 静态测试(不装轮子):下载程序后,用调试器或添加printf,在Motor_SetSpeed函数里设置不同的速度值(如0, 50, -50)。用手轻轻捏住电机轴,感受其力度和转向是否与预期一致。用逻辑分析仪或示波器测量PWM引脚,观察波形频率和占空比是否正确。这是检查硬件连接和软件配置最安全的一步。
  2. 悬空测试(抬起小车):将小车抬起,让轮子空转。调用Car_Run(30),观察两个轮子是否都朝前转,转速是否大致相同。听电机声音,如果发出尖锐的啸叫,可能是PWM频率太低,可以尝试调高ARR以降低频率,或检查电源功率是否足够。
  3. 地面直线测试:将小车放在空旷平整的地面上(如地板),执行Car_Run(40)2秒钟后停止。观察小车轨迹。如果明显偏向一侧,说明两个电机性能有差异。这时不要修改代码,而是尝试微调物理连接:检查轮子是否安装牢固、轮胎气压(如果是充气胎)是否一致。如果物理调整无效,再考虑在软件中加入一个“校准偏移量”。例如,在Car_Run函数中,给其中一个轮子的速度加上一个小的补偿值:Motor_SetSpeed(&motor_left, speed + CALIB_OFFSET)。通过实验找到一个能让小车大致直行的CALIB_OFFSET值(可能是+3或-5)。记住,这个值只在当前电池电量和地面条件下有效。
  4. 转向与旋转测试:测试Car_TurnCar_Spin函数。观察转向是否平滑,原地旋转是否围绕中心点。如果不理想,调整转向算法中的ratio与速度的映射关系。

5. 开环控制的局限性分析与进阶思考

5.1 为何开环小车无法走直线?

通过上面的实验,你已经切身感受到了开环控制的核心问题:抗干扰能力差,无纠错能力。具体到小车上,干扰源包括:

  • 电机特性差异:即使是同一批次的电机,其内部的磁钢、绕组、碳刷磨损程度都有微小差别,导致在相同电压下的空载转速和扭矩特性曲线(KV值)不同。
  • 电池电压衰减:随着电池放电,输出电压下降,电机转速也会随之下降。但两个电机对电压下降的敏感度可能不同,导致速度差发生变化。
  • 负载与摩擦不均:小车重心不完全居中、轮子与地面接触的摩擦力不同、地面本身不平整,都会导致两个轮子实际受到的阻力不同。
  • 驱动电路细微偏差:电机驱动芯片的两个H桥通道,其内阻和开关特性也可能存在微小差异。

在开环系统中,控制器(STM32)对这些干扰一无所知。它只是忠实地输出预设的PWM信号,而无法根据“小车是否真的在直行”这个结果来调整输出。因此,开环小车跑偏是必然的,不跑偏是偶然的(在特定条件下刚好平衡)。

5.2 从开环到闭环:传感器引入的必要性

要让小车具备“纠偏”能力,就必须引入反馈传感器,构成闭环控制系统。最直接的传感器是旋转编码器,它可以安装在电机轴上,实时测量每个轮子的实际转速和转动距离。

有了编码器反馈,系统的工作流程就变成了:

  1. 设定目标:我们希望小车以0.5米/秒的速度直线前进。
  2. 控制器计算:根据目标速度,计算出左右轮的目标转速(RPM)。
  3. 输出控制量:控制器(STM32)输出PWM信号给电机驱动。
  4. 测量反馈:编码器实时测量电机的实际转速。
  5. 计算误差:比较目标转速和实际转速,得到误差。
  6. 调节输出:根据误差,通过PID等控制算法,动态调整PWM的占空比,使实际转速逼近目标转速。

这样,即使有外部干扰(如上坡、摩擦增大),导致左轮实际转速下降,编码器会立即检测到,控制器就会增加左轮的PWM占空比来补偿,从而维持两个轮子的转速一致,保证直线行驶。这就是闭环控制的魅力。

5.3 开环项目的实用价值与扩展方向

尽管有局限性,开环小车项目绝非没有价值。它是理解控制系统最直观的起点。通过它,你牢牢掌握了:

  • 单片机控制外设的完整流程:从时钟配置、GPIO初始化、定时器PWM生成到软件逻辑封装。
  • 硬件系统集成能力:电源管理、信号连接、抗干扰布线。
  • 调试与问题排查的基本方法:分步测试、现象观察、逻辑推理。

在此基础上,你可以轻松地将项目扩展升级:

  1. 增加编码器实现速度闭环:购买带AB相编码器的直流减速电机,利用STM32定时器的编码器接口模式读取脉冲,实现单个电机的速度PID控制。
  2. 增加陀螺仪实现姿态闭环:集成MPU6050等IMU传感器,通过PID控制让小车保持平衡(平衡车),或者实现更精确的转向角度控制。
  3. 增加遥控功能:接入蓝牙模块(如HC-05)或2.4G射频模块(如NRF24L01),用手机或遥控器控制小车。
  4. 实现简单巡线:增加几个红外对管或灰度传感器,实现基本的黑白线巡线功能,这仍然是开环控制(对传感器开关量的反应),但逻辑更有趣。

5.4 常见问题与故障排查速查表

在调试开环小车时,你大概率会遇到下表所列的问题。根据现象,可以按顺序排查:

现象可能原因排查步骤
电机完全不转,无声音1. 电源未接通或电压不足。
2. 电机驱动模块待机引脚(STBY)未使能。
3. 控制信号线未连接或接错。
1. 用万用表测量电机驱动VM端和逻辑VCC端电压。
2. 检查STBY引脚是否接高电平。
3. 检查AIN1/AIN2/PWM引脚是否与单片机正确连接,程序是否初始化了对应GPIO。
电机抖动、啸叫、转速不稳1. PWM频率过低(通常在几百Hz以下)。
2. 电源功率不足,带载后电压被拉低。
3. 电机损坏或驱动芯片某一相故障。
1. 用示波器检查PWM波形频率,调整定时器ARR和PSC值,将频率升至5kHz以上。
2. 检查电池电量,尝试更换容量更大或放电能力更强的电池。
3. 交换左右电机接线,如果问题跟随电机走,则是电机问题;如果问题留在原通道,则是驱动板或单片机引脚问题。
单片机频繁复位或程序跑飞1. 电机电源干扰串入单片机电源。
2. 电源线或电机动力线过长过细,导致压降和噪声。
3. 未共地。
1.最可能的原因。确保电机电源与单片机逻辑电源通过稳压模块隔离,并在电源入口处并联一个大电容(如1000uF)储能和滤除低频干扰,再并联一个0.1uF陶瓷电容滤除高频噪声。
2. 加粗缩短动力线。
3. 确保驱动板GND、单片机GND、电池GND全部连接在一起。
小车跑偏严重1. 左右轮电机性能差异。
2. 机械结构不对称,轮子安装不正。
3. 地面不平或摩擦力差异大。
1. 交换左右电机的驱动线(注意方向信号也要交换),如果跑偏方向反了,说明是电机差异,需软件补偿。
2. 检查底盘、轮子安装,确保对称。
3. 在光滑平整的地面(如瓷砖)上测试。
控制方向相反AIN1/AIN2控制逻辑接反。交换AIN1和AIN2的接线,或者在软件中调换控制这两个引脚电平的逻辑。
上电后电机一直全速转1. PWM引脚在初始化前可能为不定态,驱动模块误动作。
2. 程序未正确初始化方向引脚,使其处于浮空状态。
1. 在电机初始化函数中,先设置方向引脚为刹车或停止状态,再初始化PWM。
2. 检查GPIO初始化代码,确保方向引脚已正确配置为上拉或下拉输出模式,避免浮空。

这个开环小车项目就像学习骑自行车时用的辅助轮。它让你安全地、专注地练习踩踏板和掌握平衡(对应单片机的基础控制),而不必一开始就担心会摔倒(对应复杂的闭环算法)。当你熟练掌握了这一切,拆掉辅助轮,拥抱编码器和PID,去实现更精准、更智能的控制,就是水到渠成的事情了。动手做一遍,你会对“控制”二字有完全不同的理解。

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

DigitalPlat FreeDomain 免费域名注册指南:5 个后缀从接入到维护

DigitalPlat FreeDomain 免费域名注册指南&#xff1a;5 个后缀从接入到维护 【免费下载链接】US.KG Free domain registration and practical DNS learning resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/us/US.KG DigitalPlat FreeDomain 是…

作者头像 李华
网站建设 2026/9/8 7:11:09

深度强化学习驱动的PID自适应调谐方法

简介&#xff1a;PID控制器是工业控制与飞控系统中最基础、最广泛使用的反馈控制结构&#xff0c;其性能高度依赖于Kp、Ki、Kd三个参数的整定。然而传统手动或规则式调参难以应对非线性、时变及多工况环境&#xff0c;导致响应迟滞、超调振荡或鲁棒性下降。深度强化学习&#x…

作者头像 李华
网站建设 2026/9/2 11:56:07

Superpowers 使用教程:3 步让 AI 编程助手按 TDD 流程自主开发

Superpowers 使用教程&#xff1a;3 步让 AI 编程助手按 TDD 流程自主开发 【免费下载链接】superpowers An agentic skills framework & software development methodology that works. 项目地址: https://gitcode.com/GitHub_Trending/su/superpowers Superpowers…

作者头像 李华
网站建设 2026/9/2 9:17:45

园区景观照明物联网改造实战:从控制器到云平台的完整链路

做照明工程的老哥们&#xff0c;应该都有过这种经历&#xff1a;灯装好了&#xff0c;但控灯的方式还停留在“现场拨码 定时器 人工巡检”的原始阶段。我刚接手一个园区景观照明项目时&#xff0c;客户上来就吐槽了三件事&#xff1a;路灯控制器换了两批&#xff0c;故障全靠…

作者头像 李华
网站建设 2026/8/31 8:21:59

MiniMax H3部署实战:GB200推理提速27.7倍与3060本地运行

这次我们来聊的&#xff0c;是 MiniMax H3 在 NVIDIA GB200 平台上的推理提速数据&#xff1a;27.7 倍。这个数字出现在公开材料里&#xff0c;焦点非常明确——开源模型 H3 在 Grace Blackwell 架构上获得了相当明显的加速。与此同时&#xff0c;社区里的用户更关心另一件事&a…

作者头像 李华
网站建设 2026/8/30 14:35:17

andrej-karpathy-skills指南

andrej-karpathy-skills指南 【免费下载链接】andrej-karpathy-skills A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathys observations on LLM coding pitfalls. 项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy…

作者头像 李华