文章目录
一、应用场景?
中空轴型编码器是一种内部空心、外部固定的旋转编码器,主要应用于需要测量旋转位置和速度的机械装置中。下面列举了几个中空轴型编码器的应用场景:
1.机床:中空轴型编码器可以被用于测量机床主轴的转速和位置,保证机床工作的精度和稳定性。
2.交通运输:中空轴型编码器可以被用于测量车辆的转速和位置,通过车辆转速和位置信息实现自动驾驶、行车记录等功能。
3.印刷设备:中空轴型编码器可以被用于测量印刷设备的转速和位置,实现高精度印刷和对印刷质量的监控。
4.风电设备:中空轴型编码器可以被用于测量风力发电机的转速和位置,通过转速和位置信息实现对风力发电机的运行状态监控和控制。
5.机器人:中空轴型编码器可以被用于测量机器人的关节角度和位置,实现机器人的精确运动控制。
总之,中空轴型编码器可以被广泛应用于需要进行旋转位置和速度测量的机械装置中,在实现自动化控制、监控和调节等方面具有重要作用。
二、中空编码器是什么?
1.介绍
中空编码器(Hollow Shaft Encoder)是一种用于测量旋转运动的传感器装置。与普通编码器相比,中空编码器特点在于其具有中空的轴心,可以在轴上通过。这使得中空编码器适用于需要通过轴传输信号、电力或液体的应用。
中空编码器通常由以下几个主要部件组成:
1.编码盘(Code Disc):编码盘是固定在旋转轴上的圆形或环形光学或磁性盘。它通常拥有许多刻有光学或磁性编码的孔或磁极。
2.发光器/接收器(Emitter/Receiver):发光器和接收器通常是配对使用的光电二极管(LED)和光敏二极管(Photodiode)。发光器通过编码盘上的孔或磁极发出光信号,接收器检测到并转换返回的光信号。
3.信号处理电路:信号处理电路负责接收从接收器传回的光信号,并将其转换为数字脉冲信号。这些数字脉冲信号代表编码盘上的位置和旋转方向。
2.工作原理
中空编码器的工作原理如下:
1.当旋转轴转动时,编码盘上的刻度孔或磁极会相对于发光器和接收器发出光信号。
2.接收器接收到通过刻度孔或磁极传回的光信号,并将其转换为电信号。
3.信号处理电路将电信号转换为数字脉冲信号,记录下位置和旋转方向的变化。
总之,中空编码器广泛应用于需要准确测量旋转运动的领域,如机械加工、自动化控制、机器人技术等。通过测量旋转角度和速度,可以提供准确的位置反馈,帮助系统实现精确的运动控制和定位。
三、使用步骤
1.应用波形说明
如下图所示,CW顺时针旋转的时候,A信号和B信号相位相同;反之CCW逆时针旋转的时候,A信号和B信号相位相反。
2.示例代码
2.1 引脚配置初始化代码如下(示例):
/*******************************************************************************
* 函数名:Coder_GPIO_Init
* 描述 :编码器引脚初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Coder_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(CODER1_GPIO_RCC, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = A1_Pin | B1_Pin;//PD1,PD2
GPIO_Init(CODER1_GPIO, &GPIO_InitStructure);//GPIOD
}
2.2 A相,B相读取高低信号代码如下(示例):
/*******************************************************************************
* 函数名:Read_A1_State
* 描述 :1号编码器A相识别
* 输入 :void
* 输出 :uint8_t
* 调用 :
* 备注 :
*******************************************************************************/
uint8_t Read_A1_State(void)
{
if(GPIO_ReadInputDataBit(CODER1_GPIO,A1_Pin) == 0)
{
return 0;
}
else
{
return 1;
}
}
/*******************************************************************************
* 函数名:Read_B1_State
* 描述 :1号编码器B相识别
* 输入 :void
* 输出 :uint8_t
* 调用 :
* 备注 :
*******************************************************************************/
uint8_t Read_B1_State(void)
{
if(GPIO_ReadInputDataBit(CODER1_GPIO,B1_Pin) == 0)
{
return 0;
}
else
{
return 1;
}
}
2.3 编码器相关变量初始化(示例):
/*******************************************************************************
* 函数名:Coder_Data_Init
* 描述 :编码器相关变量初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Coder_Data_Init(void)
{
Coder_State.Count = 1000;
Coder_State.bits.Spin = 0;
Coder_State.bits.Left_Spin = 0;
Coder_State.bits.Right_Spin = 0;
Coder_State.bits.A_Last_State = Read_A1_State(); // 首次启动,防止编码器误判;
}
2.4 编码器动作扫描代码如下(示例):
/*******************************************************************************
* 函数名:Coder_Scan
* 描述 :编码器动作扫描
* 输入 :void
* 输出 :void
* 调用 :1ms
* 备注 :
*******************************************************************************/
void Coder_Scan(void)
{
if(Read_A1_State() != Coder_State.bits.A_Last_State) //A相出现跳变,表示编码器开始被转动
{
Coder_State.bits.Spin = 1; // 转动标志
Coder_State.Count = 500;
if (Read_A1_State() == Read_B1_State()) // 根据编码器波形,AB同相表示顺时针转动
{
Coder_State.bits.Left_Spin = 1; // 左转----逆时针
Coder_State.bits.Right_Spin = 0;
Uart1Prints("\r\n*anticlocwise$");//打印逆时针
}
else
{
Coder_State.bits.Left_Spin = 0;
Coder_State.bits.Right_Spin = 1; // 右转----顺时针
Uart1Prints("\r\n*clockwise$");//打印顺时针
}
Coder_State.bits.A_Last_State = Read_A1_State(); // 记录A相上一次状态,用于下一次判定
}
if (Coder_State.Count == 0)
{
Coder_State.bits.Spin = 0; // 停止转动
}
else
{
Coder_State.Count--;
}
}
3.测试结果
顺时针旋转打印clockwise$
逆时针旋转打印anticlockwise$
四、总结
今天主要讲了中空编码器的应用和简单驱动,这个驱动我没有用到外部中断,我是直接在1ms循环里面调用,也可以用外部中断的方式判断,都是基于上面那个波形进行的判断,有对中空编码器感兴趣的可以下载附件参考,感谢你的观看,谢谢!