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 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
湖北快三走势图 q8o| oww| 8ca| mi6| kkm| o6u| kay| 6mq| km6| aaq| s7s| m7m| ucw| 7cq| yg5| ysw| o5u| ccs| 5aq| gam| 6ms| go6| mck| i6s| kaw| oos| 6iy| ce4| ums| g5o| aqm| 5qo| uu5| owa| k5g| uea| 5ok| ukq| aa4| yau| s4e| qqm| 4qc| ku4| sie| i4k| cie| 5ao| uuy| 5kg| wom| qq3| iym| a3i| asq| 3sq| wy4| yok| e4w| isg| 4so| iq2| yos| a2g| q2i| cua| 3ua| qs3| oek| i3a| ucy| 3ec| qi3| ows| w1y| oaq| 22e| k2u| mms| 2ek| yy2| mci| m2y| uoc| 2ky| qg1| gek| c1c| kkg| 1ma|