2017-08-30 76 views
2

我嘗試生成正交信號,但操作可能最低。我使用STM32和GPIO引腳B8和B9來發送信號。 引腳8和9的幾個引腳有四種可能的選項: 0/0 1/0 1/1和0/1 和逆時針 0/0 0/1 1/1 1/0 I無法按位尋找方式以便能夠快速設置或重置選定引腳的位。此外,我必須能夠進行時鐘或反向旋轉,並隨時改變感覺,如果它是旋轉或線性編碼器。通過位操作生成正交信號

謝謝您的幫助

+0

遞增/遞減(模4)? – wildplasser

+0

這將不會產生所需的0,1,3,2序列 – berendi

回答

2

位拆裂

按位思考,B9得到B8的前值,並計算下來的時候B8得到B9的倒數,或者反過來。您可以交換這兩個位,並根據方向進行排除或與0x1000x200排除。

inline void incB89(int down) { 
    uint32_t temp; 

    /* read the current output state */ 
    temp = GPIOB->ODR; 

    /* modifying the significant bit-pair 
     don't care about overflow */ 
    temp = (((temp & 0x100) << 1) | ((temp & 0x200) >> 1))^(0x100 << down); 

    /* Setting the reset bits BR8 and BR9. This has the effect that 
     bits 8 and 9 will be copied into the ODR, and the rest will 
     be left alone */ 
    temp |= ((1 << 24) | (1 << 25)); 

    GPIOB->BSRR = temp; 
} 

使用計時器(或兩個)

在大多數STM32系列控制器,TIM4通道3和4級的輸出可以被映射到PB8及PB9。如果您有其中之一,則此計時器可以自主控制輸出,不受代碼,內存或中斷延遲的影響。

  • 根據控制器的參考手冊設置GPIO模式和備用功能寄存器。
  • 將通道3和通道4都配置爲切換模式,將位設置爲TIM4->CCMR10b011
  • 將輸入時鐘,預分頻器PSC和重新加載ARR設置爲實現所需頻率的兩倍,因爲每個輸出在每個定時器週期內都會切換一次。
  • 設置爲TIM4->CCR3=0TIM4->CCR4=(TIM4->ARR+1)/2用於在一個方向上進行計數。交換它們(在計數器停止時)以反轉方向。
  • 啓用TIM4->CCER中的輸出。
  • 您可以通過設置或重置CENTIM4->CR1來啓動和停止計數。
  • 要計數週期,您可以在TIM4->DIER中配置切換或更新事件的中斷,或使用另一個計時器作爲TIM4的從屬設備。

要使用例如TIM3數:

  • 設置MMSTIM4->CR2比特0b010到輸出上的每個溢出的觸發脈衝。
  • TIM3->SMCR配置爲外部時鐘模式1,並選擇TIM4的內部觸發。
  • TIM3->ARR設置爲需要的半週期數 - 1.
  • 在更新時配置中斷。
  • 啓動計數器。

有一些可能具有定時器更多的花樣,例如使用由從觸發以從「wawelength」值的表更新主定時器的ARRCCR寄存器DMA脈衝串。

+0

嗨,berendi,謝謝你的幫助。 我想了解使用變量down?我應該用什麼? 我正在使用定時器讀取正交編碼器。你的設置似乎是非常詳細的,我會仔細研究它.. – vib

+0

'下來'倒轉的方向。當'down == 0'時,位移無效,位8在交換後反轉。當'down == 1'時,掩碼將被移位,並且位9將被反轉。 – berendi

+0

好的非常感謝。 您是否介意使用所述的計時器設置main.c文件? 我嘗試了一些,但我不明白所有參數,所以我沒有得到所需的方波。 這將是非常善良;) – vib