如何使用旋转编码开关

如何使用旋转编码开关,第1张

具有左转,右转,按下三个功能。4、5 脚是中间按下去的开关接线 1 2 3 脚 一般是中间2

脚接地,1、3 脚上拉电阻后,当左转、右转旋纽时,在1、3 脚就有脉冲信号输出了。

着这是标准资料:

在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出

脚的信号有个相位差,见下图:

由此可见,如果输出1 为高电平时,输出2 出现一个高电平,这时开关就是向顺时针旋转当输

出1 为高电平,输出2 出现一个低电平,这时就一定是逆时针方向旋转.

所以,在单片机编程时只需要判断当输出1 为高电平时,输出2 当时的状态就可以判断出是左

旋转或是右旋转了。

还有另外一种3 脚的,除了不带按钮开关外,和上面是一样的使用。

参考:

#include "reg51.h"

#define uint unsigned int

sbit CodingsWitch_A=P1_1

sbit CodingsWitch_B=P1_2

uint CodingsWitchPolling()//

{

static Uchar Aold,Bold//定义了两个变量用来储蓄上一次调用此方法是编码开关两引

脚的电平

static Uchar st//定义了一个变量用来储蓄以前是否出现了两个引脚都为高电

平的状态

uint tmp = 0

if(CodingsWitch_A&&CodingsWitch_B)

st = 1//

if(st) //如果st 为1 执行下面的步骤

{

if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果当前编码开关的两个引脚

都为底电平执行下面的步骤

{

if(Bold) //为高说明编码开关在向加大的方向转

{

st = 0

tmp++//

}

if(Aold) //为高说明编码开关在向减小的方向转

{

st = 0

tmp--//设返回值

}

}

}

Aold = CodingsWitch_A//

Bold = CodingsWitch_B//储

return tmp//

}

//

控制电机正反转似乎不需要旋转编码器,编码器是用来测速的,

1,开关量控制:将PLC的输出触点与变频器的正转,反转,高速,中速,低速触点连接,再在变频器上设置高中低档频率,用PLC直接控制这些触点的闭开即可.

2,模拟量控制,将PLC的输出触点与变频器的电流输入或电压输入触点连接,再在PLC上设置电压或电流再用D/A转换即可调节频率,正反转就是正负电平.

3,现场总线:使用CCLINK现场总线.

旋转编码器的使用:旋转编码器一般是测量电机速度用的,使用带晶体管接口的PLC,将编码器接近开关信号输入到PLC高速输入接口,再在PLC内编制相关程序,即可算出当前速度,与所需速度比较,以便及时调整.

查plc手册 关于高速脉冲计数器应用方面文档,不同plc配置不同.

一般需要配置生效后就能累积脉冲数.实时脉冲数据存在特定存储器中.读取对这个存储器数值再乘以传动比就可以显示长度了.如果需要断电保持这长度值,你还需要设定断电保持参数.还需要写个清零或预置值的程序.

#include <reg52.h>

#include "inc/delay.h"

#include "inc/hc595.h"

#define uchar unsigned char

#define uint unsigned int

sbit PIN_ROTARY_A = P2^0 //引脚1接口

sbit PIN_ROTARY_B = P2^1 //引脚2接口

sbit PIN_ROTARY_C = P2^2 //按下的接口

sbit PIN_ROTARY_D = P2^3 //按下的接口

//uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}

/* 存储待发送的数据 */

/* 1->8的段码表 */

code unsigned char ucDis_Segmentcode[16] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

/* 位码表 */

code unsigned char ucDis_Bitcode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}

uchar dis_XS[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d}

uchar count = 0

uchar flag

uchar Last_BMB_status

uchar Current_BMB_status

void display()

{

uchar i

dis_XS[0] = ucDis_Segmentcode[count/100]//百位

dis_XS[1] = ucDis_Segmentcode[count%100/10]//十位

dis_XS[2] = ucDis_Segmentcode[count%10]//个位

if(i <2)

{

i++

}

else

{

i = 0

}

// for (i = 0i <3i++ )

{

Send_Data(dis_XS[i], ucDis_Bitcode[i])

//PIN_ROTARY_D = 0

// Delay1ms(1)

}

}

//************************************************

void main()

{

TMOD=0x01//定时器0,工作方式1

TH0=0xD8

TL0=0xF0//给定时器装上初值,10ms中断一次

ET0=1//打开定时器中断

EA =1//打开总中断

TR0=1//启动定时器0

while(1)

{

//display()

Last_BMB_status=PIN_ROTARY_B

while(!PIN_ROTARY_A) //BMA为低电平时

{

Current_BMB_status = PIN_ROTARY_B

flag = 1//标志位置为1说明编码开关被旋转了

}

if(flag == 1)

{

flag = 0//时刻要注意这一点!给标志位清零

if((Last_BMB_status == 0)&&(Current_BMB_status == 1)) //BMB上升沿表示正转

{

count++

if(count == 255)

{

count = 0

}

}

if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反转

{

count--

if(count == 0)

{

count = 255

}

}

}

}

}

//***********************************************

void timer0() interrupt 1//定时器0的中断服务程序

{

TH0=0xF8 // TH0=0xD8

TL0=0xF0//再次装入初值

display()//每隔10ms显示一次

if(!PIN_ROTARY_C) //按下旋转编码开关则计数清零

{

count = 0

}

PIN_ROTARY_D = !PIN_ROTARY_D

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7806493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存