D223的PWM电机控制:6路独立脉冲+加减速算法深度解析

采集卡还能控制电机?D223内置6路独立PWM输出,支持脉冲计数和加减速控制,可以直接驱动步进/伺服电机驱动器。本文从硬件到代码,完整解析PWM电机控制方案。


一、硬件基础:达林顿开漏输出

D223的PWM输出采用达林顿开漏输出架构,与数字输出(DO)共用引脚img_147。电气特性如下:

参数 规格
通道数 6路独立PWM
输出类型 达林顿开漏(NPN型)
频率范围 1Hz~10kHz(最新固件优化后)
占空比精度 0~100%可调,分辨率0.1%
脉冲数范围 0~65535(16位无符号)
驱动能力 100mA/通道
负载电压 5-24V DC
响应时间 ≤10μs

注意:PWM最近已优化到10kHznote_259。频率下限为10Hz,防止电机运动到最后时刻速率太慢导致运动时间过长word_5

达林顿输出内部为NPN型,外部需要上拉负载才能正常工作。PWM可以驱动步进或伺服电机驱动器,用来发送脉冲控制电机word_5

重要提醒:达林顿管内置续流功能,但仍建议用户在继电器、电磁阀就近放置续流二极管,达林顿只能辅助续流,不能完全替代外部续流二极管note_259


二、PWM参数结构体

D223固件中,PWM参数存储在FRAM中,结构如下note_63

c 复制代码
typedef struct {
    u8  pwmEnable[6];       // PWM使能(6路)
    u16 pwmFreq[6];          // 目标频率
    u16 pwmDuty[6];          // 占空比(×10精度,50% → 500)
    u16 pwmPulseNum[6];      // 脉冲数(0=连续输出)
    u16 pwmAccUnit[6];       // 加减速单位
} pwmDatas;

运行时变量note_63note_69

c 复制代码
u16 presentFreq[6];           // 当前实际频率
u32 pwmPulseTick[6];          // 已发送脉冲计数
u16 pwmCalcDecPulse[6];       // 减速点脉冲数
u8  fineDecPulseFlag[6];      // 减速点是否已确定
u8  motorAccDiv;              // 加减速分频计数器

三、加减速算法详解

3.1 算法触发周期

PWM加减速计算在dio_tim_task()中执行,该函数由1ms定时器调用。但加减速计算每100ms执行一次,通过分频计数器实现note_63

c 复制代码
void dio_tim_task() {
    // ... DIO刷新代码 ...
    
    motorAccDiv++;
    if(motorAccDiv > 100) {   // 100ms执行一次
        motorAccDiv = 0;
        for(ch = 0; ch < 6; ch++) {
            // 加减速计算
        }
    }
}

3.2 三种工作模式

每路PWM有三种工作模式note_63note_69

模式1:未使能

c 复制代码
if(!pwmEnable[ch]) {
    presentFreq[ch] = 10;  // 最低频率10Hz
}

模式2:脉冲数限制模式(加减速)

这是最复杂的模式。算法将脉冲发送分为三个阶段:

复制代码
|←------ 加速阶段 ------→|←------ 匀速阶段 ------→|←------ 减速阶段 ------→|
   频率线性递增         保持目标频率       频率线性递减

代码逻辑note_69

c 复制代码
if(pwmPulseNum[ch] != 0) {
    // 第一步:确定减速点
    if(fineDecPulseFlag[ch] == 1) {
        // 还没确定减速点
        if(presentFreq[ch] >= pwmFreq[ch]) {
            // 已达到目标频率
            // 减速脉冲数 = 剩余脉冲数
            pwmCalcDecPulse[ch] = pwmPulseNum[ch] - pwmPulseTick[ch];
            fineDecPulseFlag[ch] = 0;  // 标记已确定
        } else {
            // 还在加速中,暂设为总脉冲数的一半
            pwmCalcDecPulse[ch] = pwmPulseNum[ch] / 2;
        }
    }
    
    // 第二步:频率调整
    if(pwmPulseTick[ch] < (pwmPulseNum[ch] - pwmCalcDecPulse[ch])) {
        // 加速阶段:频率递增
        presentFreq[ch] += pwmAccUnit[ch];
        if(presentFreq[ch] > pwmFreq[ch])
            presentFreq[ch] = pwmFreq[ch];  // 限幅
    } else {
        // 减速阶段:频率递减
        if(presentFreq[ch] > 10)
            presentFreq[ch] -= pwmAccUnit[ch];
    }
    
    // 第三步:脉冲发送完毕
    if(pwmPulseTick[ch] >= pwmPulseNum[ch]) {
        pwmEnable[ch] = 0;  // 自动停止
        // 上报运动完成指令
    }
}

