
CASIC MOTOR ZWS37U‑CS‑001 无刷行星减速电机
CASIC为中国航天科工,属于工业级无刷行星减速电机,集成内置驱动+霍尔编码器,多用于航空座椅、机器人底盘、机械臂关节。


这是内置驱动板一体化行星减速 BLDC 电机,不需要外接三相无刷电调;给主电源 + 方向 + PWM 信号即可运转,尾部集成正交码盘编码器,适合机器人底盘、全向轮小车、AGV 小车项目。
一、铭牌核心参数

二、8P 引线定义(4 根功率控制 + 4 根编码器反馈)

三、3 种实操接线模式
模式 1:最简全速运转(只让电机转起来,不调速)
红→电源 + 14.8V
黑→电源 GND
绿线直接短接到黑线
黄线悬空(CW 转向)
上电电机直接满速 160rpm 输出。
模式 2:PWM 调速模式(Arduino/ESP32 控制,推荐)
红接 14.8V 电源正极,黑接电源负极
所有信号 GND 必须和电机负极共地!(非常关键,否则调速异常)
黄色 DIR:IO 输出高阻悬空 (CW) / IO 输出低电平 (CCW),切换前先 PWM 置 0 停机
绿色 PWM 引脚:MCU PWM 输出,频率设置 5000Hz 以上;
逻辑特殊:0%占空比=最快160rpm;80%占空比=最慢23rpm
编码器:白接 5V,蓝接 GND;CHA、CHB 接单片机定时器正交解码引脚。
模式 3:启停控制,PWM 当作使能
PWM 占空比直接 0% 全速,高于 80% 电机停止,适合做电机开关。
四、结构拆解
前端:金属行星齿轮减速箱,金属行星齿轮,负载能力强,抗冲击,输出轴 D‑型轴,方便固定联轴器 / 轮子。
中段:三相无刷电机本体,内置无刷驱动,不需要外置 BLDC 电调;供电 + PWM 调速、方向信号直接给电机排线。
尾部:集成霍尔编码器模块,编码器独立排线,获取转轴位置、测速,闭环速度 / 位置控制。



五、电气引脚功能(排线)
电源:直流 14.8V 供电正负极
控制信号:PWM 调速引脚、正反转 DIR 方向引脚、使能 EN 引脚
编码器 A/B 相、电源 GND:用于读取转速、位置,做 PID 闭环调速。
✅ 特点:单电源供电,直接 TTL 电平控制,不用外接无刷电调。支持 PWM 调速,支持正反转;自带编码器直接闭环控制。


六、优缺点
1、优点
航天科工工业品质,金属行星减速箱,寿命长,抖动小,扭矩大,体积紧凑 37mm 直径。
驱动板内置,大大简化硬件,单片机直接 TTL 信号控制。
自带高精度霍尔编码器,非常适合机器人小车(麦克纳姆轮底盘)、小型机械臂关节、AGV。
14.8V 正好匹配 4 串 18650 锂电池机器人供电系统。
2、缺点
体积比普通有刷减速电机大;重量较重。
控制逻辑比简单有刷电机复杂,需要处理 EN、DIR、PWM,读取编码器 AB 相;不可以直接接电源硬转。
停产老型号,市面大多是拆机二手件,无全新现货。
3、适合项目
麦克纳姆轮小车、差分轮机器人底盘(ESP32 / 行空板 K10 闭环 PID 调速)
小型机械臂关节执行器
自动化平台、往复执行机构
机器人竞赛 VEX、RoboMaster 小型机构
4、注意事项
额定14.8V,不要直接上 24V,会烧毁内置驱动板,上限不超过 18V。
禁止堵转,堵转电流会远大于 1.6A,容易烧内置驱动。
编码器信号线不要和动力线捆在一起,避免干扰测速。




