我嘗試生成正交信號,但操作可能最低。我使用STM32和GPIO引腳B8和B9來發送信號。 引腳8和9的幾個引腳有四種可能的選項: 0/0 1/0 1/1和0/1 和逆時針 0/0 0/1 1/1 1/0 I無法按位尋找方式以便能夠快速設置或重置選定引腳的位。此外,我必須能夠進行時鐘或反向旋轉,並隨時改變感覺,如果它是旋轉或線性編碼器。通過位操作生成正交信號
謝謝您的幫助
我嘗試生成正交信號,但操作可能最低。我使用STM32和GPIO引腳B8和B9來發送信號。 引腳8和9的幾個引腳有四種可能的選項: 0/0 1/0 1/1和0/1 和逆時針 0/0 0/1 1/1 1/0 I無法按位尋找方式以便能夠快速設置或重置選定引腳的位。此外,我必須能夠進行時鐘或反向旋轉,並隨時改變感覺,如果它是旋轉或線性編碼器。通過位操作生成正交信號
謝謝您的幫助
位拆裂
按位思考,B9得到B8的前值,並計算下來的時候B8得到B9的倒數,或者反過來。您可以交換這兩個位,並根據方向進行排除或與0x100
或0x200
排除。
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。如果您有其中之一,則此計時器可以自主控制輸出,不受代碼,內存或中斷延遲的影響。
TIM4->CCMR1
爲0b011
。PSC
和重新加載ARR
設置爲實現所需頻率的兩倍,因爲每個輸出在每個定時器週期內都會切換一次。TIM4->CCR3=0
和TIM4->CCR4=(TIM4->ARR+1)/2
用於在一個方向上進行計數。交換它們(在計數器停止時)以反轉方向。TIM4->CCER
中的輸出。CEN
位TIM4->CR1
來啓動和停止計數。TIM4->DIER
中配置切換或更新事件的中斷,或使用另一個計時器作爲TIM4的從屬設備。要使用例如TIM3
數:
MMS
在TIM4->CR2
比特0b010
到輸出上的每個溢出的觸發脈衝。TIM3->SMCR
配置爲外部時鐘模式1,並選擇TIM4的內部觸發。TIM3->ARR
設置爲需要的半週期數 - 1.有一些可能具有定時器更多的花樣,例如使用由從觸發以從「wawelength」值的表更新主定時器的ARR
和CCR
寄存器DMA脈衝串。
遞增/遞減(模4)? – wildplasser
這將不會產生所需的0,1,3,2序列 – berendi