|
|
本帖最后由 飞向狙沙 于 2026-5-26 13:06 编辑
型号RY29‑05,车用仪表盘步进电机,貌似很多轿车摩托车都在用,还以为大部分仪表都是电压表头的,原来都换步进电机了。
驱动先上效果图,奇怪,gif咋不会动呢
电机正面
电机背面,四颗固定螺丝
螺丝拆了就开了,眼熟不,这结构立马有种电子表的赶脚
线圈阻值185Ω,工作电压3.5-10V
三级齿轮减速
看看转子
限位开关,转不了一圈,大概300°左右
查了一下步进电机仪表优势,精度高,不受环境影响,抗震不抖动,缺点就是驱动麻烦。
测试驱动代码,直接AI生成,先是生成了一个IO直驱的,但是3.3V电压有点驱动不了,无法启动,需要手动助力一下,正好抽屉里还有俩A4988,就又用4988驱动了一下,效果还行,就是噪音较大,不确定是因为参数不匹配还是就是歌唱家4988的本性,晚上回去找找静音驱动再试试。
- /*
- * RY29-05 步进电机 - A4988驱动代码
- * 功能:电机每5秒自动换向一次
- * 硬件连接:
- * A4988 STEP -> Arduino D3
- * A4988 DIR -> Arduino D2
- * A4988 VDD -> Arduino 5V
- * A4988 GND -> Arduino GND
- * MS1, MS2, MS3 通过跳线帽连接到 5V (设置1/16细分)
- */
- // 定义引脚
- const int stepPin = 3;
- const int dirPin = 4;
- // 步进参数(根据 1/12° 步距角计算)
- const float OUTPUT_STEP_ANGLE = 1.0 / 12.0 / 5; // 输出轴每步角度 = 1/12°
- const unsigned long STEPS_PER_REV = 360 / OUTPUT_STEP_ANGLE; // 一圈步数 = 4320步
- // 时间参数
- const unsigned long REV_TIME_MS = 1200; // 转一圈所需时间 = 5秒
- const unsigned long PAUSE_TIME_MS = 500; // 圈间暂停 = 500ms
- const unsigned long STEP_INTERVAL_US = (REV_TIME_MS * 1000) / STEPS_PER_REV; // 每步间隔 ≈ 1157微秒
- // 状态机变量
- enum MotorState {
- RUNNING, // 正在转动
- PAUSING // 暂停中
- };
- MotorState state = RUNNING;
- unsigned long lastStepTime = 0; // 上次步进时间(微秒级)
- unsigned long lastStateChangeTime = 0; // 上次状态切换时间(毫秒级)
- unsigned long stepsCompleted = 0; // 当前圈已完成的步数
- bool direction = HIGH; // HIGH = 正转, LOW = 反转
- void setup() {
- pinMode(stepPin, OUTPUT);
- pinMode(dirPin, OUTPUT);
-
- // 设置初始方向
- digitalWrite(dirPin, direction);
-
- // 初始化计时器
- lastStateChangeTime = millis();
- lastStepTime = micros();
-
- Serial.begin(9600);
- Serial.println("RY29-05 步进电机启动(带减速齿轮,1/12°步距角)");
- Serial.print("一圈总步数: ");
- Serial.println(STEPS_PER_REV);
- Serial.print("每步间隔: ");
- Serial.print(STEP_INTERVAL_US);
- Serial.println(" 微秒");
- }
- void loop() {
- unsigned long currentMicros = micros();
- unsigned long currentMillis = millis();
-
- switch(state) {
- case RUNNING:
- // 控制步进脉冲(非阻塞,微秒级计时)
- if (currentMicros - lastStepTime >= STEP_INTERVAL_US) {
- // 输出一个脉冲
- digitalWrite(stepPin, HIGH);
- delayMicroseconds(5); // 脉冲宽度,>1微秒即可
- digitalWrite(stepPin, LOW);
-
- lastStepTime = currentMicros;
- stepsCompleted++;
-
- // 检查是否完成一圈
- if (stepsCompleted >= STEPS_PER_REV) {
- stepsCompleted = 0;
- state = PAUSING;
- lastStateChangeTime = currentMillis;
- Serial.println(">>> 完成一圈,暂停500ms <<<");
- }
- }
- break;
-
- case PAUSING:
- // 等待暂停时间结束
- if (currentMillis - lastStateChangeTime >= PAUSE_TIME_MS) {
- // 切换方向
- direction = !direction;
- digitalWrite(dirPin, direction);
-
- // 打印方向信息
- if (direction == HIGH) {
- Serial.println(">>> 切换方向:正转 <<<");
- } else {
- Serial.println(">>> 切换方向:反转 <<<");
- }
-
- // 切换到运行状态
- state = RUNNING;
- lastStateChangeTime = currentMillis;
- }
- break;
- }
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|