ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

直流电机PID闭环控制实战:L298N与TB6612驱动选型与PWM调优

直流电机PID闭环控制实战:L298N与TB6612驱动选型与PWM调优 1. 项目概述从“让电机转起来”到“精准控速”的真实路径直流电机驱动这个词听起来像教科书里的一个章节标题但在我拆过第37块L298N模块、烧掉第5个TB6612的VCC引脚、在示波器上盯了整整两小时PWM波形之后它变成了一件特别具体的事——就是你按下开关那一刻轮子该转多快、停多准、带负载时会不会抖全由你写的那几行代码和焊的那几根线决定。这不是理论推演是实打实的物理世界反馈电流流过线圈产生磁场磁场推动转子旋转而你要做的是让这个过程听话、稳定、可预测。核心关键词就三个直流电机、L298N/TB6612、PID控制。它们不是并列关系而是层层递进的实战链条——电机是执行体驱动芯片是肌肉PID是大脑。新手常卡在第一步为什么接上电源电机就狂转为什么用Arduino写个analogWrite()调速一加负载转速就掉为什么编码器反馈回来的数据跳得像心电图这些问题背后不是代码写错了而是对“驱动”二字的理解还停留在“通电让它动”的层面。真正意义上的驱动是能量的精确调度、是动态响应的实时校正、是硬件与算法的咬合。它适合三类人一是刚学完单片机想做智能小车的学生别再只满足于让轮子转起来二是做自动化设备调试的工程师需要把电机响应时间压到毫秒级三是DIY爱好者想给自己的3D打印机或云台加一套真正稳的运动控制系统。这篇文章不讲抽象公式只讲我焊过、测过、调过、摔过的实操细节——比如TB6612的STBY引脚悬空会怎样L298N散热片没压紧时MOSFET温升多少度PID参数在不同负载下怎么微调。所有内容都来自实验室工作台上的真实记录你可以直接抄作业也可以照着踩坑。2. 驱动方案选型L298N与TB6612的硬核对比与取舍逻辑2.1 为什么不是所有H桥芯片都叫“驱动模块”很多初学者买来一块标着“L298N电机驱动模块”的板子以为插上就完事结果发现带不动一个12V/500mA的小轮毂电机或者一上电就发热严重。问题不在电机而在对“驱动”二字的物理本质理解偏差。驱动芯片的核心任务是把微控制器如Arduino、STM32发出的弱电信号放大成能推动电机绕组的强电流并且能双向控制正转/反转、调节功率调速。这本质上是一场功率电子学的实践输入是逻辑电平3.3V/5V输出是安培级电流1A~3A中间隔着的是半导体开关器件MOSFET或双极型晶体管的导通与关断。L298N和TB6612都是双H桥驱动芯片但它们的底层结构、电气特性和适用场景差异巨大选错就像给跑车配拖拉机变速箱——不是不能动是动得难受、效率低、寿命短。2.2 L298N经典但沉重的“老派力量”L298N是意法半导体ST在上世纪80年代推出的双全桥驱动芯片采用双极型晶体管BJT工艺。它的最大特点是“皮实”抗干扰能力强逻辑电平兼容性好TTL/CMOS驱动电压范围宽5V~46V单路持续输出电流可达2A峰值3A。但代价也很明显导通压降高典型值1.8V1A这意味着当电机电流为1A时仅在L298N内部就白白损耗1.8W热量效率低下满载时约65%~70%开关速度慢上升/下降时间约1.5μs限制了PWM频率上限通常建议≤20kHz。我实测过一块标准L298N模块带散热片在驱动12V/1A直流电机时空载表面温度达62℃带额定负载10分钟后升至89℃此时芯片已进入热保护状态输出自动切断。它的典型应用场景是教学实验、低速小负载如玩具车、简易机械臂关节或者对成本极度敏感、对效率和响应速度无要求的场合。它的原理图里没有复杂的外围电路通常只需接上电源、地、使能端EN、方向控制端IN1/IN2和电机输出端OUT1/OUT2入门门槛低但天花板也低。2.3 TB6612FNG现代高效的“轻量级选手”TB6612FNG是东芝Toshiba推出的MOSFET H桥驱动芯片采用先进的沟槽式MOSFET工艺。它的核心优势在于“高效”和“快速”导通电阻Rds(on)极低典型值0.3Ω1A意味着1A电流下功耗仅0.3W效率提升至90%以上开关速度快上升/下降时间1μs支持高达100kHz的PWM频率内置过流、过热、欠压保护电路可靠性更高。但它对设计要求更严逻辑电平必须匹配3.3V系统需注意电平转换电源纹波敏感PCB布局需更讲究。我用TB6612驱动同款12V/1A电机满载运行30分钟芯片表面温度仅48℃散热片几乎不烫手。更重要的是100kHz的PWM频率让电机电流纹波大幅降低运行噪音显著减小这对需要静音或精密定位的设备如3D打印机Z轴、云台俯仰至关重要。它的典型应用是中高端DIY项目、嵌入式产品原型、对能效比有要求的电池供电设备。TB6612的原理图比L298N复杂需额外关注VM电机电源、VCC逻辑电源、STBY待机、PWMA/BPWM输入、AIN/BIN方向输入等引脚的正确连接尤其是STBY引脚——悬空会导致芯片处于不确定状态极易烧毁。2.4 关键参数对比表数据不会说谎参数项L298NTB6612FNG实战影响说明最大持续输出电流单路2A1.2A峰值3.2ATB6612单路电流略小但实际可用功率更高因效率高。若需2A持续电流L298N更稳妥但必须配大散热片。典型导通压降/电阻1.8V 1A0.3Ω 1A这是效率分水岭。L298N在1A时损耗1.8WTB6612仅0.3W发热差5倍以上。推荐PWM频率≤20kHz1kHz~100kHz高频PWM如20kHz以上可消除人耳可闻的电机“啸叫”TB6612轻松胜任L298N易发热失稳。逻辑电平兼容性5V TTL/CMOS3.3V/5V CMOS需确认VCC用STM323.3V直接驱动TB6612需查手册确认VCC是否支持3.3V逻辑否则需电平转换。L298N对此无要求。内置保护功能无过流保护仅热关断过流、过热、欠压、短路保护TB6612在电机堵转时能自动切断输出保护芯片和MCUL298N需外加保险丝或电流检测电路。封装与散热Multiwatt15需外置散热片SSOP24可贴片散热面积小L298N散热依赖外置铝片TB6612靠PCB铜箔散热对PCB设计要求更高。2.5 我的选型经验什么情况下该果断放弃L298N场景一电池供电设备。比如用18650电池驱动小车L298N的1.8V压降意味着电池电压降到10V时电机实际只得到8.2V扭矩急剧下降TB6612的0.3V压降则能维持9.7V续航和动力更稳。场景二需要静音运行。家用机器人、桌面云台L298N在10kHz PWM下电机嗡嗡作响TB6612在25kHz下几乎无声。场景三闭环控制精度要求高。用霍尔编码器做PID调速L298N的慢开关速度导致PWM边沿模糊电流响应滞后PID调节容易震荡TB6612的快速响应让闭环更“跟手”。例外情况如果你只是做一个课堂演示用5V USB供电驱动一个微型减速电机L298N模块价格便宜、接线简单、不怕接错它依然是最省心的选择。但一旦项目走向实用化TB6612的综合优势就会碾压式体现。3. PWM控制原理与实操不只是analogWrite()那么简单3.1 PWM的本质用“开关”骗过电机的惯性很多人以为analogWrite(pin, value)就是输出一个“模拟电压”这是最大的误解。Arduino的PWM引脚实际输出的是一个方波信号高电平5V和低电平0V按固定周期交替通过改变高电平持续时间占整个周期的比例即占空比来等效出一个“平均电压”。比如占空比50%就是一半时间5V、一半时间0V平均电压2.5V。直流电机的转子有惯性电感有储能它无法瞬间响应这种高速开关于是感受到的是这个平均电压驱动下的平均电流从而产生平均转矩表现为稳定的转速。这就是PWM调速的物理基础——不是真的变电压而是用时间维度上的“开/关”比例去操控能量的平均输送速率。关键参数只有两个频率决定开关快慢和占空比决定能量比例。频率太低如100Hz人眼能看到LED闪烁电机也会“哒哒”抖动频率太高如1MHzMOSFET开关损耗剧增驱动芯片发热严重。找到那个“刚刚好”的平衡点是实操的第一课。3.2 Arduino平台下的PWM实操陷阱与规避Arduino Uno的PWM引脚3,5,6,9,10,11默认频率是490Hz引脚5,6为980Hz这个频率对LED调光够用但对电机驱动是灾难性的。我第一次用analogWrite(9, 128)控制L298N时电机发出刺耳的“滋滋”声用手摸电机外壳能感觉到明显震动用示波器看电流波形纹波峰峰值高达800mA。原因很简单490Hz远低于电机电感的滤波截止频率电流无法平滑导致转矩脉动。解决方案是提高PWM频率。Arduino官方不提供直接修改PWM频率的API但可通过寄存器操作实现。以引脚9为例Timer1标准代码如下void setup() { // 设置引脚9为输出 pinMode(9, OUTPUT); // 配置Timer1为快速PWM模式预分频1TOPICR119999 → 频率16MHz/(1*20000)800Hz TCCR1B _BV(WGM13) | _BV(CS10); // 快速PWM无预分频 ICR1 19999; // TOP值决定周期 OCR1A 10000; // 占空比50% (10000/20000) TIMSK1 _BV(OCIE1A); // 使能比较匹配中断可选 }这段代码将引脚9的PWM频率提升至800Hz电机噪音明显降低。但800Hz仍不够理想。更优解是使用专用库如TimerOne库一行代码即可#include TimerOne.h void setup() { Timer1.initialize(1000); // 设置周期为1000μs → 频率1kHz Timer1.pwm(9, 512); // 引脚9占空比50% (512/1024) }实测表明对于大多数12V小型直流电机1kHz~5kHz是噪音与效率的黄金区间TB6612可轻松上到20kHz彻底静音。3.3 STM32平台的高级PWM配置不只是频率还有死区在STM32上PWM配置远不止改个频率。以STM32F103C8T6Blue Pill为例其高级定时器TIM1/TIM8支持互补PWM输出和可编程死区时间。这对H桥驱动至关重要。H桥的上下桥臂如Q1/Q2绝不能同时导通否则会造成电源短路俗称“直通”瞬间烧毁MOSFET。死区时间就是在上桥臂关断后、下桥臂开通前插入一段所有开关都关闭的安全间隔。STM32的HAL库提供了便捷配置// 配置TIM1通道1为互补PWM死区时间200ns htim1.Instance TIM1; htim1.Init.Prescaler 71; // 72MHz主频 / (711) 1MHz计数频率 htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period 999; // 1MHz / 1000 1kHz PWM频率 htim1.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim1); // 配置通道1CH1/CH1N互补输出 sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; // 初始占空比50% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCNPolarity TIM_OCNPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; sConfigOC.OCIdleState TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState TIM_OCNIDLESTATE_SET; HAL_TIM_PWM_ConfigChannel(htim1, sConfigOC, TIM_CHANNEL_1); // 启用死区生成插入200ns延迟 HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig); sBreakDeadTimeConfig.DeadTime 1; // 死区时间单位计数器周期1us sBreakDeadTimeConfig.BreakEnable DISABLE; HAL_TIMEx_ConfigBreakDeadTime(htim1, sBreakDeadTimeConfig);这段配置不仅设定了1kHz PWM还强制加入了1us的死区确保H桥安全。这是L298N模块无法提供的底层保护也是专业驱动设计的分水岭。3.4 硬件滤波与电流检测让PWM从“能用”到“好用”仅仅提高PWM频率还不够。电机是感性负载电流变化滞后于电压导致实际电流波形仍有纹波。为了获得更平滑的转矩可在电机两端并联一个RC低通滤波器如100nF电容10Ω电阻吸收高频噪声。更重要的是电流检测——这是实现闭环控制的前提。最常用方法是在H桥低端GND侧串联一个0.1Ω精密采样电阻用运放如LM358将其微小压降1A电流产生0.1V放大10倍至1V再送入MCU的ADC。我曾因采样电阻功率选错用了1/4W电阻在2A电流下电阻烧毁开路导致整个驱动失效。正确做法是选用2W以上的金属膜电阻并确保运放供电与MCU共地。电流检测信号不仅是保护依据过流关断更是PID控制器的反馈源其精度和响应速度直接决定控制品质。4. PID控制实战从“调参玄学”到“可复现的工程方法”4.1 PID不是魔法是误差的积分与微分的艺术PID控制被神化了其实它非常朴素P比例项让系统快速响应误差I积分项消除静态误差比如设定转速100rpm实际总在95rpm徘徊D微分项抑制超调和震荡比如加速时冲过头再回调。公式Output Kp * Error Ki * ∫Error dt Kd * d(Error)/dt中Kp、Ki、Kd就是三个需要调整的“旋钮”。新手常陷入误区以为调大Kp就能更快结果系统疯狂震荡以为加Ki就能消除误差结果系统缓慢爬升后剧烈超调。根本原因在于PID参数不是孤立存在的它们与被控对象电机负载的物理特性强耦合。一个空载电机和一个带齿轮箱的电机同一套参数效果天壤之别。真正的调参是先理解你的“对象”。4.2 电机系统建模用阶跃响应看清它的脾气在调PID之前我必做一件事给电机一个阶跃指令比如从0%突然跳到50%占空比用示波器或逻辑分析仪记录编码器反馈的转速曲线。这条曲线就是电机的“性格画像”。我记录过一款12V/3000rpm直流电机空载的典型响应上升时间约120ms超调量15%稳定时间约300ms。这意味着它是一个相对“迟钝”但“温和”的系统适合较小的Kp和适中的Ki。而另一款带10:1减速箱的电机上升时间长达800ms几乎没有超调但稳态误差大就需要更大的Ki来“推”它到位。建模不需要复杂公式一张实测曲线图足矣。它告诉你如果响应太慢优先调大Kp如果稳不住优先调大Ki如果来回晃优先调大Kd或减小Kp。4.3 Ziegler-Nichols临界比例度法最可靠的工程调参起点放弃凭感觉乱试。Ziegler-Nichols法是工业界验证过的可靠起点。步骤如下关闭I、D项Ki0, Kd0只留Kp从小值开始如0.1逐渐增大施加阶跃指令观察系统响应直到输出出现等幅振荡既不衰减也不发散记录此时的临界增益Ku和振荡周期Tu按下表计算初始PID参数控制器类型KpKiKdP0.5*Ku--PI0.45*Ku0.54*Ku/Tu-PID0.6*Ku1.2*Ku/Tu0.075KuTu我用此法调试一台带编码器的TB6612驱动电机测得Ku2.8, Tu0.15s算得PID初始值为Kp1.68, Ki22.4, Kd0.0315。以此为起点再微调发现Ki稍大导致响应迟滞遂降至18Kd过小仍有轻微超调增至0.045。最终参数稳定可靠从0rpm加速到1000rpm仅需0.35s超调3%稳态误差1rpm。这个过程耗时不到20分钟远胜于盲目试错数小时。4.4 编码器反馈的陷阱分辨率、倍频与软件滤波PID的“眼睛”是编码器。但编码器数据不是拿来就用的。常见AB相增量编码器每转输出N个脉冲如1000PPR。但若只计数A相上升沿分辨率仅为1000若利用A/B相四倍频检测A/B相的全部边沿分辨率可达4000。我在调试中曾因未启用四倍频导致PID控制器对微小转速变化“视而不见”Kp不得不调得极大引发震荡。此外编码器信号受电磁干扰原始脉冲可能有毛刺。我的做法是在MCU端用硬件滤波RC电路软件消抖如连续3次采样相同才确认再用滑动窗口均值滤波窗口大小10平滑转速计算值。转速计算公式为RPM (Count_in_100ms * 600) / (PPR * 10)。其中600是换算系数100ms内计数×61秒计数×601分钟10是采样周期100ms。这个公式必须根据你的实际PPR和采样周期重新计算抄错一个数字转速就全乱。4.5 实战PID代码框架清晰、可维护、带保护以下是我在STM32上使用的精简PID代码强调可读性和安全性typedef struct { float Kp, Ki, Kd; float setpoint; // 设定值rpm float input; // 当前反馈值rpm float output; // 输出值PWM占空比0~100 float error; // 当前误差 float last_error; // 上次误差 float integral; // 积分项 float max_output; // 输出上限防饱和 float min_output; // 输出下限 } PID_Controller; void PID_Init(PID_Controller* pid, float kp, float ki, float kd, float max_out, float min_out) { pid-Kp kp; pid-Ki ki; pid-Kd kd; pid-max_output max_out; pid-min_output min_out; pid-integral 0.0f; pid-last_error 0.0f; } float PID_Compute(PID_Controller* pid, float setpoint, float input) { pid-setpoint setpoint; pid-input input; pid-error pid-setpoint - pid-input; // 比例项 float p_term pid-Kp * pid-error; // 积分项带抗饱和 pid-integral pid-Ki * pid-error; if (pid-integral pid-max_output) pid-integral pid-max_output; if (pid-integral pid-min_output) pid-integral pid-min_output; // 微分项使用误差微分避免设定值突变引起的冲击 float d_term pid-Kd * (pid-error - pid-last_error); pid-output p_term pid-integral d_term; pid-last_error pid-error; // 输出限幅 if (pid-output pid-max_output) pid-output pid-max_output; if (pid-output pid-min_output) pid-output pid-min_output; return pid-output; }关键点积分抗饱和防止积分项累积过大导致超调、微分项基于误差而非输入避免设定值跳变时的剧烈输出、输出硬限幅保护驱动芯片。这些不是锦上添花是保证系统鲁棒性的基石。5. 常见问题与排查技巧实录那些手册里不会写的坑5.1 “电机不转”问题的三级排查法这是最高频问题但原因千差万别。我建立了一套三级排查法从外到内10分钟内定位第一级电源与连接5分钟提示永远先怀疑电源。用万用表测电机两端电压不是测驱动模块输入电压。我曾因USB供电不足仅500mAL298N模块指示灯亮但电机不转实测电机端电压仅2.3V。检查电机电源VM是否独立、足够L298N需≥7V才能驱动12V电机因压降大检查逻辑电源VCC是否接入TB6612的STBY引脚是否拉高悬空不工作检查方向控制线IN1/IN2电平是否符合真值表如L298NIN11, IN20为正转用导线短接驱动模块的OUT1/OUT2听电机是否有“咔哒”声判断电机本身是否完好。第二级信号与逻辑3分钟注意示波器是神器。没有示波器用LED限流电阻接PWM引脚看是否闪烁。用示波器测MCU的PWM引脚确认波形存在且占空比可调测驱动芯片的使能端EN或STBY确认为高电平测方向控制端IN1/IN2确认电平组合正确如TB6612AIN11, AIN20为正转且PWMA有PWM。第三级芯片与负载2分钟手摸驱动芯片是否异常烫手70℃若是检查散热、负载是否过大、是否存在短路断开电机测OUT1/OUT2间电阻应为电机线圈电阻几Ω~几十Ω若为0Ω则电机内部短路若为∞Ω则开路最后一步更换同型号驱动芯片。L298N和TB6612都曾因静电击穿导致部分通道失效现象是单向能转反向不转。5.2 “电机抖动/噪音大”问题的根源与对策抖动不是电机质量问题而是控制系统不匹配的信号。我总结三大主因PWM频率过低如前所述490Hz是罪魁祸首。对策提升至1kHz以上TB6612可上20kHz。电源纹波过大电机启停瞬间的大电流冲击导致VM电压跌落影响驱动芯片工作。对策在VM引脚就近2cm并联一个4700μF电解电容100nF陶瓷电容形成高低频滤波。我曾因忽略此点在驱动大功率电机时L298N频繁重启。编码器信号干扰AB相线未双绞、未远离电机动力线导致脉冲丢失或误触发。对策AB相线必须双绞并与电机线分开走线必要时加磁环。在STM32上开启GPIO的上拉电阻GPIO_PULLUP可增强抗干扰能力。5.3 “PID控制震荡/不收敛”问题的诊断树当PID调出来效果不好按此树状图快速诊断PID震荡/不收敛 ├─ 是超调后反复震荡 → Ki过大 或 Kd过小 → 减小Ki增大Kd ├─ 是缓慢爬升后大幅超调 → Kp过小Ki过大 → 增大Kp减小Ki ├─ 是始终达不到设定值 → Ki过小 或 积分饱和 → 增大Ki检查积分抗饱和逻辑 ├─ 是响应极慢 → Kp过小 → 逐步增大Kp每次0.2 └─ 是输出在零附近跳变 → 编码器分辨率不足 或 信号干扰 → 启用四倍频加强滤波我曾遇到一个案例电机设定100rpm实际在90~110rpm间缓慢摆动。检查发现Ki0纯P控制无法消除稳态误差。将Ki从0调至5摆动消失但响应变慢再将Kp从1.0增至1.5达到理想效果。这个过程不是玄学是遵循物理规律的工程调试。5.4 散热与可靠性被忽视的“隐形杀手”驱动芯片的失效80%源于散热不良。L298N的热阻θJA典型值为35°C/W意味着每消耗1W功耗芯片温度比环境高35°C。在40℃环境温度下2W功耗就让芯片达110℃远超其150℃结温极限。我的散热方案L298N必须配铝制散热片≥50×50×20mm用导热硅脂填充芯片与散热片间隙再用螺丝压紧。实测可将温升控制在40°C以内。TB6612虽热阻低θJA≈60°C/W但SSOP24封装散热面积小。对策PCB上为芯片铺满铜箔≥5cm²并通过多个过孔连接到内层大面积地平面。我设计的PCBTB6612在1.2A持续电流下温升仅25°C。最后一条血泪经验永远在电机电源线上串联一个自恢复保险丝PPTC。它能在电机堵转时电流骤增至5A几秒内断开保护驱动芯片和MCU故障排除后自动恢复。这比焊一个一次性保险丝省事一百倍。6. 从单电机到系统集成扩展思路与实用建议6.1 多电机协同同步与独立控制的取舍一个项目很少只用一个电机。小车要左右轮差速机械臂要多关节联动。这里有两个路线独立控制每个电机配独立驱动芯片和PID控制器。优点是各轴解耦调试简单缺点是MCU资源占用大每个PID需定时器、ADC、PWM通道。STM32F103可轻松驱动4路。主从同步一个主电机PID输出作为参考其他电机通过跟随算法如位置/速度前馈同步。优点是节省资源实现严格同步缺点是主轴故障会导致全系统瘫痪。我做云台时采用独立控制确保俯仰和偏航互不干扰做传送带时用主从保证多段速度一致。6.2 从裸机到RTOS何时需要操作系统“裸机PID”足够应对大多数场景。但当你的系统加入更多任务如蓝牙通信接收新转速指令、OLED显示实时数据、按键设置参数、SD卡记录日志……裸机的while(1)循环会变得臃肿难维护。这时FreeRTOS是自然选择。它能将PID控制、通信、显示等任务分离各自拥有独立栈空间和优先级。我将PID任务设为最高优先级configLIBRARY_MAX_PRIORITIES-1确保控制周期严格准时如1ms不受其他任务阻塞。移植FreeRTOS到STM32只需添加几个文件网上教程极多两天即可上手。6.3 安全与冗余让系统“失败得优雅”任何电机系统都必须考虑失效模式急停硬件层面为驱动芯片的使能端EN/STBY设计一个独立的物理按钮按下即切断所有输出不依赖MCU软件。堵转保护在PID代码中加入电流阈值判断若ADC检测电流持续2A超过500ms强制停止并报警。看门狗启用MCU的独立看门狗IWDG防止PID任务因死循环或中断冲突而卡死。喂狗操作放在PID主循环末尾确保控制逻辑正常运行。这些不是“过度设计”而是产品化的必经之路。我见过太多DIY项目因为缺少一个急停按钮在电机失控时撞毁了整个工作台。6.4 学习路径建议从点亮LED到驾驭电机如果你刚入门我建议一条务实的学习路径第一周用Arduino点亮LED理解digitalWrite/analogWrite学会用万用表测电压/电流第二周接L298N模块让电机正反转用串口打印“电机启动”感受物理世界的反馈第三周加一个电位器用analogRead读取旋钮值映射为PWM占空比实现手动调速第四周加编码器用attachInterrupt计数计算并打印实时转速理解反馈概念第五周写第一个PID控制器目标是让电机稳定在某个转速接受Ziegler-Nichols法调参训练第六周及以后引入TB6612尝试更高频率PWM加入OLED显示用手机APP通过蓝牙发送指令。不要试图一步登天。电机驱动的魅力正在于每一步都能看到、听到、摸到实实在在的变化。当你第一次调出一条平稳的转速曲线那种成就感是任何虚拟
返回列表