七、Arduino‑ESP32 最小控制示例片段
#define DIR_PIN 22 //黄色方向线
#define PWM_PIN 23 //绿色调速线
// 注意:PWM频率设置 >=5000Hz
// 该电机逻辑特殊:0%占空比全速,80%占空比低速
void setup() {
pinMode(DIR_PIN,INPUT); //INPUT=悬空,CW;OUTPUT_LOW=CCW
ledcSetup(0,5000,10); //通道0,5kHz,10bit分辨率 0‑1023
ledcAttachPin(PWM_PIN,0);
}
//全速运行
void motor_full_speed(){
ledcWrite(0,0); //0 对应0%占空比,满速
pinMode(DIR_PIN,INPUT); //CW方向
}
//低速23rpm附近,80%占空比 = 819(10bit 1023*0.8)
void motor_low_speed(){
ledcWrite(0, 819);
}
//停机!切换方向前必须调用
void motor_stop(){
ledcWrite(0, 820); //>80%,停机
delay(100);
}
八、工程避坑
1、红黑主电源严禁接反,一接反内置驱动直接烧毁,不可逆损坏。
2、禁止电机正在旋转时切换黄线方向! 二级行星齿轮,运行换向会冲击齿轮,打崩塑料行星齿轮,必须 PWM 置零停机后再改变 DIR 电平。
3、PWM 频率硬性要求 ≥5kHz,普通 Arduino 默认 1kHz 定时器输出,调速会抖动、异响,需要重映射定时器修改 PWM 频率。
4、信号地共地:编码器 GND、单片机 GND 必须连到电机黑色负极,否则 PWM 调速乱跳、编码器读数错乱。
5、PWM 有效区间只有0%~80%;超过 80% 占空比电机不会继续减速。
6、编码器只有 A、B 两相正交输出,没有 Z 零点信号;只能测速、里程,不能上电直接回零。


九、ESP32 读取 ZWS37U‑CS‑001 正交编码器 AB 脉冲完整代码
硬件说明:该电机编码器输出A/B 两相正交脉冲,无 Z 相;编码器供电:白→5V,蓝→GND;CHA、CHB 接 ESP32。
ESP32 有硬件正交解码计数器 PCNT 外设,硬件计数,不占用 CPU,不会丢脉冲,优先使用硬件 PCNT,不要用外部中断轮询。
硬件接线

