电机转动的初始位置怎么设定?通过霍尔?

[复制链接]
253|8
medety 发表于 2025-10-27 14:10 | 显示全部楼层 |阅读模式
RT,
请教大家一下:

电机可以一直转下去,顺时针转或者逆时针转,
但是当电机带动一个螺旋的机构,比如螺丝那个螺纹结构,总是会有拧到底的时候,继续拧就拧不动了
这会需要有一个初始位置,也就是说零点位置设定。设定好零点位置之后,比如控制转20圈都到底了。

但是不知道目前的位置在哪里,我到底是转20圈还是转15圈? 万一前面只有一圈了,还是转了20圈,那不是打齿了么?

我想了一下,如果通过2个霍尔的话,顶多只是判断正向还是反向,终究是无法确定当前位置。

难道是这样,一直往另外一个方向转个360度,不管他能不能转,就算起始位了,似乎也不对。
 楼主| medety 发表于 2025-10-27 14:11 | 显示全部楼层
普通的小步进电机,24BYJ48这种。
LcwSwust 发表于 2025-10-27 18:52 | 显示全部楼层
整体是啥样的,有没有图? 看不太懂你的问题.
一般确定了零点位置之后,不失步(比如阻力过大)的话,步进电机的步数就代表了位置,比如用A4988驱动,那就是STEP脚的脉冲数.
中国英茂科工 发表于 2025-10-27 23:39 | 显示全部楼层
自动回正算法
qinlu123 发表于 2025-10-28 08:30 | 显示全部楼层
电机控制板出厂校准后就不断电
sunjd 发表于 2025-10-28 08:42 | 显示全部楼层
增加个单限位开关
电机向零点方向移动,触碰限位开关。触碰后,控制器记录下“这是极限位置”,然后反向移动一个固定的距离(比如5mm),将这个位置设定为“软件零点”。
将限位开关安装在你想设置为“零点”的机械位置。例如,如果你的电机带动一个螺杆推动滑块,那么就把限位开关安装在滑块行程的最左端或最右端。
电气连接:
电机连接ULN2003驱动板,再连接到主控板。
限位开关的三根线(VCC, GND, 信号)连接到主控板。信号线连接到一个数字输入引脚,并启用上拉电阻。
对应的Arduino伪代码逻辑如下
// 引脚定义
const int motorPin1 = 8;
const int motorPin2 = 9;
const int motorPin3 = 10;
const int motorPin4 = 11;
const int limitSwitchPin = 2; // 限位开关接在2号引脚

// 电机步序
int stepSequence[8][4] = { ... }; // 标准的28BYJ-48半步序列
int stepsPerRevolution = 4096; // 32(步序数)* 64(减速比) / 4 = 4096 半步一圈

bool isHomed = false;
long currentPosition = 0; // 绝对位置,单位是“步”

void setup() {
  // 初始化引脚
  pinMode(limitSwitchPin, INPUT_PULLUP);
  // ... 初始化电机引脚
  Serial.begin(9600);

  // 上电后首先执行回零
  homeMotor();
}

void loop() {
  if (!isHomed) {
    // 如果没回零,什么都不做,或者等待回零
    return;
  }

  // 这里是你的正常控制代码
  // 例如:moveToPosition(20 * stepsPerRevolution); // 走20圈
}

// !!!核心回零函数!!!
void homeMotor() {
  Serial.println("开始回零...");

  // 1. 向零点方向移动,直到触发限位开关
  // 注意:取决于你的安装,可能是顺时针或逆时针
  while (digitalRead(limitSwitchPin) == HIGH) { // 假设开关常态高电平,触发时拉低
    // 执行一步,向“回零方向”转动
    stepMotor(-1); // -1 代表回零方向
    delayMicroseconds(1000); // 控制速度,慢速回零
  }

  Serial.println("触碰到限位开关");

  // 2. 碰到开关后,立即停止(这个循环已经跳出)

  // 3. 反向移动一段固定距离,离开开关
  // 假设反向移动50步(约0.7圈),这个距离要确保机构完全离开开关的触发区
  int backupSteps = 50;
  for (int i = 0; i < backupSteps; i++) {
    stepMotor(1); // 1 代表离开零点的方向
    delay(5);
  }

  Serial.println("反向离开限位开关");

  // 4. !!!关键步骤:将当前位置设为绝对零点!!!
  currentPosition = 0;
  isHomed = true;

  Serial.println("回零完成!当前位置已重置为0。");
}

// 控制电机走一步的函数
// direction: -1 是回零方向, 1 是离开零点方向
void stepMotor(int direction) {
  static int currentStep = 0;
  
  currentStep += direction;
  if (currentStep >= 8) currentStep = 0;
  if (currentStep < 0) currentStep = 7;

  // 根据stepSequence[currentStep]设置电机引脚高低电平
  // ... 具体驱动代码

  // 更新绝对位置
  currentPosition += direction;
}

// 基于绝对位置的移动函数(回零后才能用)
void moveToPosition(long targetSteps) {
  long stepsToMove = targetSteps - currentPosition;
  int direction = (stepsToMove > 0) ? 1 : -1;
  stepsToMove = abs(stepsToMove);

  for (long i = 0; i < stepsToMove; i++) {
    stepMotor(direction);
    delay(3); // 根据需要的速度调整
  }
}
dffzh 发表于 2025-10-28 11:00 | 显示全部楼层
同楼上所述,可以装一个限位开关,每次设备上电后,先执行回零,电机反转直到触发限位开关, 记录该位置为 0 ,正转走到工作起始点。
STCMCUNT015 发表于 2025-10-28 14:46 | 显示全部楼层
FOC-车规, 汽车座椅通风-STC32G12K128-24A车规,24万转
===汽车座椅通风,5100转/分钟, 车规 RMB2.8-LQFP32
===FOC 控制,24万转@STC32G12K128-24A 车规,32位8051
===FOC 控制,33万转@STC32G8K64-33A 车规认证中,RMB1.8===FOC 控制,42万转@STC32G8K48-42I 工规,RMB1.6



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
strang 发表于 2025-10-28 16:48 | 显示全部楼层
如果转动不是很多的话,可以用电位器可以记录起始值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

122

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部