旋钮编码器c代码_非常稳定的旋转编码器解码程序(C51源代码)
在網上下載過很多種編碼器解碼程序,使用后感覺都不夠穩定,特別是旋轉速度稍快時,經常會出現錯誤解碼。為此,經過分析編碼器輸出波形特點,結合其它解碼程序的優點,編寫如下代碼,不用中斷,也可以不用定時器。經過一段時間使用,效果很好,不論旋轉速度快慢,都不會出現錯誤解碼,比較穩定。
此程序在STC15W408AS單片機上調試通過,理論上其它C51單片機也可以;函數可以在循環中調用,也可在定時器中調用(定時器中調用時間間隔最好小于1毫秒,否則旋轉快了會丟碼);支持一定位一脈沖、兩定位一脈沖的編碼器解碼,函數中可設置編碼器類型;PINA和PINB是編碼器兩個引腳連接的IO口。編碼器靜止時函數返回0, 正轉(向右轉)返回單字符'R',反轉(向左轉)返回單字符'L',也可根據需要自行更改。
調用示例:
#include
unsigned char Encoder(void);
sbit PINA=P1^1;
sbit PINB=P1^2;
void main(void)
{
unsigned char enc,x=0,y=0;
while(1)
{
enc=Encoder();? ? //掃描編碼器,取得返回值
if(enc=='R')x++;??//正轉x累加
if(enc=='L')y++;??//反轉y累加
//以下為顯示或數據處理
}
}
/************************************************************************************************
函數名稱:Encoder
函數功能:編碼器旋轉的掃描及處理
入口參數:無
出口參數:char型? ? 0-無旋轉? ?'R'-正轉(向右轉)? ?'L'-反轉(向左轉)
************************************************************************************************/
unsigned char Encoder(void)
{
static bit Enc0=0,Enc1=0;
static unsigned char EncOld,EncX=0;
unsigned char EncNow;
bit EncType=0; //設置編碼器類型: 0為一定位一脈沖,1為兩定位一脈沖
PINA=1;? ?? ???//PINA置高電平
PINB=1;? ?? ???//PINB置高電平
if(Enc0==0)EncOld=(PINA?0x02:0x00)+(PINB?0x01:0x00),Enc0=1;??//記住初次調用時編碼器的狀態
EncNow=(PINA?0x02:0x00)+(PINB?0x01:0x00);? ? ? ? //根據兩個IO當前狀態組合成16進制的0x00|0x01|0x02|0x03
if(EncNow==EncOld)return(0);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//如果新數據和原來的數據一樣(沒有轉動)就直接返回0
if(EncOld==0x00&&EncNow==0x02||EncOld==0x03&&EncNow==0x01)EncX=EncNow;? ? ? ???//00-10|11-01
if(EncOld==0x00&&EncX==0x02&&EncNow==0x03||EncOld==0x03&&EncX==0x01&&EncNow==0x00)//00-10-11|11-01-00右轉
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('R');? ?//兩定位一脈沖
else? ?? ? //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60);? ?? ? //延時降低旋轉靈敏度(不能用在定時器中)
Enc1=0;
return('R');
}
}
}
if(EncOld==0x00&&EncNow==0x01||EncOld==0x03&&EncNow==0x02)EncX=EncNow;? ? ? ???//00-01|11-10
if(EncOld==0x00&&EncX==0x01&&EncNow==0x03||EncOld==0x03&&EncX==0x02&&EncNow==0x00)//00-01-11|11-10-00左轉
{
EncOld=EncNow,EncX=0;
if(EncType==1)return('L');? ?//兩定位一脈沖
else? ? ? ?? ? //一定位一脈沖
{
if(Enc1==0)Enc1=1;
else
{
//Delayms(60);? ?? ? //延時降低旋轉靈敏度(不能用在定時器中)
Enc1=0;
return('L');
}
}
}
return(0);? ? ? ?? ? //沒有正確解碼返回0
}
評分
總結
以上是生活随笔為你收集整理的旋钮编码器c代码_非常稳定的旋转编码器解码程序(C51源代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络近年的发展趋势,【网络技术论文
- 下一篇: 【神经网络】神经网络发展趋势及研究热点