注意:电机 8 根线中,红黑黄绿是电机动力控制;编码器是独立 4 根(白、蓝、菲、棕)。
ESP32‑S3 同样支持 PCNT 外设,引脚分配逻辑一样。
完整代码(硬件 PCNT 正交解码)
/*
ESP32 PCNT硬件正交计数器读取AB编码器
适配 CASIC ZWS37U‑CS‑001 减速无刷电机
硬件计数,不丢脉冲,主线程读取计数值即可
*/
#include <Arduino.h>
#include "driver/pcnt.h"
// =========配置区=========
#define PCNT_UNIT PCNT_UNIT_0
#define PCNT_CHANNEL PCNT_CHANNEL_0
#define ENC_A_PIN 18 // CHA A相
#define ENC_B_PIN 19 // CHB B相
// 编码器参数:根据你的电机码盘线数修改
// 重要:ZWS37U‑CS‑001 减速箱160rpm输出轴,注意:码盘在【电机高速端】不是减速输出轴!
// 脉冲数 = 原始电机码盘线数 ×4(四倍频正交),计数值对应高速电机轴,需要除以减速比得到输出轴转角
const int GEAR_RATIO = 30; //二级行星减速比,根据实际电机铭牌换算
// =======================
int16_t pulse_count = 0; //硬件计数器原始计数值
void pcnt_init()
{
//1. PCNT单元配置
pcnt_config_t pcnt_cfg = {
.pulse_gpio_num = ENC_A_PIN,
.ctrl_gpio_num = ENC_B_PIN,
.lctrl_mode = PCNT_MODE_REVERSE, // B相电平控制计数方向
.hctrl_mode = PCNT_MODE_KEEP,
.pos_mode = PCNT_COUNT_INC,
.neg_mode = PCNT_COUNT_DEC,
.counter_h_lim = 32767,
.counter_l_lim = –32768,
.unit = PCNT_UNIT,
.channel = PCNT_CHANNEL
};
pcnt_unit_config(&pcnt_cfg);
//2. 开启滤波器,消除机械抖动噪声,滤除<100ns脉冲干扰
pcnt_set_filter_value(PCNT_UNIT, 100);
pcnt_filter_enable(PCNT_UNIT);
//3. 清零计数器,启动
pcnt_counter_clear(PCNT_UNIT);
pcnt_counter_resume(PCNT_UNIT);
}
void setup()
{
Serial.begin(115200);
pcnt_init();
Serial.println("ESP32 PCNT正交编码器启动完成");
}
void loop()
{
//读取硬件计数器,非阻塞,不占用CPU
pcnt_get_counter_value(PCNT_UNIT, &pulse_count);
Serial.printf("原始脉冲:%6d | 输出轴圈数:%.3f\\r\\n",
pulse_count,
(float)pulse_count / (GEAR_RATIO * 4 * 11) //11是示例码盘线数,请替换为实际码盘线数
);
delay(50);
}
非常关键参数提醒(针对 ZWS37U‑CS‑001 电机)
码盘安装在无刷电机高速转子侧(减速箱输入侧),不是输出轴!
读到的pulse_count 是高速电机轴脉冲,不是减速输出轴脉冲。
四倍频正交:A/B 正交读取,每 1 个码盘刻度产生 4 个脉冲。
输出轴转 1 圈 = 高速电机轴转动 GEAR_RATIO 圈。
商家没有公开码盘线数!你需要实际标定:手动转动输出轴完整一圈,观察 Serial 打印脉冲总数,得到真实总脉冲每圈。
标定实操步骤
将代码上传,打开串口监视器;
手动用手转动电机输出轴,完整转 1 圈;
记下原始脉冲的变化差值,记做 PULSE_PER_OUTPUT_REV,之后直接使用这个数值。
示例标定:假设输出轴转一圈,脉冲变化为 1320,则
float output_rev = (float)pulse_count / 1320.0f; //直接得到输出轴圈数
拓展:速度计算(定时采样,计算 RPM 转速)
不能用 delay 算速度;用micros()做时间戳,固定时间间隔读取脉冲差。
// 全局变量
int16_t last_pulse = 0;
uint32_t last_time_us = 0;
float get_output_rpm(void)
{
int16_t cur_pulse;
uint32_t cur_us = micros();
pcnt_get_counter_value(PCNT_UNIT, &cur_pulse);
int delta_pulse = cur_pulse – last_pulse;
uint32_t delta_us = cur_us – last_time_us;
last_pulse = cur_pulse;
last_time_us = cur_us;
// delta_us单位微秒 → min=60*1e6 us
// PULSE_PER_OUTPUT_REV:输出轴每一转总脉冲数(你手动标定出来)
float rpm = (float)delta_pulse * 60.0f * 1000000.0f / ((float)delta_us * 1320.0f);
return rpm;
}
放到 loop 中调用,即可得到减速输出轴实时转速 RPM,用于 PID 速度闭环。
硬件避坑清单
编码器 GND(蓝线)必须与 ESP32 GND、电机功率负极黑线共地,否则读数乱跳。
不要用普通外部中断 attachInterrupt 读取 AB 相,高速旋转时会丢失脉冲;PCNT 硬件计数器才是正确方案。
ESP32‑S3 PCNT 用法完全一样,注意部分引脚是 SPI/FLASH 复用脚,不要用 GPIO11‑17 (S3 flash 脚)。
电机驱动的大电流会带来干扰;编码器信号线建议用双绞线,远离电机电源线,必要时编码器 GND 串 100Ω 电阻或者增加磁珠。
PCNT 计数器范围:‑32768 ~ +32767,电机长时间转动会溢出;机器人项目需要在程序层做溢出补偿。






