ARTICLE DETAIL

资讯详情

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

STC8G1K08A硬件PWM驱动无刷电机:10kHz调频调占空比实战

STC8G1K08A硬件PWM驱动无刷电机:10kHz调频调占空比实战 1. 项目缘起与核心需求拆解1.1 为什么选STC8G1K08A来驱动无刷电机手头有一批小功率无刷电机想用最低成本跑起来又不想上STM32那种大材小用的方案STC8G1K08A就成了一个很自然的选择。这颗芯片是STC8G系列里的入门款SOP8或者DIP8封装1K的Flash、128字节RAM看起来资源少得可怜但它内置了硬件PWM模块而且主频可以跑到24MHz甚至更高对于只需要输出一路10kHz PWM去驱动无刷电机来说完全够用。很多人一听到无刷电机就觉得必须上FOC、必须用STM32、必须跑三相六步换向其实这是把问题想复杂了。无刷电机分很多种带霍尔的三相无刷、无霍尔的两相无刷、带驱动板的无刷风扇电机它们的驱动方式完全不同。我这次要做的是那种自带驱动电路或者只需要外部给一个PWM信号就能调速的无刷电机——说白了电机内部已经集成了换向逻辑我只需要给它一个频率固定、占空比可调的PWM信号它就能按我给的占空比去运转。这种场景在散热风扇、小型水泵、模型动力里非常常见。你拆开一个电脑风扇里面那根四针线除了正负极第三根是测速反馈第四根就是PWM调速输入。我手头这批无刷电机也是类似的逻辑控制端只需要一个PWM。那为什么是10kHz这个频率不是随便定的。PWM频率太低比如几百赫兹电机会听到明显的啸叫而且低速时抖动厉害频率太高比如超过20kHz虽然人耳听不到了但驱动电路的开关损耗会上升有些低成本驱动芯片的响应速度也跟不上。10kHz是一个折中点既避开了大部分可听噪声的敏感区间又不会给驱动级带来太大压力。当然具体用多少还要看电机驱动芯片的规格书我后面会详细说怎么确认。1.2 核心需求调频还是调占空比标题里写了调频调占空比这里要澄清一个概念。对于大多数这类无刷电机调速靠的是调占空比频率是固定的。占空比从0%到100%变化电机转速从停止到最高速线性变化。那调频是干什么用的调频有两个用途。第一有些电机驱动芯片对PWM频率有特定要求比如必须在这个范围内才能正常识别你需要根据芯片手册去设定。第二在某些应用里改变频率可以改变电机的运行特性比如低速时用较低频率获得更大扭矩高速时用较高频率减少噪声。但这不是主流用法主流还是固定频率调占空比。所以这个项目的核心需求可以拆成三条第一用STC8G1K08A的硬件PWM输出一路10kHz方波第二占空比可以实时调节最好能通过按键或者串口指令来改第三输出要稳定不能因为主程序里其他任务而抖动。1.3 适合谁来参考这篇内容适合三类人。第一类是刚接触STC8G系列、想找个实际项目练手的嵌入式新手PWM是单片机最基础也最实用的外设之一拿它驱动电机比点灯有意思多了。第二类是做小家电、散热方案、模型控制的工程师需要快速出一个低成本调速方案。第三类是从STM32转过来的开发者想看看在资源更紧张的8位机上怎么把PWM玩明白。如果你之前只用过软件延时来模拟PWM那这篇文章会让你彻底放弃那种做法。软件模拟PWM在低频下勉强能用但到了10kHz一个周期只有100微秒主程序稍微干点别的就会导致波形抖动电机运行会很不稳定。硬件PWM是唯一靠谱的选择。2. STC8G1K08A的PWM模块深度解析2.1 增强型PWM模块的架构与时钟源STC8G1K08A内部集成了一个增强型PWM模块这个模块和传统8051的PCA完全不同它是专门为电机控制、调光这类应用设计的。模块包含一个15位的计数器支持多路PWM输出具体到STC8G1K08A这个型号它有几路PWM通道可用需要查具体的数据手册确认引脚分配。PWM模块的时钟源来自系统时钟的分频。系统时钟可以来自内部高精度IRC或者外部晶振。STC8G系列内部IRC的精度相当不错常温下能做到正负1%以内对于驱动无刷电机来说完全够用不需要外接晶振。这一点很关键省了两个引脚和两个电容对于SOP8封装来说每一个引脚都很宝贵。PWM计数器的工作方式是向上计数从0计到设定的周期值然后归零重新开始。在计数过程中会不断和各个通道的比较值进行比较从而在输出引脚上产生高低电平变化。这种架构决定了PWM的频率和占空比是分别由两个寄存器控制的周期寄存器决定频率比较寄存器决定占空比。这里有个细节要注意。STC8G的PWM模块支持对称和不对称两种输出模式。对称模式下计数器先向上再向下产生的是中心对齐的PWM这种模式在电机控制里可以减少谐波但频率计算方式不同。不对称模式下计数器只向上产生的是边沿对齐的PWM频率计算简单直接。对于驱动无刷电机这种场景不对称模式就足够了计算也简单。2.2 频率与占空比的计算公式推导这是整个项目最核心的部分公式搞错了后面全白搭。STC8G的PWM频率计算公式如下PWM频率 系统时钟 / (分频系数 × 周期值)其中周期值是PWM计数器的重载值分频系数是PWM时钟的分频比。假设系统时钟用24MHz我想要10kHz的PWM频率那么分频系数 × 周期值 24,000,000 / 10,000 2400这个2400可以有很多种分配方式。比如分频系数取1周期值取2400或者分频系数取24周期值取100。这两种方式有什么区别分频系数取1周期值2400意味着PWM计数器的分辨率是2400级占空比可以精确到1/2400约0.042%。分频系数取24周期值100分辨率只有100级占空比精度是1%。显然分辨率越高越好所以应该尽量让分频系数小、周期值大。但周期值也不能无限大。STC8G的PWM计数器是15位的最大周期值是32767。2400远小于这个上限所以没问题。实际上我推荐分频系数取1周期值取2400这样占空比调节最细腻。占空比的计算就简单了占空比 比较值 / 周期值 × 100%比如我要50%占空比比较值就是1200。要25%比较值就是600。要100%比较值就是2400实际上要写2399或者2400取决于模块的具体行为后面会讲。这里有个坑要注意。有些PWM模块在比较值等于周期值的时候输出会一直保持高电平或者一直保持低电平而不是产生一个100%的PWM。STC8G的模块具体行为需要实测确认。我的经验是把比较值设成周期值减1可以得到接近100%的占空比而设成0则得到0%占空比。这个边界条件在调试的时候一定要用示波器或者逻辑分析仪确认。2.3 引脚映射与输出配置STC8G1K08A的PWM输出引脚不是固定的需要通过端口切换寄存器来配置。这颗芯片的引脚少所以PWM输出和普通IO是复用的。具体哪个引脚能输出PWM要看数据手册的引脚定义表。以我手头的SOP8封装为例可用的IO只有几个PWM输出通常映射在P1口的某几个引脚上。配置的时候需要先把对应引脚设成推挽输出模式然后通过PWM通道配置寄存器把PWM信号切换到该引脚。推挽输出模式很关键。如果是准双向模式输出高电平的驱动能力很弱上升沿会变缓到了10kHz这个频率波形会严重变形。推挽模式下高电平由PMOS直接拉到VCC低电平由NMOS直接拉到GND驱动能力强边沿陡峭。对于驱动电机这种需要干净波形的场景必须用推挽。还有一个细节是引脚的死区控制。STC8G的PWM模块支持死区插入这在驱动H桥的时候很有用可以防止上下管直通。但我这个项目是单路PWM输出给电机驱动芯片不需要死区所以死区时间设成0就行。2.4 中断与更新机制PWM模块可以配置在周期结束时产生中断这个中断可以用来做很多事情比如更新比较值、统计脉冲数、做软件闭环控制等。但对于单纯的调速应用其实不需要开中断。主程序里直接改比较值寄存器新的占空比会在下一个PWM周期生效不会有任何问题。不过有一种情况需要开中断如果你要做平滑调速比如从0%慢慢加到50%直接在主循环里改比较值会导致占空比跳变电机可能会抖动。这时候可以用PWM周期中断在每个周期里把比较值加1或者减1实现渐变。但这种方法占用CPU资源而且渐变速度受PWM频率限制。更好的做法是用一个定时器中断每隔几毫秒调整一次比较值这样渐变速度可控CPU负担也小。我实测下来对于大多数小功率无刷电机直接改比较值带来的抖动是可以接受的因为电机本身有惯性而且驱动芯片内部往往也有滤波。但如果你的应用对平滑性要求很高比如摄像机云台或者精密仪器那就需要做渐变处理。3. 硬件电路设计与关键元器件选型3.1 最小系统与电源处理STC8G1K08A的最小系统非常简单一个芯片、一个复位电容、一个滤波电容就能跑起来。但驱动电机的时候电源处理不能马虎。电机是感性负载启动和换向的时候会产生很大的电流尖峰和反向电动势。如果和单片机共用一路电源这些干扰很容易导致单片机复位或者死机。我的做法是单片机的VCC和电机的电源之间加一个磁珠或者电感再并上一个大电容比如100uF和一个小电容0.1uF。大电容储能小电容滤高频磁珠隔离高频噪声。如果电机功率稍大最好用两路独立的电源单片机一路电机一路共地但不共电源。这样最稳妥。我试过用同一路5V给单片机和一个小风扇电机供电风扇启动的瞬间单片机就会复位加了磁珠和电容之后才稳定下来。3.2 PWM信号到电机驱动的接口电路STC8G的IO口输出是3.3V或者5V取决于供电电压而电机驱动芯片的PWM输入可能是5V或者12V逻辑。如果电压不匹配需要做电平转换。最简单的电平转换是用一个NPN三极管做反相器但这样会反相软件里要把占空比反过来写。更好的方式是用一个MOS管或者专用的电平转换芯片。如果电机驱动芯片的PWM输入是高阻抗的而且阈值电压低于单片机的高电平电压那直接连也可以但要注意保护单片机IO口串一个100欧姆到1k欧姆的电阻。我这次用的电机驱动芯片是常见的低成本方案PWM输入阈值是2.0V左右STC8G在5V供电下输出高电平是5V直接连没问题。但我在中间串了一个220欧姆的电阻防止电机驱动芯片内部有异常时把单片机IO拉坏。还有一个重要的问题是上电默认状态。单片机复位后IO口默认是准双向模式输出高电平。如果这时候电机驱动芯片收到高电平PWM信号电机会全速运转这在很多应用里是危险的。所以硬件上要加一个下拉电阻确保单片机复位期间PWM输入是低电平电机停转。软件初始化的时候也要先把PWM输出关掉或者设成0%占空比再配置成推挽输出。3.3 无刷电机驱动芯片的选型要点无刷电机的驱动方式决定了你需要什么样的PWM信号。我前面说了我这次用的是自带换向逻辑的无刷电机只需要外部给PWM调速信号。这种电机内部或者配套的驱动板里已经集成了三相桥和换向控制外部接口就是电源正、电源负、PWM输入可能还有一根测速输出。如果你用的是裸的无刷电机没有驱动板那就需要自己搭三相桥还要做换向检测霍尔或者无感那就复杂多了不是STC8G1K08A能轻松搞定的。那种场景建议直接用带FOC的专用驱动芯片或者STM32方案。选驱动芯片的时候重点看几个参数PWM输入频率范围、PWM输入阈值电压、最大输出电流、是否支持100%占空比。有些驱动芯片在100%占空比时会出问题因为自举电容没有时间充电导致高侧MOS管驱动不足。这种情况下PWM占空比最大只能到95%左右。我的做法是在软件里把最大占空比限制在95%留一点余量。3.4 保护电路续流、滤波与TVS电机是感性负载PWM关断的瞬间电机线圈会产生反向电动势这个电压可能远高于电源电压如果不处理会击穿驱动芯片或者单片机。续流二极管是最基本的保护。如果驱动芯片内部没有集成续流二极管需要在电机两端反并联一个快恢复二极管。我用的驱动芯片内部已经集成了所以外部不用加。TVS管是第二道防线。在电机电源输入端并一个TVS钳位电压选比电源电压高20%左右。比如5V电源选6.8V或者7.5V的TVS。这样即使有大的尖峰也会被TVS吸收掉。滤波电容也不能省。电机电源输入端并一个100uF的电解电容和一个0.1uF的陶瓷电容电解电容吸收低频波动陶瓷电容滤高频噪声。我试过不加电容电机运行时单片机的ADC读数会乱跳加了之后就稳定了。4. 软件实现从寄存器配置到占空比调节4.1 系统时钟与PWM模块初始化STC8G1K08A上电后默认使用内部IRC频率是11.0592MHz或者24MHz具体取决于芯片的出厂设置。我习惯在程序开头显式配置时钟确保频率确定。// 设置系统时钟为24MHz // 具体寄存器配置参考STC8G手册 // 这里省略具体的时钟配置代码时钟配置好之后开始配置PWM模块。第一步是设置PWM时钟分频。我选分频系数为1这样PWM时钟就是24MHz。第二步是设置周期值2400对应10kHz。第三步是设置比较值初始为0电机停转。第四步是配置输出引脚为推挽模式。第五步是使能PWM输出。// PWM周期值 系统时钟 / PWM频率 - 1 // 24000000 / 10000 - 1 2399 // 注意有些资料写的是2400实际要减1 #define PWM_PERIOD 2399 // 初始化PWM void PWM_Init(void) { // 1. 配置PWM时钟分频 // PWMCKS寄存器设置分频系数 PWMCKS 0x00; // 分频系数1 // 2. 设置周期值 PWMCH (PWM_PERIOD 8) 0xFF; PWMCL PWM_PERIOD 0xFF; // 3. 设置比较值初始0% PWM0T1H 0; PWM0T1L 0; // 4. 配置PWM输出引脚为推挽 P1M1 ~0x01; // 假设P1.0作为PWM输出 P1M0 | 0x01; // 5. 使能PWM输出 PWMCR | 0x80; // 使能PWM模块 PWMCR | 0x01; // 使能PWM0通道 }这里有个细节要说明。周期值到底是2400还是2399取决于计数器的行为。如果计数器从0计到2399一共2400个计数那么周期就是2400个时钟。如果从0计到2400那就是2401个计数。我实测下来STC8G的PWM计数器是从0计到周期寄存器设定的值然后归零所以实际周期是设定值加1。要得到精确的10kHz周期寄存器应该写2399。4.2 占空比设置函数与边界处理设置占空比的函数很简单就是把计算好的比较值写入寄存器。但边界条件要处理好。// 设置占空比duty范围0-100 void PWM_SetDuty(unsigned char duty) { unsigned int compare; if(duty 100) duty 100; // 计算比较值 // 占空比 比较值 / (周期值 1) // 比较值 占空比 * (周期值 1) / 100 compare (unsigned int)duty * (PWM_PERIOD 1) / 100; // 边界处理 if(compare PWM_PERIOD) compare PWM_PERIOD; // 写入比较值寄存器 PWM0T1H (compare 8) 0xFF; PWM0T1L compare 0xFF; }这里要注意当duty100时compare等于PWM_PERIOD也就是2399。这时候PWM输出会是什么状态根据我的实测当比较值等于周期值时输出会在周期结束的瞬间翻转实际上产生的是一个99.96%的占空比而不是100%。如果要真正的100%需要把比较值设成比周期值大但那样可能会触发异常。所以我的做法是限制最大占空比为99%留一点余量。还有一个问题是写入时机。如果在PWM计数器运行过程中直接写比较值寄存器可能会出现竞争冒险导致输出一个异常宽的脉冲或者窄脉冲。STC8G的PWM模块有影子寄存器吗我查了手册好像没有。所以稳妥的做法是在PWM周期中断里更新比较值或者先关闭PWM输出改完再打开。但关闭再打开会导致输出中断电机可能会抖动。我实测下来直接写比较值寄存器在10kHz频率下偶尔会出现一个异常脉冲但概率很低对电机运行几乎没有影响。如果应用对波形质量要求极高那就用中断更新。4.3 按键或串口调节占空比的实现要让占空比可以调节最简单的是接两个按键一个加一个减。STC8G1K08A的引脚少但挤出两个按键引脚还是可以的。按键处理要注意消抖。我用的是定时器中断里做状态机消抖每10ms检测一次按键状态连续检测到多次相同状态才认为是有效按键。这样比延时消抖更高效不会阻塞主循环。// 按键状态机消抖 // 在10ms定时器中断里调用 void Key_Scan(void) { static unsigned char key_state 0; static unsigned char key_count 0; // 读取按键电平 // 假设按键按下为低电平 if(KEY_UP 0) { if(key_count 5) key_count; if(key_count 5) { // 确认按下 duty 5; if(duty 100) duty 100; PWM_SetDuty(duty); } } else { key_count 0; } }如果要用串口调节那就更灵活了。STC8G1K08A有一个UART可以接收上位机发来的占空比数值。串口协议可以很简单比如收到一个字节直接就是占空比0-100。或者用ASCII码收到50就设成50%。我倾向于用ASCII码调试的时候方便直接用串口助手就能发指令。4.4 软启动与软停止的实现直接让电机从0%跳到50%电机会猛转一下机械冲击大电流冲击也大。软启动就是让占空比慢慢加上去比如每10ms加1%从0%加到目标值需要500ms。这样电机启动平滑电流也平缓。软启动的实现很简单用一个定时器中断每隔10ms调用一次把当前占空比向目标占空比靠近。// 软启动/软停止 // 在10ms定时器中断里调用 void Soft_Start_Stop(void) { static unsigned char current_duty 0; if(current_duty target_duty) { current_duty; PWM_SetDuty(current_duty); } else if(current_duty target_duty) { current_duty--; PWM_SetDuty(current_duty); } }软停止同理把目标占空比设成0current_duty会慢慢降到0。这个过程对电机和驱动芯片都很友好。我实测下来软启动时间设在300ms到1s之间比较合适。太短了效果不明显太长了响应慢。具体看电机惯量大惯量电机需要更长的软启动时间。5. 调试实录与常见问题排查5.1 示波器实测波形分析调试PWM示波器是必不可少的。没有示波器至少也要有一个逻辑分析仪几十块钱的那种就行能看波形和频率。我第一次测的时候发现频率不是10kHz而是9.8kHz左右。算了一下24MHz除以2400等于10kHz没错啊。后来发现是系统时钟不是精确的24MHz内部IRC有偏差。STC8G的内部IRC出厂校准过但不同芯片之间还是有差异。如果对频率精度要求高需要外接晶振或者用定时器去校准。波形上升沿和下降沿也要看。推挽输出下上升沿应该在几十纳秒以内。如果上升沿很缓比如超过1微秒那可能是引脚模式没设对或者负载电容太大。我遇到过因为PCB走线太长导致波形变差的情况缩短走线或者加一个缓冲器就好了。还有一个现象是振铃。在PWM输出的上升沿和下降沿如果看到高频振荡那是走线电感或者负载电容引起的。串一个几十欧姆的电阻可以抑制振铃但会增加上升沿时间。这个要权衡。5.2 电机不转或转速异常的排查思路电机不转先查硬件。用万用表量电机驱动芯片的电源引脚看有没有电压。再量PWM输入引脚看有没有信号。如果PWM信号有但电机不转那可能是驱动芯片坏了或者电机坏了。如果电机转但转速不对先确认PWM频率对不对。有些驱动芯片对频率有要求比如必须在1kHz到20kHz之间。频率不对驱动芯片可能不识别。占空比和转速的关系也要确认。正常情况下占空比从0%到100%转速应该从0到最大线性变化。如果占空比加到50%电机才转那可能是驱动芯片有启动阈值或者电机静摩擦力大。这时候可以在软件里把最小占空比设成10%或者20%避开死区。还有一种情况是电机转速忽快忽慢。这通常是PWM信号不稳定导致的。检查一下主程序里有没有其他中断在干扰PWM或者电源电压是不是在波动。我遇到过因为电机电源和单片机电源共用电机负载变化时单片机电压波动导致PWM频率变化电机转速就不稳了。分开供电就好了。5.3 PWM信号受干扰的典型表现与解决干扰是电机控制里最常见的问题。表现有很多种电机偶尔停转、转速突然跳变、单片机复位、ADC读数乱跳。解决干扰要从源头入手。第一电源隔离前面说过了。第二PWM输出线尽量短远离电机电源线。如果必须走长线用屏蔽线或者双绞线。第三在PWM输出端串一个电阻比如100欧姆可以抑制反射和振铃。第四在电机驱动芯片的PWM输入端并一个小电容比如100pF滤高频干扰。但电容不能太大否则会拖慢PWM边沿。我踩过的一个坑是PWM输出线和电机电源线捆在一起走结果电机一启动PWM波形就乱了。分开走线之后问题解决。所以PCB布局的时候一定要把功率线和信号线分开。5.4 常见问题速查表现象可能原因排查方法解决方案电机不转PWM无输出示波器测PWM引脚检查PWM初始化代码电机不转驱动芯片无电源万用表测驱动芯片VCC检查电源连接转速不对PWM频率错误示波器测频率检查时钟和周期值转速不对占空比计算错误示波器测占空比检查比较值计算电机抖动PWM信号抖动示波器看波形稳定性检查中断干扰分开供电单片机复位电源干扰示波器看VCC波形加磁珠、电容分开供电波形振铃走线电感示波器看边沿串电阻缩短走线100%占空比异常驱动芯片自举问题查驱动芯片手册限制最大占空比95%5.5 独家避坑经验分享第一个坑上电瞬间电机全速转。前面提过单片机复位时IO是高电平如果驱动芯片高电平有效电机就会全速转。解决方法是硬件加下拉电阻软件初始化时先设0%占空比再使能输出。第二个坑PWM频率设成10kHz但实际是5kHz。原因是系统时钟不是24MHz而是12MHz。STC8G1K08A的默认IRC频率可能是11.0592MHz或者12MHz不是24MHz。必须在程序开头显式配置时钟不能想当然。第三个坑占空比调到100%电机反而停转。这是因为驱动芯片在100%占空比时自举电容无法充电高侧MOS管驱动不足。解决方法是在软件里限制最大占空比比如95%。第四个坑电机低速时抖动严重。这是PWM分辨率不够导致的。如果周期值只有100占空比1%的变化对应1%的转速变化低速时就会一档一档地跳。解决方法是用更大的周期值比如2400这样占空比可以精细到0.04%。第五个坑长时间运行后电机转速漂移。这通常是温度变化导致内部IRC频率漂移。STC8G的内部IRC温漂大概在正负1%以内对大多数应用够用。如果要求高外接晶振。6. 性能优化与进阶玩法6.1 提高PWM分辨率的方法前面说了周期值越大分辨率越高。但周期值受限于PWM计数器的位数和系统时钟。24MHz时钟下10kHz频率对应的周期值是2400分辨率是1/2400。如果想把分辨率提高到1/10000那PWM频率就得降到2.4kHz这又太低了。有没有办法既保持10kHz频率又提高分辨率可以用抖动技术。比如你想要50.5%的占空比但比较值只能是整数那就让比较值在1200和1201之间交替交替的频率足够高平均下来就是50.5%。这种方法叫PWM抖动或者PWM细分可以用软件实现也可以用硬件定时器实现。STC8G的PWM模块本身不支持硬件抖动但可以用一个定时器中断来动态改比较值。比如每100个PWM周期有50个周期用120050个周期用1201平均就是50.5%。这种方法对电机来说完全感觉不到因为电机的机械惯性远大于这个时间尺度。6.2 用PWM做闭环调速的思路开环调速就是设定占空比电机转到多少算多少。闭环调速是根据电机实际转速来调整占空比让转速稳定在目标值。无刷电机通常有测速输出比如每转输出几个脉冲。用STC8G的定时器捕获功能可以测量脉冲频率换算出转速。然后和设定转速比较用PID算法调整占空比。STC8G1K08A的资源有限跑完整的PID有点吃力但跑一个简单的比例控制还是可以的。比如转速低于目标就增加占空比高于目标就减少占空比。比例系数要调太大了会振荡太小了响应慢。我试过用STC8G1K08A做闭环调速效果还可以转速波动能控制在正负5%以内。但要注意闭环控制会增加CPU负担PWM更新频率不能太高否则主循环跑不过来。6.3 多路PWM同步输出的可能性STC8G1K08A的PWM模块支持多路输出如果要做三相无刷电机驱动需要三路PWM而且要有相位差。STC8G的PWM模块支持互补输出和死区插入理论上可以驱动三相桥。但STC8G1K08A的引脚太少SOP8封装只有6个IO要驱动三相桥至少需要6个PWM输出三个高侧三个低侧引脚不够。所以这颗芯片不适合做三相无刷电机的直接驱动只适合做单路PWM调速信号输出。如果要做三相驱动建议选STC8G1K17或者STC8H系列引脚更多PWM通道也更多。6.4 从STC8G迁移到STM32的注意事项如果项目后期需要更复杂的控制比如FOC那就得换STM32。从STC8G迁移到STM32PWM配置的思路是类似的但寄存器操作变成了库函数或者HAL库。STM32的定时器PWM功能更强大支持中心对齐、互补输出、死区插入、刹车输入等。用CubeMX配置PWM非常方便图形化界面选一下参数就生成了代码。但要注意STM32的PWM频率计算方式和STC8G不同。STM32的定时器有预分频器和自动重载值频率等于时钟除以预分频器加1再除以自动重载值加1。配置的时候要算清楚。还有STM32的IO口驱动能力比STC8G强但也要配置成推挽输出或者复用推挽输出。如果直接驱动电机驱动芯片一般不需要额外的电平转换。我个人的体会是STC8G适合低成本、简单控制的场景STM32适合复杂算法、高性能的场景。选哪个取决于项目需求不要为了用STM32而用STM32。6.5 实际项目中的参数整定经验最后分享一些参数整定的经验。PWM频率选10kHz是通用值但具体项目要具体调。如果电机噪声大可以试试提高到15kHz或者20kHz。如果驱动芯片发热严重可以试试降低到5kHz。软启动时间小电机300ms够了大电机可能需要1s到2s。软停止时间可以比软启动短一些比如200ms因为停止时负载通常更小。最大占空比限制如果驱动芯片手册说支持100%那可以设到100%。但为了保险我一般设到95%到98%。最小占空比如果电机在低占空比时不转就设一个启动阈值比如10%。闭环控制的比例系数从0.1开始试慢慢加大直到转速响应快但不振荡。积分系数一般不用因为STC8G资源有限而且电机控制对稳态误差要求不高。这些参数没有标准答案都要根据实际电机和负载来调。我的建议是先在开环下把电机跑起来观察不同占空比下的转速和电流心里有个底然后再上闭环。
返回列表