模式3:连续输出模式(无加减速)

c 复制代码
if(pwmPulseNum[ch] == 0) {
    // 脉冲数=0表示连续输出,不参与计数
    // 直接按最大频率输出
    presentFreq[ch] = pwmFreq[ch];
}

3.3 加减速单位

加减速单位(pwmAccUnit)表示每100ms频率的增加值word_5

例如设置为10,则每100ms PWM频率增加10Hz:

时间 频率
0ms 10Hz(起始)
100ms 20Hz
200ms 30Hz
... ...
达到目标频率后 匀速

四、PWM停止状态的特殊设计

PWM在停止状态下,TIM定时器仍在工作,频率约为8.4Hzword_5

这个设计是经过权衡的:

  • 不占用中断资源:TIM硬件自动运行,不需要CPU干预
  • 快速响应指令:上位机发来的运动指令响应延时为8.4Hz周期,约±60ms
  • 如果完全关闭TIM,重新启动需要配置寄存器,响应更慢

五、运动完成自动上报

当设置了脉冲数后,脉冲数量发送完成时,采集卡会自动上传一条运动完成指令到上位机,取消PWM使能状态word_5

上位机也可以勾选"自动回读"功能,定期刷新运动状态word_5


六、与其他型号的PWM对比

型号 PWM通道数 频率范围 加减速 占空比精度
DABL7606 4路 1Hz~5kHz 支持 0.1%
DABL7689 4路 1Hz~5kHz 支持 0.1%
DABL-G511 7路 1Hz~5kHz 支持 0.1%
DABM-D223 6路 1Hz~10kHz 支持 0.1%

D223在PWM方面的优势在于频率范围提升到10kHz(最新固件优化后),可以驱动更高速的电机note_259ppt_23


七、资源调度:PWM与采集的共存

当PWM或DAC功能与在线采集同时工作时,在线采集的采样率会被限制在30kHz以下note_63

这是D223固件层面的资源调度策略:在多功能并行时主动降速,确保系统稳定性优先。如果需要全速500KSPS采集,建议关闭PWM和DAC功能。


八、应用场景

场景1:步进电机精密定位

设置脉冲数=1000,加减速单位=10,目标频率=1000Hz。电机先加速到1000Hz,发送完1000个脉冲后自动减速停止。

场景2:多轴同步运动

6路PWM同时使能,分别控制X/Y/Z轴步进电机,实现多轴协调运动。

场景3:伺服电机速度控制

脉冲数设为0(连续模式),直接以目标频率持续输出脉冲,控制伺服电机转速。


九、总结

D223的PWM电机控制方案实现了:

  1. 6路独立PWM:可同时控制6个电机轴
  2. 脉冲计数控制:精确控制步进电机移动距离
  3. 加减速算法:梯形速度曲线,保护电机和机械结构
  4. 自动完成上报:脉冲发完后自动通知上位机
  5. 10kHz频率:最新固件优化后支持更高速度
  6. 与DO共用引脚:灵活的引脚复用设计

下篇预告:《D223的DIO数字接口:边沿检测、外部触发与工业接线方案》

相关推荐
杨石兴1 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
江畔柳前堤1 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
Navigator_Z1 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode
zander2582 小时前
LeetCode 739:每日温度——为什么单调栈要持续弹出
开发语言·python·算法
2601_955759882 小时前
如何降低 Claude API 批量生产返工率
大数据·人工智能·算法
Kuakewei8882 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
这个DBA有点耶2 小时前
DBA进阶之路:从“修数据库”到“管架构债”
数据库·架构·dba
rannn_1112 小时前
【力扣hot100】链表专题下|138、148、23、146
java·算法·leetcode·链表·开发
ly76892 小时前
分布式一致性算法详解:从 2PC、3PC 到 Paxos、Raft、ZAB
分布式·算法