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数字接口:边沿检测、外部触发与工业接线方案》

相关推荐
源代码•宸7 分钟前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
FOORIR7 分钟前
3D视觉+AI客流系统怎么做:从Sensor Pipeline到数据事件引擎
算法
天远数科22 分钟前
零信任架构实战:基于天远身份证OCR构建自动化高并发移动支付网关
人工智能·架构·自动化·ocr
ThornArmor1 小时前
《沼泽巨鳄驯养手册》
架构
YWamy1 小时前
远程医疗音视频系统技术选型与全场景落地架构
架构·音视频
AOI小白新手上路2 小时前
江科协51单片机 7-2 LCD1602显示时钟实验
单片机·嵌入式硬件·51单片机
思麟呀2 小时前
嵌入式入门(一)宏观生态到首次烧录
c语言·嵌入式硬件
runningshark2 小时前
SC32L14GR8PJR
单片机·嵌入式硬件
名字还没想好☜2 小时前
Docker buildx 多架构镜像实战:一次构建 amd64+arm64,告别 exec format error
运维·docker·eureka·架构·kubernetes
Omics Pro2 小时前
Arc研究所Cell|全新虚拟细胞官方基准评测框架
大数据·人工智能·深度学习·算法·机器学习