日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

旋转编码器测速c语言程序,官方例程中编码器测速程序高低速怎么区分

發布時間:2024/3/24 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旋转编码器测速c语言程序,官方例程中编码器测速程序高低速怎么区分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如下是官方編碼器測速的程序:

//**** High Speed Calculation using QEP Position counter ****//

// Check unit Time out-event for speed calculation:

// Unit Timer is configured for 100Hz in INIT function

if(EQep1Regs.QFLG.bit.UTO==1) // If unit timeout (one 100Hz period)

{

/** Differentiator **/

// The following lines calculate position = (x2-x1)/4000 (position in 1 revolution)

pos16bval=(unsigned int)EQep1Regs.QPOSLAT; // Latched POSCNT value

tmp = (long)((long)pos16bval*(long)p->mech_scaler); // Q0*Q26 = Q26

tmp &= 0x03FFF000;

tmp = (int)(tmp>>11); // Q26 -> Q15

tmp &= 0x7FFF;

newp=_IQ15toIQ(tmp);

oldp=p->oldpos;

if (p->DirectionQep==0) // POSCNT is counting down

{

if (newp>oldp)

Tmp1 = - (_IQ(1) - newp + oldp); // x2-x1 should be negative

else

Tmp1 = newp -oldp;

}

else if (p->DirectionQep==1) // POSCNT is counting up

{

if (newp

Tmp1 = _IQ(1) + newp - oldp;

else

Tmp1 = newp - oldp; // x2-x1 should be positive

}

if (Tmp1>_IQ(1))

p->Speed_fr = _IQ(1);

else if (Tmp1<_iq>

p->Speed_fr = _IQ(-1);

else

p->Speed_fr = Tmp1;

// Update the electrical angle

p->oldpos = newp;

// Change motor speed from pu value to rpm value (Q15 -> Q0)

// Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q

p->SpeedRpm_fr = _IQmpy(p->BaseRpm,p->Speed_fr);

//=======================================

EQep1Regs.QCLR.bit.UTO=1; // Clear interrupt flag

}

//**** Low-speed computation using QEP capture counter ****//

if(EQep1Regs.QEPSTS.bit.UPEVNT==1) // Unit position event

{

if(EQep1Regs.QEPSTS.bit.COEF==0) // No Capture overflow

temp1=(unsigned long)EQep1Regs.QCPRDLAT; // temp1 = t2-t1

else // Capture overflow, saturate the result

temp1=0xFFFF;

p->Speed_pr = _IQdiv(p->SpeedScaler,temp1); // p->Speed_pr = p->SpeedScaler/temp1

Tmp1=p->Speed_pr;

if (Tmp1>_IQ(1))

p->Speed_pr = _IQ(1);

else

p->Speed_pr = Tmp1;

// Convert p->Speed_pr to RPM

if (p->DirectionQep==0) // Reverse direction = negative

p->SpeedRpm_pr = -_IQmpy(p->BaseRpm,p->Speed_pr); // Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q

else // Forward direction = positive

p->SpeedRpm_pr = _IQmpy(p->BaseRpm,p->Speed_pr); // Q0 = Q0*GLOBAL_Q => _IQXmpy(), X = GLOBAL_Q

EQep1Regs.QEPSTS.all=0x88; // Clear Unit position event flag

// Clear overflow error flag

}

高速是采用M法測量速度 ?低速采用T法測速

問題是怎么判斷是用M法還是T法呢?在程序中沒有進行判斷啊,僅靠這兩個狀態標志位夠用用嗎?不需要人為在程序中添加其他判斷條件嗎?

如果不是,那么是不是在eQEP初始化的時候做了哪些小技巧?多謝指教!

if(EQep1Regs.QFLG.bit.UTO==1) // If unit timeout (one 100Hz period)

if(EQep1Regs.QEPSTS.bit.UPEVNT==1) // Unit position event

總結

以上是生活随笔為你收集整理的旋转编码器测速c语言程序,官方例程中编码器测速程序高低速怎么区分的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。