2014年12月22日 星期一

Encoder使用

這個月被二位網友問到Encoder問題。
Bee看過很多MCU工程師寫的程式,大部分工程師將I/O暫存器當RAM用。
但實際上硬體不穩定時,就查得要死要活的,很難穩定系統,又不知問題在那裏。
Bee也是過來人,因為早期Bee也寫過不穩定的硬體(用FPGA),軟體上吃了大虧,自此養成必要時才動硬體暂存器的習慣。
也就是使用Encoder,必要時才讀,再轉成32位元變數(64位元也可以),以32位元為其他軟體的依據。
這招不僅是減少對硬體的依賴度,也增加不同平台的可移植性。
同樣的Encoder程式,用在數個案子內:
1. 8051,使用中斷方式解Encoder,可用。
2. FPGA,使用I/O讀取24位元,可用。
3. STM32,內建Encoder,16位元,可用。
上層馬達控制程式完全不用修改。

其中有幾行連博士也覺得神奇,找過各大網站,就是找不到為何可以用。
以STM32系統為例:

int Encoder_Count;
unsigned short Last_Encoder;

void GetEncoder(void)
{
    unsigned short Encoder = 0;
    int Encoder_Diff;
   
    Encoder = TIM_GetCounter(ENC_TIMER);
    Encoder_Diff = (short)(Encoder - Last_Encoder);
    Last_Encoder = Encoder;
    Encoder_Count += Encoder_Diff;
}

Encoder_Count就是32位元Encoder的值,一樣不管Encoder暫存器是16/24位元,都先轉成32位元。
之後再重新計算,看是單向運動,圓週運動,基本上32位元都不會掉精度。

Encoder_Diff = (short)(Encoder - Last_Encoder);
此行則是利用unsigned在計算時underflow/overflow的特性得到差值,這是一般人不會使用的。

2 則留言:

  1. 這個是用上次減這次計數器,差值(累計)積分的效果

    回覆刪除
    回覆
    1. 是的,完全正確。但overflow, underflow的處理才是重點。很多人在這裏又加了很多判斷式。

      刪除