xzhenggen 发表于 2007-7-17 11:17

有谁用C写过旋转式编码器的子程序?

https://bbs.21ic.com/upfiles/img/20077/200771711178161.jpg<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/200771711178161.jpg'>https://bbs.21ic.com/upfiles/img/20077/200771711178161.jpg</a>

太阳之母 发表于 2007-7-17 12:01

??

跟什么样的MCU连接?怎么连接的?旋转编码器和MCU之间有什么电路?

xzhenggen 发表于 2007-7-17 12:12

也就是三端可调电位器,跟89S52的P1.7,P1.6相连.中间脚接地.

mxh0506 发表于 2007-7-17 12:20

原来是电位器,我还以为是光电式的

不知道中间脚是不是滑动端

liandao 发表于 2007-7-17 12:21

不是吧

如果是电位器,MCU怎么测?S52有AD?旋转编码器应该是两个光偶,输出两路同频不同相方波,频率跟旋转速度有关,相位跟旋转方向有关.

xzhenggen 发表于 2007-7-17 12:31

测编码器(调节旋钮)时,在两个脚上测出信号波形如下:

https://bbs.21ic.com/upfiles/img/20077/2007717123122875.jpg<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/2007717123122875.jpg'>https://bbs.21ic.com/upfiles/img/20077/2007717123122875.jpg</a>

xzhenggen 发表于 2007-7-17 12:45

跟另一张电路图相同如下。

https://bbs.21ic.com/upfiles/img/20077/2007717124458128.jpg<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/2007717124458128.jpg'>https://bbs.21ic.com/upfiles/img/20077/2007717124458128.jpg</a>

xzhenggen 发表于 2007-7-17 12:48

我的编码器应用波形如下,就是不明白它是如何判断方向及

https://bbs.21ic.com/upfiles/img/20077/2007717124838945.jpg

xzhenggen 发表于 2007-7-17 12:53

上一次的四个按键组合代替编码器,已经搞掂。

但还是必须加入一个编码器安装在控制面板上,请各位提供一下思路或例程,多谢了。

liao_43 发表于 2007-7-17 13:09

我有些资料,你可以参考参考.

那种旋转式编码器和光电旋转式编码器输出的波形都一样的(除了没有Z相信号外) <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/200771713859658.pdf'>https://bbs.21ic.com/upfiles/img/20077/200771713859658.pdf</a>

微风 发表于 2007-7-17 13:37

加CPLD计数和判断方向

思路:需要对一路信号的同一个沿进行处理,对于同一个沿来说,从一个方向看过去是上升沿,那么从另一个方向看过去则是下降沿。当A为上升沿的时候,如果B是高电平,那么计数器加一;当A为下降沿的时候,如果B是高电平,那么计数器减一。

大雁塔莱农 发表于 2007-7-17 13:50

倒塌了,这都写不出程序的话LZ实在该打屁股

lsqdesign 发表于 2007-7-17 14:44

相位差90度

相位差90度判断方向

yewuyi 发表于 2007-7-17 15:14

嘿嘿,不仅要打,还要重重来几下……

^_^&nbsp;,下闷棍才行……

xzhenggen 发表于 2007-7-17 16:49

晕啊!要打我也认了,谁叫咱这么笨!“鸟先飞”。

还是不得要领,请各位大侠支招一下,提供一个子程序或例程给我参考参考一下,多谢了!

xzhenggen 发表于 2007-7-17 16:51

请提供一个C例程(子程序)吧,不要汇编的。。。。。。

太阳之母 发表于 2007-7-17 17:41

请我喝酒,啤的,就给你代码,C的.嘿嘿

一朝成名 发表于 2007-7-17 17:47

自己琢磨吧会有点收获的

基本思路

太阳之母 发表于 2007-7-17 18:50

啤酒准备好了没?嘿嘿

//******************************************************************************<br />//&nbsp;旋转编码器脉冲计数程序,在8051上通过外部中断0实现<br />//&nbsp;特别说明:适应于旋转编码器脉冲频率较低的场合(对于12MHz晶体,大致可以支持&nbsp;4KHz<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以下的旋转编码器脉冲频率),若旋转编码器脉冲频率更高,建议采用计数器<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0和T1分别实现正反向计数,此时一般需要附加少量外部电路的配合<br />//&nbsp;以下代码仅供参考,由此产生的任何后果,本人不承担任何责任<br />//******************************************************************************<br />#include&nbsp;&quot;reg51.h&quot;<br /><br />long&nbsp;counter=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//旋转编码器的脉冲计数值,左转为正,右转为负<br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;IT0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//外部中断0为边沿触发<br />&nbsp;&nbsp;EX0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能外部中断0<br />&nbsp;&nbsp;EA&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能中断<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在这里写代码实现你想做的事,比如计数值的进一步处理等等等等<br />&nbsp;&nbsp;}<br />}<br /><br />//******************************************************************************<br />//&nbsp;延时函数delay(unsigned&nbsp;char&nbsp;dly)<br />//&nbsp;延时值与晶体频率有关,可以自己调整变量x的值以取得合适的单位延时值<br />//******************************************************************************<br />void&nbsp;delay(unsigned&nbsp;char&nbsp;dly)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;int&nbsp;x;<br />&nbsp;&nbsp;while(dly--)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;1000;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(x--);<br />&nbsp;&nbsp;}<br />}<br /><br />//******************************************************************************<br />//&nbsp;外部中断0的中断处理函数void&nbsp;ISR0()<br />//&nbsp;注意:旋转编码器的A接P3.2,B接P1.7(跟你图上一样不变)<br />//******************************************************************************<br />void&nbsp;ISR0()&nbsp;&nbsp;&nbsp;interrupt&nbsp;0<br />{<br />&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x80)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(10);&nbsp;//消抖动,延时一会,确认P1.7仍然为高,如果频率比较高,延时要缩短<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter++;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(10);&nbsp;//消抖动,延时一会,确认P1.7仍然为低,如果频率比较高,延时要缩短<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((P1&0x80)&nbsp;==&nbsp;0x00)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter--;<br />&nbsp;&nbsp;&nbsp;}<br />}<br />

567 发表于 2007-7-17 19:29

定时查询端口电平变化

AB<br />正转&nbsp;00-&gt01-&gt11-&gt10-&gt00-&gt01-&gt........<br />反转&nbsp;00-&gt10-&gt11-&gt01-&gt00-&gt10-&gt........<br /><br />举例说明:<br />上次采样AB引脚电平状态为00,本次采样的结果是01则说明正转一个脉冲,计数值加一,本次采样结果是10则说明反转,计数值减一。<br />依次判断<br />01-&gt11&nbsp;&nbsp;加一<br />11-&gt01&nbsp;&nbsp;减一<br />.<br />.<br />.<br />.<br />.<br />
页: [1] 2 3
查看完整版本: 看我个人信息里的《定时炸*C4的制造方法》,里边有用到这