单片机操作旋转编码器
- 格式:doc
- 大小:325.76 KB
- 文档页数:3
旋转编码器接线方法
旋转编码器分为两种类型,一种是带按钮的,一种是不带按钮的。
接线方法如下:带按钮的旋转编码器接线方法:
1. 将旋转编码器的VCC引脚连接至电源正极。
2. 将旋转编码器的GND引脚连接至电源负极。
3. 将旋转编码器的开关引脚连接至电源正极。
4. 将旋转编码器的A相信号线连接至单片机的一个IO口。
5. 将旋转编码器的B相信号线连接至单片机的另一个IO口。
6. 将旋转编码器的按钮引脚连接至单片机的一个IO口。
不带按钮的旋转编码器接线方法:
1. 将旋转编码器的VCC引脚连接至电源正极。
2. 将旋转编码器的GND引脚连接至电源负极。
3. 将旋转编码器的A相信号线连接至单片机的一个IO口。
4. 将旋转编码器的B相信号线连接至单片机的另一个IO口。
注意事项:
1. 不同的编码器型号接口可能会有所不同,请根据具体型号的接口引脚图进行接线。
2. 如果编码器内部有光电传感器,连接时需要注意光电传感器管脚的方向,否则可能导致编码器无法工作。
3. 接线时需要注意电源的极性,如果接反了可能会烧坏编码器。
程序代码/**************************************************************** **** 文件名: main.c** 创建人: 飘扬** 日期: 2006.10.04** 修改人:** 日期:** 描述: 本程序使用伟纳300A型实验板,来检测光电旋转编码器的实际每周** 输出脉冲数。
程序中,定时器0用于8位数码管动态扫描定时,时间** 为1ms(12MHZ晶振)。
定时器1工作于模式1,计数器方式,直接测量** 接在T1脚的脉冲个数。
外部中断0,工作于边沿触发方式,接在旋转** 编码器的Z信号输出上,用于检测编码器完整旋转一周。
8位数码管,** 接成动态扫描,接在P0和P2口。
左4位,用来显示上一周的实际脉冲** 数,右4位,用来显示当前周的脉冲数。
**** 实际使用,感觉效果还可以。
程序准确的测量出某牌光电旋转编码** 器(400脉冲),实际工作时,双路信号输出脉冲数量不等,及脉冲** 数与标称值的误差情况。
**** 本程序的显示部分,直接修改于伟纳提供的数码管显示1-8例程。
**----------------------------------------------------------------*/#include <reg51.h>#include <intrins.h>unsigned char data dis_digit;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 30x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, offunsigned char data dis_buf[8];unsigned char data dis_index;unsigned int counter1,counter2; //左右计数器数值void main(){P0 = 0xff;P2 = 0xff;TMOD = 0x51; //定时器0工作在模式1定时器方式,定时器1工作在模式1计数器方式TH0 = 0xFC;TL0 = 0x17;TH1 = 0;TL1 = 0;IE = 0x83; //开定时器0中断和外部中断0IT0 = 1; //外部中断0为边沿触发方式//显示初始化counter1=0; //右测显示的本周当前脉冲数counter2=0; //左测显示的上一周脉冲数dis_digit = 0xfe;dis_index = 0;TR0 = 1;//主程序TR1 = 1;while(1){counter1=(TH1*0xff)+TL1;dis_buf[0] = dis_code[0x0a];dis_buf[1] = dis_code[counter2/100];dis_buf[2] = dis_code[(counter2%100)/10];dis_buf[3] = dis_code[counter2%10];dis_buf[4] = dis_code[0x0a];dis_buf[5] = dis_code[counter1/100];dis_buf[6] = dis_code[(counter1%100)/10];dis_buf[7] = dis_code[counter1%10];}}//外部中断0void int0() interrupt 0{TL1=0;TH1=0;counter2=counter1;}void timer0() interrupt 1// 定时器0中断服务程序, 用于数码管的动态扫描// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时, // 选通P2.0口数码管// dis_buf --- 显于缓冲区基地址{TH0 = 0xFC;TL0 = 0x17;P2 = 0xff; // 先关闭所有数码管P0 = dis_buf[dis_index]; // 显示代码传送到P0口P2 = dis_digit; //dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管dis_index++; //dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描}。
ec11stm32例程EC11STM32是一种旋转编码器,常用于嵌入式系统中,可以用来获取旋转方向和计算旋转角度。
在STM32开发板上使用EC11STM32,需要进行相应的配置和编程。
本文将介绍EC11STM32的原理、使用方法以及编程实例。
EC11STM32工作原理:EC11STM32包含一个旋转编码器和一个按钮开关。
旋转编码器由两个光电传感器、一个LED和一个编码盘组成。
编码盘上有很多小刻度,每当旋转编码器旋转一格,编码盘上的刻度就会遮挡或透过光电传感器,从而产生一个脉冲信号。
根据脉冲信号的变化,我们可以判断旋转的方向和计算旋转的角度。
EC11STM32的使用方法:在STM32开发板上使用EC11STM32,首先需要将EC11STM32连接到正确的GPIO引脚上。
然后,我们可以通过读取GPIO引脚的状态来获取旋转和按下按钮的信息。
对于旋转编码器,我们可以使用两个引脚来获取旋转方向和计数。
对于按钮开关,我们可以使用一个引脚来获取按下和释放的状态。
编程实例:下面是一个使用EC11STM32的简单编程实例,用于获取旋转方向和计算旋转角度:```c#include "stm32f10x.h"#define CLK_GPIO GPIOA#define DT_GPIO GPIOB#define BTN_GPIO GPIOC#define CLK_PIN GPIO_Pin_0#define DT_PIN GPIO_Pin_1#define BTN_PIN GPIO_Pin_13int main(void){GPIO_InitTypeDef GPIO_InitStructure;//初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);//配置CLK引脚为输入GPIO_InitStructure.GPIO_Pin = CLK_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(CLK_GPIO, &GPIO_InitStructure);//配置DT引脚为输入GPIO_InitStructure.GPIO_Pin = DT_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DT_GPIO, &GPIO_InitStructure);//配置BTN引脚为输入GPIO_InitStructure.GPIO_Pin = BTN_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BTN_GPIO, &GPIO_InitStructure);int count = 0;int last_state = 0;int curr_state = 0;while (1){//读取CLK和DT引脚的状态last_state = curr_state;curr_state = GPIO_ReadInputDataBit(CLK_GPIO, CLK_PIN) << 1 | GPIO_ReadInputDataBit(DT_GPIO, DT_PIN);if (last_state != curr_state){//根据旋转方向增加或减少计数if ((last_state == 0b00 && curr_state == 0b01) || (last_state == 0b11 && curr_state == 0b10))count++;else if ((last_state == 0b01 && curr_state == 0b00) || (last_state == 0b10 && curr_state == 0b11))count--;//打印计数值printf("Count: %d\n", count);}//检测按钮是否按下if (GPIO_ReadInputDataBit(BTN_GPIO, BTN_PIN) == 0){//按钮按下时执行的操作printf("Button pressed\n");}}}```通过上述代码,我们可以实现读取EC11STM32的旋转和按钮信息,并进行相应的操作。
单片机开关元器件名称单片机开关元器件名称包括以下几种:1. 按钮开关:按钮开关是一种常见的单片机开关元器件,它通过按下或释放按钮来控制电路的通断。
按下按钮时,电路闭合;释放按钮时,电路断开。
常见的按钮开关有自锁型、非自锁型、带灯型等。
2. 切换开关:切换开关也是一种常见的单片机开关元器件,它可以通过旋转或拉动来控制电路的通断。
切换开关通常有多个档位,可以选择不同的电路连接方式。
常见的切换开关有单极双throw(SPDT)、双极双throw(DPDT)等。
3. 滑动变阻器:滑动变阻器是一种可以调节电阻值的单片机开关元器件,它通过滑动滑块来改变电阻值,从而改变电路参数。
滑动变阻器通常用于音量调节、亮度调节等场合。
4. 旋转编码器:旋转编码器是一种可以输出旋转方向和位置信息的单片机开关元器件,它通过旋转编码盘来产生脉冲信号,并根据脉冲信号来确定旋转方向和位置。
旋转编码器通常用于控制旋转机构的位置和方向。
5. 光电开关:光电开关是一种可以通过光信号来控制电路的单片机开关元器件,它通过发射和接收光信号来实现电路的通断。
光电开关通常用于自动化控制和检测。
6. 磁性开关:磁性开关是一种可以通过磁信号来控制电路的单片机开关元器件,它通过磁场的变化来实现电路的通断。
磁性开关通常用于安全门、车门等场合。
7. 触摸开关:触摸开关是一种可以通过触摸来控制电路的单片机开关元器件,它通过感应人体静电场来实现电路的通断。
触摸开关通常用于智能家居、安防系统等场合。
以上是常见的单片机开关元器件名称,它们在不同场合有着不同的应用。
在选择单片机开发板或设计自己的硬件时,需要根据具体需求选择合适的元器件。
旋转编码器使用方法
旋转编码器使用方法
使用方法一:修改驱动程序
旋转编码器属于精密仪器,在其使用过程中需通过程序发出指令,才能起到特定的作用,而根据不同环境下的需求,需要设定不同的驱动程序,所以说决定编码器使用效果怎幺样,修改合适的驱动程序是非常重要的。
通常情况下只要直接修改reg文件,同时注册一个表文件,利用添加的方式改写动态链接,在确定动态链接已经修改好的情况下,需要将其添加到内核中;
使用方法二:硬件接口连接
驱动程序修改好之后,下面就是硬件接口连接操作,在连接中,通常有A和B两个集电极输出接口,为确保线路衔接性,需要在3.3V上的电阻上进行操作,将A和B两个接口分别插到CPU上。
在硬件接口连接成功之后,以防万一,须做好测试工作检查电压输出端高低压数值是否正确,比如在按下按钮之后,如果P2端口输出值是高电平的话,说明连接正确;
使用方法三:流接口驱动程序的编写。
旋转编码开关(Rotary Encoder switch)-使用说明及程序具有左转,右转,按下三个功能。
4、5 脚是中间按下去的开关接线 1 2 3 脚一般是中间2 脚接地,1、3 脚上拉电阻后,当左转、右转旋纽时,在1、3 脚就有脉冲信号输出了。
着这是标准资料:在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,见下图:由此可见,如果输出1 为高电平时,输出2 出现一个高电平,这时开关就是向顺时针旋转; 当输出1 为高电平,输出2 出现一个低电平,这时就一定是逆时针方向旋转.所以,在单片机编程时只需要判断当输出1 为高电平时,输出2 当时的状态就可以判断出是左旋转或是右旋转了。
还有另外一种3 脚的,除了不带按钮开关外,和上面是一样的使用。
参考:#include "reg51.h"#define uint unsigned intsbit 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; //}//编码器计数程序void encoder_cnt(void){uchar temp;temp = PIND; //取端口D 管脚信号couch_clr = (temp & 0x08); //取编码器清零信号if(couch_clr != false) //有编码器清零信号{couch_num = 0; //水平床码清零}else{if(encoder_cnt_en == false) //编码器计数模块没有启动{pr_couch_ba = temp & 0x03; //取编码器A、B 相电平信号}else{couch_ba = temp & 0x03; //取编码器A、B 相电平信号if(pr_couch_ba == 0x00){if(couch_ba == 0x01){couch_num++; //水平床码加1}else if(couch_ba == 0x10){couch_num--; //水平床码减1}}else if(pr_couch_ba == 0x01){if(couch_ba == 0x11){couch_num++; //水平床码加1}else if(couch_ba == 0x00){couch_num--; //水平床码减1}}else if(pr_couch_ba == 0x10){if(couch_ba == 0x00){couch_num++; //水平床码加1}else if(couch_ba == 0x11){couch_num--; //水平床码减1}}else if(pr_couch_ba == 0x11){if(couch_ba == 0x10){couch_num++; //水平床码加1}else if(couch_ba == 0x01){couch_num--; //水平床码减1}}}pr_couch_ba = couch_ba;}}编码器及其计数模块原理飘扬的旋转编码器的检测程序(MCS51)//旋转编码器检测程序,A/B信号分别接在了INT0和INT1上//程序作者:BG4UVR//2005 年1 月15 用KEIL编译、硬件测试通过//注意:编码器的信号,程序未做消抖处理。
机械测量中旋转编码器与单片机的通用接口技术分类:微处理器与DSP | 2009-03-12南昌大学自动化系郭敏初始化程序为:void ECT_initial(void) //ECT初始化{DDRT_DDRT1=0; //置PT1(IOC1)脚为输入TIOS_IOS0=0;TIOS_IOS1=0; //通道1为输入捕捉TCTL4=0b00001101; //通道1为任何沿捕捉TSCR1_TEN=1; //计数器1使能ICOVW_NOVW1 = 1; //保护ICPAR_PA1EN = 1; //脉冲累加器使能}在每一控制周期开始时,MC9S12DG128读取脉冲累加器中的数值(average[5]),然后与前5个控制周期的脉冲累加器值求和(all_speed)再求平均值,做为当前速度反馈值(speed)。
程序流程图如图3所示。
图3 直流电机测速流程图计数速度的测试采用以下两种方法对电机测速部分进行测试:1)让智能车在赛道上行驶,每20ms将赛车当前速度值通过SCI串口发送到上位机上,并利用串口调试器进行监控。
对正好在一圈当中赛车行驶的速度值进行累加求和,再乘以20ms,得到的总行驶距离约为27m,而模拟赛道总长约为26m,两者的相对误差不到4%。
这说明,速度传感器测量基本准确。
2)直流电机空载运行时,改变脉冲捕捉方式,在上升沿、下降沿和任何沿捕捉方式间进行切换。
不改变驱动电机占空比设置,理想情况下,单位时间内捕捉的脉冲数满足:上升沿获取下的脉冲数=下降沿获取下的脉冲数=任何沿获取下的脉冲数/2。
在脉冲捕捉方式不变的情况下,改变PWM信号占空比(即改变速度给定值),检测的速度值与占空比近似成线性比例关系。
以上间接说明脉冲检测的可靠性。
.
最近做了一个关于旋转编码器的项目,在网上查阅了很多资料,然后又是进行了诸多的实验,分享给大家。
1 旋转编码器原理
(借用一下别的文档里的图片)
5脚的旋转编码开关具有左转,右转,按下三个功能。
2脚接地,1,3脚接上拉电阻。
4脚,5脚是按下功能的两个脚,可以根据需求自己接线。
检查方向时,通常采用两种做法
.
的上升沿或下跳沿,在中断程序中,检测此时另外获取(1)中断法:A或B相为高电平一相的电平。
例如上图中,A相上跳沿,相为低电平则为顺时针转动;BB 二者为逆时针方向转动。
不相同时,则能判,BAB)电平法:同时检测A相和相的电平,当出现2 (B相的电平,则能判断出转动的方向。
定发生了转动,根据前一时刻A相和硬件电路2
本设计在PIC16单片机上进行开发,采用中断法。
旋转编码开关输出上拉,之后采用RC 滤波器对信号进行先一步滤波,此处的RC滤波器的元器件大小可以适当调整。
中断源采用的是捕捉模块(CCP2)的捕捉中断(外部中断用于别处)。
3 C代码
中断响应函数:
void interrupt ISR(void)
{
if(CCP2IF)
{
CCP2IF=0;
Change();
}// 程序中CCP2设置成捕捉下跳沿
void Change()
{
..
.
unsigned int t2=2000;
if(RC3)// 高电平
{
while((!RC1)&&(t2--))//等待RC1的低电平持续完
{
Delay();
}
的电平,以确认转动发生if(!RC3)//判断此时RC3{
// 增或减操作}
else
{
while((!RC1)&&(t2--))//等待RC1的低电平持续完{
Delay();
}
RC3if(RC3)//判断此时的电平,以确认转动发生{
// 增或减操作}
}
}
注意事项:4
滤波电路,延迟时间等均需要根据具体的旋转开关进行调整。
一般的单片机程序中,并不建议在中断中添加延迟函数,但应视具体情况而定。
..。