旋转编码器模块研究(1)
来源:互联网 发布:仓禀足而知礼节 编辑:程序博客网 时间:2024/04/29 08:39
1.和正常的编码器原理是类似的,不过用着更方便了。
2.不需要搭建外围电路,已经做完上拉,估计精度比较垃圾。
淘宝网址如下:
https://detail.tmall.com/item.htm?spm=a230r.1.14.13.1183b85fR10LMA&id=530477227931&cm_id=140105335569ed55e27b&abbucket=13
https://detail.tmall.com/item.htm?id=41254563868&ali_refid=a3_430583_1006:1109983619:N:%E7%BC%96%E7%A0%81%E5%99%A8%E6%A8%A1%E5%9D%97%20%E6%97%8B%E8%BD%AC:04c59bc25aa4434ecd1581c5182789f6&ali_trackid=1_04c59bc25aa4434ecd1581c5182789f6&spm=a230r.1.14.1
这里重点说一下接口:
CLK不是什么时钟,应该是发出的一路脉冲,只要你扭转就行。理解为A路信号
DT也不是什么数据,应该也是一路脉冲。理解为B路信号
关于编码器的原理,我想主要是两种方案,一种是定时器中断处理,一种是外部中断处理,后续的函数,我会写出来。
配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。这怎么理解?
个人认为:应该是多了一个触发,其他倒是无所谓。
读数系统通常采用差分方式,即将两个波形一样但相位差为180deg;的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。
增量编码器给出两相方波,它们的相位差90deg;,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比。
电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度。
可以用下列公式来计算:电气360 =机械360deg;/ndeg;脉冲/转
int redPin=2;int yellowPin=3;int greenPin=4;int aPin = 6;int bPin = 7;int buttonPin=5;int state = 0;int longPeriod = 5000;int shortPeriod=700;int targetCount=shortPeriod;int count = 0; void setup() { pinMode(aPin, INPUT); pinMode(bPin, INPUT); pinMode(buttonPin, INPUT); pinMode(redPin, OUTPUT); pinMode(yellowPin, OUTPUT); pinMode(greenPin, OUTPUT); } void loop() { count++; if(digitalRead(buttonPin)) //相当于清零 { setLight(HIGH,HIGH,HIGH) } else { int change = getEncoderTurn();//change 只有三个数 0 1 -1 int newPeriod=longPeriod+(change*1000)//6000+1000 0 -1000 if(newPeriod>=1000&&newPeriod<=10000) { longPeriod = newPeriod;// } if(count>targetCount) { setState(); count=0; } } delay(1) } int getEncoderTurn() { //return -1 0 or +1 //就最初是LOW,后来无所谓了 static int oldA = LOW; static int oldB = LOW; int result = 0;.//如果下面没有发生跳变就result = 0 //这个函数挺有意思。 int newA = digitalRead(aPin); int newB = digitalRead(bPin); if(newA!=oldA||newB!=oldB) { //something has changed if(oldA==Low&&newA==High)//判断一个上升沿 { result = -(oldB*2-1);//把01变成 +1 和 -1 //如果oldB=0 result = 1 //如果oldB=1 result = -1 } } oldA=newA; oldB=newB; return result; } int setState() { if(state == 0) { setLight(HIGH,LOW,LOW); //100 targetCount = longPeriod; state = 1; } else if (state==1) { setLight(HIGH,HIGH,LOW); //110 targetCount = shortPeriod; state = 2; } else if (state == 2) { setLights(LOW, LOW, HIGH); //001 targetCount = longPeriod; state = 3; } else if (state == 3) //010 { setLights(LOW, HIGH, LOW); targetCount = shortPeriod; state = 0; } return 0; }void setLights(int red, int yellow, int green){ digitalWrite(redPin, red); digitalWrite(yellowPin, yellow); digitalWrite(greenPin, green);}
- 旋转编码器模块研究(1)
- 旋转编码器与光栅尺
- 旋转编码器 C程序
- 调试旋转编码器成功
- Arduino使用旋转编码器
- 增量型旋转编码器和绝对值旋转编码器
- 旋转编码器的选型标准
- 基于STM32的旋转编码器
- 编码器测试程序(1)
- verilog正交编码器计数模块
- 单片机在音响上的应用(一)旋转编码器的解码
- Arduino关于旋转编码器程序的介绍(Reading Rotary Encoders)
- Arduino关于旋转编码器程序的介绍(Reading Rotary Encoders)--by Markdown
- 增量式旋转编码器工作原理
- 增量式旋转编码器工作原理
- PLC与旋转编码器的连接
- EC11旋转编码器电路和程序
- 让linux支持EC11等旋转编码器
- Log4j详细配置
- java语言把网页相对URL转换成绝对URL
- hashmap的api
- 链接数据库
- eclipse在调试的模式下变慢
- 旋转编码器模块研究(1)
- C 语言面向对象-- 多态
- vmware Workstation下安装redhat linux+oracle12c 之二 安装rhel 6.5
- UML之类图
- Lua基础知识三
- 多线程并发执行任务,取结果归集。终极总结:Future、FutureTask、CompletionService、CompletableFuture
- electron三步实现Hello World
- 在windows中安装镜像版的redis
- PDO捕获SQL语句、PDO中错误处理与PDO事务处理