采集卡还能控制电机?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电机控制方案实现了:
- 6路独立PWM:可同时控制6个电机轴
- 脉冲计数控制:精确控制步进电机移动距离
- 加减速算法:梯形速度曲线,保护电机和机械结构
- 自动完成上报:脉冲发完后自动通知上位机
- 10kHz频率:最新固件优化后支持更高速度
- 与DO共用引脚:灵活的引脚复用设计
下篇预告:《D223的DIO数字接口:边沿检测、外部触发与工业接线方案》