单片机+旋转编码器的使用问题

单片机+旋转编码器的使用问题,  买了一个旋转编码器模块,之前单片机也是小白,但想学会使用编码器,以后可以做应用玩。对自己编程逻辑思维没有信心,所以在论坛上找了…

单片机+旋转编码器的使用问题,  买了一个旋转编码器模块,之前单片机也是小白,但想学会使用编码器,以后可以做应用玩。对自己编程逻辑思维没有信心,所以在论坛上找了很多例程,有3,4段,编码器的基本原理和编程思想也有点看明白了,但每个程序改来改去都用不了,好几天都没有进展。。崩溃。直到自己换了一个拆机的3线编码器,发现有数值变化,才证明不是程序写错了。。这个编码器有用过的吗?是模块设计的有问题吗?直接从编码器引线是可以用的,短接掉RC滤波器的R也能用。是什么原因造成的呢?和51单片机兼容不行?解决办法可以把R1,R4换成小电阻吗?
,编码开关不需要电阻的,中间一根线接地,两边两根线随便接两个IO就可以了,如果想要放心一点,那就加分别加一个上拉电阻就可以了
你测量阻值是没有意义的,编码开关实际上是通过检测哪个引脚先导通来区分顺时针还是逆时针转动的
编码开关是分好几种的,你一定要先这个开关的资料,再根据这个开关的时序图来写程序,不同的开关有不同的程序,我用At89C52 接5线旋转编码器才用查询法调试, 右旋调大,左旋调小,就是不能快速旋转会反应不过来.偶尔会有左旋反而调大,右旋反而调小发生, 总体可用.  线路上只有10k上拉电阻, MPU和编码器之间没有串10K电阻.,就用你自己画的那个原理图,同上电,旋转开关,看一下输出端的波形,你就明白了。要学会用示波器去分析电路,用《人人学会单片机》视频教程的代码,直接IO口接上就行了。如果P0需要上拉。不需要电容 更不需要串联电阻。主函数高速循环不断的调用以下扫描函数就行了。
以下代码的A和B分别代表两个普通IO口。
void ROTARY_ROTARY_Scan_Drive(void)
{
        static xdata u8 count=0,Rotary_Flag=0;
        if(count>30)
        {
                count=0;
                if((ROTARY_B==0)&&(Rotary_Flag==0))                        //如果按键B按下,且flag是0       
                {
                        Rotary_Flag=1;
                        Rotary_Read_Data_Rotary++;                                //按键值增加1               
                }
                if((ROTARY_A==0)&&(Rotary_Flag==0))                        //如果按键A按下,且flag是0       
                {
                        Rotary_Flag=1;
                        Rotary_Read_Data_Rotary–;                                //按键值减少1
                }
                if((ROTARY_B!=0)&&(ROTARY_A!=0))                        //按键必须释放,下次按键才有效
                {
                        Rotary_Flag=0;
                }
        }
        count++;
}

,编码器直接和单片机相连 中间没有任何器件  如果接在P0口就要接上拉电阻  判断旋转方向就是先判断哪个脚先接地     比如三个脚分别是A左 B右  G地    向左转是A先接地 然后B在接地  向右转是B先接地 A后接地  只要判断出AB哪个先接地就可以判断出旋转方向  然后在延时等待下一次AB哪个按键先接地  延时时间慢慢调 确保快拧不会丢失对AB每一次接地的检测 也确保拧一下不会相当于拧了N多下  

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115