找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 159|回复: 3
收起左侧

请教如何使用光电计数确定电机位置

[复制链接]
ID:773929 发表于 2024-10-12 15:27 | 显示全部楼层 |阅读模式
50黑币
各位师傅,老板要求用一个光电传感器+电机+齿轮控制滑轨上的滑块来回运动,通俗点就是类似编码器一样的装置,要求滑块可以到指定位置,目前思路是 利用正反转输出IO做正反转反馈,以此来确定光电计数是否应该加或减,以下是一些疑惑的地方:

1.这个虽然不是编码器,但定义计数值变量的时候要不要考虑正负?
2.电机齿轮上只有5个齿,光电输入中断应该设置为 上升沿触发 还是上升沿+下降沿触发?
3.滑轨开端有一个行程开关,我想将其作用到滑块归零设置上,但领导建议作为出轨报警功能,哪一个更好?

这个电机是带有刹车的。

还请问各位师傅我这个思路可行吗,或者有什么建议?

代码框架:

unsigned long 计数值

光电中断函数()
{
   if(正转 == 1)
  {
     计数值++;

   }else 计数值--;

}

回复

使用道具 举报

ID:982617 发表于 2024-10-14 10:22 | 显示全部楼层
你的思路总体可行,但是细节上需要调整。以下是对你提出的问题进行解答:
1. 计数值变量是否要考虑正负?
要考虑正负。你需要定义一个方向变量,例如 ,用于记录滑块是正向运动还是反向运动,然后根据方向变量来决定计数值是加还是减。direction
2. 光电中断触发方式?
建议使用上升沿 + 下降沿触发。这样可以确保每次光电传感器检测到齿轮上的齿,都能触发中断,即使滑块速度很快,也不会漏掉计数。
3. 行程开关功能?
你的领导建议将其作为出轨报警功能更合理。因为行程开关主要用于检测滑块是否超出滑轨范围,作为出轨报警可以提高系统安全性。而将行程开关用于归零设置,需要考虑滑块初始位置的不确定性,可能导致归零不准确。

改进建议:
添加方向变量: 定义一个 变量,用于记录滑块运动方向,初始值为 (正向)或 (反向)。direction1-1
修改中断函数: 将 的加减操作与 变量关联起来。计数值direction
使用刹车功能: 使用电机刹车功能,可以更快速地停止滑块运动,并保证滑块停在目标位置。
考虑误差累计: 齿轮只有 5 个齿,可能导致计数误差累积。建议考虑增加齿轮的齿数,或者使用其他传感器来辅助定位,例如霍尔传感器。
代码框架示例:
unsigned long 计数值 = 0;
int direction = 1; // 初始值为正向运动
void 光电中断函数()
{
  if (direction == 1)
  {
    计数值++;
  }
  else
  {
    计数值--;
  }
}

void 设置目标位置(int targetCount)
{
  // ... 根据计数值和方向变量控制电机正反转,直到计数值达到目标值
}

void 行程开关中断函数()
{
  // ... 设置报警标志
}
其他建议:
使用更专业的传感器,例如编码器,可以提高定位精度,减少误差累积。
考虑使用 PID 控制,可以更精确地控制滑块运动,并减少抖动和误差。
希望以上建议能够帮助你更好地实现你的项目!
回复

使用道具 举报

ID:982617 发表于 2024-10-14 10:24 | 显示全部楼层
你的思路基本上是可行的,但有一些细节需要注意和调整。以下是针对你提到的几个疑惑的具体建议和思考:
1. 计数值的正负
是否需要考虑正负取决于你的设计逻辑。如果你的电机有明确的正向和反向,那么最好使用正负值来表示滑块的运动方向。比如:
- 正值表示正向运动(向右)。
- 负值表示反向运动(向左)。
通过这种方式,计数值可以反映滑块相对于初始位置的偏移,更加直观。
2. 光电输入中断的触发方式
由于电机齿轮上只有5个齿,如果你希望在每个齿到达光电传感器时都能进行计数,那么可以设置为**上升沿 + 下降沿触发,这样每次齿的进入和离开都能触发中断,从而更精确地进行计数。
3. 行程开关的作用
关于行程开关的用途,建议将其除了作为出轨报警功能外,最好也作为滑块归零设置的功能。这里有几个理由:
- 归零设置可以为滑块提供一个参考位置,使得在系统中可以更容易地计算滑块的确切位置。
- 设定归零位置后,滑块可以在这个位置上进行校准,避免误差积累。
- 如果单独作为出轨检测,可能在滑块正常工作时无故产生误报,容易导致不必要的停机。
4. 代码框架的完善
以下是改进后的代码框架示例,考虑了你提到的正负计数和光电中断的触发模式。

```c
unsigned long 计数值 = 0;      // 移动计数值
int 正转 = 1;                  // 设定运动方向标志

void 光电中断函数() {
    // 在中断处理函数中判断触发方向
    if (光电传感器触发 == 上升沿) {
        // 进入时,当电机正转
        if (正转 == 1) {
            计数值++;
        } else {
            计数值--;
        }
    } else if (光电传感器触发 == 下降沿) {
        // 离开时,亦可反向计数
        if (正转 == 1) {
            计数值++;
        } else {
            计数值--;
        }
    }
}

// 设置归零位置的行程开关函数
void 行程开关处理() {
    if (行程开关触发) {
        计数值 = 0; // 归零
        // 可能还需要增加电机停止或其他安全机制
    }
}
```
其他建议
- 刹车控制:考虑电机刹车的触发条件,确保在滑块到达目标位置或出轨时能够及时刹车。
- 安全性:在程序上增加安全检查,以避免滑块在达到行程开关时仍继续运动。
- 调试与测试:完善调试过程,确保每个部分都能正常工作。可以在光电中断和行程开关上增加LED指示灯,便于实时观察状态。
总的来说,考虑到准确性和安全性,是非常重要的。希望这些建议对你有所帮助!
回复

使用道具 举报

ID:844772 发表于 2024-10-14 15:03 | 显示全部楼层
1.要不要考虑正负?
原则上不考虑,把初始点设成原点,不存在负值。
2.电机齿轮上只有5个齿,光电输入中断应该设置为 上升沿触发 还是上升沿+下降沿触发?
看你要求控制精度,以及光电模块输出特性,上下同时的理论精度高一倍。
3.滑轨开端有一个行程开关,我想将其作用到滑块归零设置上,但领导建议作为出轨报警功能,哪一个更好?
应该设置在归零点。我理解滑台一端归零点,一端为出轨点,因为归零点风险最大,滑块经常滑到,不做保护比出轨端风险更大,而且归零点有开关可以消除累积误差。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表