旋转编码开关程式,看各位写的太复杂,我写了个精简的,才5行,M8,测试稳定。
今天做一个信号发生器,想用旋转编码开关,看了一个坛子里的程式,写的太复杂,于是乎我写了个简单的,测试稳定,大家看看吧,
(我用的这个转一档,AB脚上的电压只变化一次。坛子里图都是转一档变化两次,所以大家用的时候只用把中断触发方式改一下就行了)
M8,,12MHZ,INT0,--------PD2--PD3.
/****************************************************************
//函数名称:int0_isr(void)
//功 能:中断0处理函数
//入口参数:无
//出口参数:无
*****************************************************************/
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
char i,j;
SREG=0x00; // 我试过,不用关中断也没问题。
i=(PIND&0B00001000); //读第一脚值
j=(PIND&0B00000100); //读第二脚值
if(i){i=1;}else{i=0;} //整理
if(j){j=1;}else{j=0;}
if(i==j){pp--;}else{pp++;} //如果一样就是+,不一样就-
SREG=0x80; // 不用关中断的话,当然这句也可以不用,
}
/****************************************************************
//函数名称:MAIN
//功 能:
//入口参数:无
//出口参数:无
*****************************************************************/
void main()
{
MCUCR=0B00000001; //我用的这个和大家画的那个图不一样,所以只要变动就触发。
GICR=0b01000000; //INT0
SREG=0x80; //使能全局中断
while(1)
{
show1(pp);
}} 顶一下 测试,最快旋转和最慢旋转没有掉步现象。4.7K上拉,104滤波。 哈哈,有空试试 mark. 给你简化一下只剩一行
//i=(PIND&0B00001000); //读第一脚值
//j=(PIND&0B00000100); //读第二脚值
//if(i){i=1;}else{i=0;} //整理
//if(j){j=1;}else{j=0;}
if(!((PIND^(PIND>>1))&4)) {pp--;} else {pp++;} //如果一样就是+,不一样就- 或者:
if((PIND^(PIND>>1))&4) {pp++;} else {pp--;} 记号一下 【6楼】 hsztc
积分:1815
派别:
等级:------
来自:福建省
或者:
if((PIND^(PIND>>1))&4) {pp++;} else {pp--;}
哈哈,强 我试试,
可以用,
这下子剩一行了, 居然没看明白,还是MARK吧 ;mark 还真是这么写的...自己都没注意,这是两步一脉冲周期那种 MARK 顶顶顶! mark 这个不叫一行,用?:改写才是一行
给你简化一下只剩一行 //i=(PIND&0B00001000); //读第一脚值 //j=(PIND&0B00000100); //读第二脚值 //if(i){i=1;}else{i=0;} //整理 //if(j){j=1;}else{j=0;} if(!((PIND^(PIND>>1))&4)) {pp--;} else {pp++;} //如果一样就是+,不一样就- mark mark! U8 direction = (PIND&_BV(PD2))!= (PIND & _BV(PD0)); 突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、 mark mark 回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、
-----------------------------------------------------------------------
其实两三页是正常的,还要考虑到加速的问题,多功能这些问题,比如照你的程序要是加1W的话,你扭到手断都扭不到目标,哈哈. Mark 如果是汇编的要几行呢,一点也不懂C的说。 【22楼】 xjavr
积分:63
派别:
等级:------
来自:
回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、
-----------------------------------------------------------------------
其实两三页是正常的,还要考虑到加速的问题,多功能这些问题,比如照你的程序要是加1W的话,你扭到手断都扭不到目标,哈哈.
---------------------------------------------------------------------------
这倒有可能,没仔细看,多谢, mark Mark! 先作个记号。 mark 不考虑去抖?光电的应该可以机械的…… mark mark 学习了!用了几个IO?? mark yong 2 IO. 我不太理解它的工作原理 学习一下 mark! 中断后 保存一下时间,
主程序中判断一下就能处理速度问题了 要是按楼上各位的用法,恐怕也只能自己玩玩了。
用过的都知道,编码器这样得出的数误差很大,具体原因是因为运动时的抖动造成的。 不错,思路很新颖,加上去抖动就更好了。 记号 搞过定时扫描的,不用中断 MARK,很不错. 我感觉在某个位置时,会出现连续自加,自减呢? 留个记号! MARK 哈哈,顶一下~~ 收藏,人多力量大啊 回复【46楼】zhonghua_li 蓝色天空
我感觉在某个位置时,会出现连续自加,自减呢?
-----------------------------------------------------------------------
详细说说?具体那个部位? 学习 mark 这样弄在用高分辨率的编码器时是会出问题的。 不错,准备在stm32试一下 oK!mark 留个记号,学习了。 MARK ;mark mark mark一下,先藏着,等回头再来学习 mark 马 回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
<< 一个被按下后判断另一个,如果两脚一样就是正向,如果两脚不一样,就是反向>>
就这么简单,而且超稳定。
看过各前辈写的程式,都复杂化了,看有一个前辈竟然写了两三页。
如有不对,请多多指教、、、
-----------------------------------------------------------------------
楼主似乎忽略了一点,按你的说法就是X4模式,在每个相位引脚上升下降沿都会产生中断,你应该判断该中断是由A相还是B相触发后才能这么说。
假如A相超前B相90度
A相产生中断时
if(A==B)
{计数--;}
else
{计数++;}
而B相产生中断时
if(A==B)
{计数++;}
else
{计数--;}
http://cache.amobbs.com/bbs_upload782111/files_46/ourdev_682049A02Q8N.jpg
(原文件名:X4模式.jpg) mark mark 谢谢好东西有时间再看 mark 这样可能会有问题的 简单 MARK 抗干扰能力不行,玩玩可以 mark 自己做实验可以,但用在产品上就不严谨了,要考虑的东西太多,干扰 抖动 等。。。。 回复【65楼】68336016
-----------------------------------------------------------------------
只用一个中断就行了,要么用A相的,要么用B相的,进入中断后判断另一个脚的状态就行了, mark ,测试下 不知道大家有没有真正的测试,具我这么长时间的测试很稳定,
比我示波器上的稳定多了,示波器上的我要它加它就减,要它减它就加, mark 谢谢分享 mark mark 标记下,过几天有用 Mark哟~涨楼很快~ Mark 记号 好东西,我验证一下看看!! 记号一下。 开边沿中断可以,不开中断是不行的,因为必须在上下沿判断出的结果才有效 这个吧,只能自己玩玩和认识下编码器的,真用起来没这么简单的。。。。。 有空试一下楼主的行不行 正准备用这个 现在学习一下 学习了,谢谢! 不错,记号
学习,不想用mark 逻辑越简单,程序越稳定 正需要,马上试试 好好学习一下,先记号。 这个要MARK一下 谢谢66楼,看懂了 68336016 发表于 2011-10-4 10:21
回复【19楼】xiaole01 潇乐
突然想明白了,这东西就是这么简单,所以我总结出一句话:
>
只用一个中断就可以了,不用两个的,
页:
[1]
2