这段时间都在研究学习STC公司开源无刷无感驱动直流电机,源代码先前已经上传请教deepseek,虽然deepseek讲解很细,但有些细节还没弄懂,于是尝试串口输出查看代码运行情况失败了,最后采取多个LED来监视程序是否执行特定位置,驱动电压12伏,测试电机是大疆精灵四航测无人机电机。我在程序void PWMA_ISR(void) interrupt PWMA_VECTOR函数里,放置五个LED控制代码(P37\P10\P11\P26\P27),程序运行后,电机强拖转转停停反反复复,发现只有P11端口LED间歇性闪灭,其他灯都不工作,由此可判断程序压根没检测到电机反电动势过零情况,现在请教deepseek三个问题:一是STC公司梁工在论坛答复网友提问说:STC8电路中分压电阻10K与1.5K并联后电阻为1.3K,电容为103,则RC值为13us,究竟是那些电阻并联(附件上传分压电路图);二是程序转动检测疑问。代码是先设置A相下降沿,打开比较器CMP+选择A相,等待A相下降沿出现,接着是选择设置比较器CMP+选择B相,等待B相上升沿,但我对比程序中注解拍序 逆时针 顺时针,我的理解是拍序应该是0-5执行,按逆时针转分析,A相下降沿出现是第二拍序,后面应该是第三拍序C相上升沿,若按顺时针分析,A相下降沿出现,后面是B相上升沿,但程序后面计算出是顺时针转却刹车了,请问究竟是怎么一样时序。三是梁工测量反电动势是测量哪里,请明确在分压电路中指出示波器测量点
deepseek给出答复:问题一:梁工所说“分压电阻10K与1.5K并联后电阻为1.3K”是指哪些电阻?请看你的分压电路图(无霍尔传感器时使用): 并联电阻的由来:
从分压中点(即R37与R40的连接点、同时也是电容C18的正极)向源端看进去,等效电阻 ≈ R37 // R40 = 10kΩ // 1.5kΩ ≈ 1.3kΩ。这个等效电阻与电容C组成一阶RC低通滤波器,其时间常数 τ = R_eq × C。 小结:并联的两个电阻就是每相串联在信号通路上的10kΩ电阻和对地的1.5kΩ电阻,它们的并联值决定了RC滤波的等效电阻。 问题二:转动检测的时序疑问(A相下降沿之后,到底该等哪个沿?)1. 梁工给的拍序表(逆时针 vs 顺时针)
拍序 逆时针(换相通电相,反电动势过零) 顺时针(换相通电相,反电动势过零)
0AB, C↓AC, B↓
1AC, B↑AB, C↑
2BC, A↓CB, A↓
3BA, C↑CA, B↑
4CA, B↓BA, C↓
5CB, A↑BC, A↑
表中“A↓”表示A相反电动势下降沿,“B↑”表示B相反电动势上升沿,依此类推。 2. 你程序中转动检测的边沿顺序代码逻辑(run_mode == ROLL_CHECK 状态机): Index0 → 准备检测A相下降沿 Index1 → 等待A相下降沿(P11闪烁) → 检测到后切至B相,准备检测B相上升沿 Index2 → 等待B相上升沿 → 检测到后记录时间,切回A相,准备检测A相下降沿 Index3 → 等待A相下降沿 → 检测到后判断转向:
if(RollPahseTimeAB < StartTime) → 顺时针 → 刹车
else → 逆时针 → 启动电机
3. 这个顺序对应哪个转向?顺时针:从拍序表看,顺时针时A相下降沿出现在状态2(CB, A↓),之后下一个反电动势过零是状态3的B相上升沿(CA, B↑)。
→ 所以顺序 A↓ → B↑ 正是顺时针的特征。 逆时针:逆时针时A相下降沿出现在状态2(BC, A↓),之后下一个过零是状态3的C相上升沿(BA, C↑)。
→ 顺序应为 A↓ → C↑,而不是B↑。
结论:你的代码中检测 A下降沿 → B上升沿 实际上是在识别顺时针转动。但代码在判断出顺时针后却执行了刹车(P_PWM2N=1, P_PWM3N=1),而没有启动电机。这说明设计者期望的转动方向是逆时针,如果检测到顺时针则刹车并停止(可能为了重新尝试或报错)。 4. 你的困惑点“按逆时针分析,A相下降沿后应该是C相上升沿;按顺时针分析,A相下降沿后是B相上升沿。程序后面算出顺时针却刹车了。”
正解:你的理解完全正确。代码的逻辑就是: 如果检测到 A↓ → B↑(顺时针),则刹车; 如果检测到 A↓ → C↑(逆时针),才启动。
但代码中并没有等待C上升沿,而是通过时间比较来区分转向: 实际物理转动中,若为逆时针,A↓ 到下一个 A↓ 之间的三个边沿间隔基本相等(每60°电角度)。 代码里用了一个技巧:先测 A↓ → B↑ 的时间(T1),再测 B↑ → 下一个A↓ 的时间(T2)。
5. 为什么你实测电机只闪P11(等待A相下降沿)?电机“强拖转转停停”说明进入了启动强拖阶段(STARTING模式),强拖结束后进入转动检测(ROLL_CHECK)。 转动检测时,电机处于自由转动状态(PWM全部关闭)。你的电机可能因为惯性不足、负载过大或强拖结束时机不对,导致实际没有产生有效的反电动势。 程序一直在 RollCheckIndex == 1 里等待 A相下降沿,P11 不断翻转(LED闪烁),但永远等不到边沿,因为电机已停转或反电动势太小。 其他LED(P10、P26、P27)分别在检测到A下降沿、B上升沿、再次A下降沿时才翻转,所以它们不亮,印证了第一个边沿都没检测到。
问题三:梁工测量反电动势的示波器测量点在分压电路图中,请测量RC滤波后的信号点,即每个10kΩ电阻与1.5kΩ电阻的连接处,同时也是电容的正极。具体位置: A相测量点:R37与R40的连接点(电容C18正极) B相测量点:R36与R39的连接点(电容C17正极) C相测量点:R35与R38的连接点(电容C16正极)
测量注意事项: 用示波器探头(x10档)测量这些点对地,可以看到经过分压衰减(约1.5/11.5 ≈ 0.13倍)和RC滤波后的反电动势波形。 原始电机相线电压可能高达几十伏(你的12V供电下,相线尖峰可能更高),直接测量有风险,测量分压中点更安全。 调试时建议同时测两相(用双通道),观察过零点的顺序和相位差。
如果一直检测不到过零,可能原因: 强拖力度不够,电机未真正旋转到能产生足够反电动势的速度。 RC滤波电容(223 = 22nF)过大,使信号严重滞后且幅度衰减过大,尤其是在低速时。可以临时换成103(10nF)试试。 比较器输入引脚可能被其他外设复用,或分压电阻值计算有误(确保1.5kΩ对地分压后电压在MCU允许范围0~5V内)。
建议:用示波器确认反电动势波形:在强拖(STARTING模式)期间,测量分压中点(如上所述),看是否有明显的梯形波或正弦波,过零点是否清晰。 减小滤波电容:将C16~C18从223(22nF)换成103(10nF),甚至472(4.7nF),以减小RC延时(13μs→6μs),更容易捕捉高速边沿。 提高强拖最终速度:增大启动结束时的PWM占空比(START_PWM_DUTY),让强拖结束时电机有足够惯性自由旋转几圈。 检查比较器配置:确认 CMPCR1 寄存器设置正确,比较器正负输入端选择无误(正端接分压中点,负端为虚拟中性点或由PWM合成的中点参考)。
希望以上解析能帮你理清思路。如果还有疑问,可以继续提供示波器截图或更详细的代码片段(如比较器初始化部分)。
|