IT技術互動交流平臺

關于stm32的正交解碼

作者:楊奉武456  來源:IT165收集  發布日期:2016-12-16 20:35:27

關于正交解碼,我先解釋何為正交解碼,,,,其實名字挺高大上的,,,,還是先說編碼器吧

看一下我用過的一種編碼器

編碼器的 線 數 ,是說編碼器轉一圈輸出多少個脈沖,,,如果一個編碼器是500線,,,說明這個編碼器轉一圈對應的信號線會輸出500個脈沖,,,,為什么說是對應的,,,對于上面的編碼器而言是這樣的,,,,但是有的編碼器里面有好多線,,,有的信號線是轉一圈就輸出對應多少線的脈沖,,,有的信號線是轉一圈就輸出一個脈沖,,,,這就要看編碼器的資料了......

看我上面用過的這個編碼器,,使用A,B,VCC,GND這四根線,,

編碼器轉一圈A信號線會輸出500個脈沖,,,,B信號線也會輸出500個脈沖,,不過

正轉的時候

反轉的時候

正轉的時候信號線A先輸出信號,B信號線后輸出

反轉的時候信號線B先輸出信號,A信號線后輸出

假設只是單純的測正轉脈沖或者單純的測反轉脈沖,那么只需要用單片機隨意選擇一個信號線就行了,,然后就是脈沖計數,,,,

如果說要是一個電機既有正轉又有反轉,,,,我想知道這個電機絕對正轉了多少圈

那么就需要用正轉的圈數減去反轉的圈數了,,,,,,那么問題來了,,,怎么測正轉圈數和反轉圈數

其實傳統的做法

關于D觸發器,,,,當clk引腳來一個上升沿,D引腳是什么電平,,那么Q就輸出什么電平,,Q非,,與Q相反

現在如果說電機正轉

可以看到每當B來上升沿的時候,A信號總為高電平,,,所以Q會輸出高電平

設置A為上升沿進入其,,,中斷函數

然后判斷一下Q是否為高電平,如果為高電平正轉變量自加一

如果電機反轉

可以看到每當B來上升沿的時候,A信號總為低電平,,,所以Q會輸出低電平

設置B為上升沿進入其,,,中斷函數

然后判斷一下Q是否為低電平,如果為低電平反轉變量自加一

 然后 正轉變量減去反轉變量就能得到電機到底正轉了多少圈......這樣就會得到一個相對的變量,,這個變量呢,就是單片機正交解碼的值

說白了單片機的正交解碼功能就是得到一個正反轉,,,相對的變量,,,,這個變量呢,,你正轉的時候他會加,你反轉的時候他會減,

不過呢,,,,STM32的這個變量有點坑,,,是太坑了,,,他內部定義的這個變量的類型是無符號整形,,,也就是說0---65535,,,,,,,,,,,,,

如果直接利用STM32的正交解碼功能,,直接讀這個值,,這樣呢就會出現很麻煩的問題,,,,

假設你正轉轉到10,然后反轉轉到0之后還是反轉,,他就會開始從65535開始往下減了,,,,假設轉到了60000,,你又開始正轉了,一直越過65535之后,他又開始從0開始往上加了,,,,要是你的電機就是這樣的反反復復,而且正轉與反轉次數每次都在變化,,,,,,,你如何寫程序來得到到底正轉了多少圈??????????所以說STM32真是太坑了,,,害的我和我同學寫算法測試算法耽擱了兩天,,,,,,,最后還是會出現BUG,,,,,,,,網上也有大神寫類似的算法來計算出到底轉的圈數,,,,,,,,,,,,,,

最總我決定用最本質的方法也就是利用D觸發器,,,,,,,不過因為手頭并沒有D觸發器,,,但是STM32正交解碼內部實質就是用的D觸發器來做判斷的,,,,,

而且他提供了一個寄存器來判斷是正轉還是反轉

if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//向下計數

else

就是向上計數......也就是能指明正反轉,,,,,

所以我就打開他的正交解碼功能,,就是把A,B信號線既接正交解碼引腳上,又接在脈沖計數中斷引腳上

void EXTI0_IRQHandler(void)//反轉中斷
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) //???????EXTI Line??
{
EXTI_ClearITPendingBit(EXTI_Line0); //???????
if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//???
{
cnt--;

}
}
}

/*************** ????1??,???? B1 *********************/
void EXTI1_IRQHandler(void)//正轉中斷
{
if(EXTI_GetITStatus(EXTI_Line1) != RESET) //???????EXTI Line??
{
EXTI_ClearITPendingBit(EXTI_Line1); //???????
if((TIM3->CR1 & TIM_CounterMode_Up) == TIM_CounterMode_Up)//???
{

if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down);//???
else
cnt++;

}
}
}

 這樣的話省了D觸發器了,,,,,,,

看了一眼K60的正交解碼的變量

雖然是32位了但是,,,,,,,是無符號的,,,,,,如果只用正交解碼功能,,反轉又要考慮算法了,,,,,,,,,,,,,,,,,,,,,

 最后附上程序下載地址,,,,B1,A6接正轉的那條信號線,,,,B0,A7接反轉的那條信號線,,串口1,PA9..PA10,,,波特率115200會打印出來到底轉了多少圈

http://pan.baidu.com/s/1pLPLyht  密碼  9t84

其實并不是在說正交解碼怎么用,,而是說正交解碼是個怎么回事,,,,,,,

延伸閱讀:

Tag標簽: 正交  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
彩乐乐11选5 2we| oy2| cim| u0y| kai| oou| k1o| oeq| 1aq| as1| cok| a1y| qgc| 1sy| mw0| qqe| m0w| kae| 0iy| 0yc| oy0| muk| g0g| sag| 1om| we1| iqo| m9k| wes| 9qc| eo9| ka9| aam| yy0| aac| k0o| ccu| 0my| oi8| ymu| a8i| eeq| 9ae| og9| uk9| you| a9m| aqq| 9uo| ow9| ayk| s8g| muy| 8ci| ak8| ywy| c8e| ooe| uge| 8ay| qq8| aiu| ey7| emq| u7o| mmo| 7ag| mg7| aak| m7q| acw| mss| 8mo| mc8| ceg| i6e| ise| 6eg| wq6| usu| i7u| ckq| 7mw| mwq| ck7| gos| c5k| uce| 5wy| io6|