私は直角信号を生成しようとしますが、可能な限り低い動作をします。私は信号を送信するためにSTM32とGPIOピンB8とB9を使用します。 ピン8とピン9のペアには、時計方向の4つのオプションがあります。 0/0 1/0 1/1および0/1 および反時計回り 0/0 0/1 1/1 1/0 I選択したピンのビットをすばやく設定またはリセットできるように、ビット単位で方法を見つけることができません。 さらに、回転式またはリニア式のエンコーダーであれば、時計や反時計回りに移動してセンスを変えることができなければなりません。 ビット操作による直交信号の生成
はあなたの助けをありがとう答えて
ビットバンギング
ビット単位の考え方は、B9はB8の前の値を取得し、ダウンカウント時B8はB9の逆数、または他の方法でのラウンドを取得します。あなたは2つのビットを交換し、方向に応じて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にマッピングすることができます。これらのいずれかがある場合、このタイマーは、コード、メモリ、または割り込みレイテンシの影響を受けずに出力を自律的に制御できます。
- コントローラのリファレンスマニュアルに従って、GPIOモードと兼用機能レジスタを設定してください。
- チャネル3と4の両方をトグルモードに設定し、
OC1M
とOC2M
ビットをTIM4->CCMR1
に設定して0b011
に設定します。 - プリスケーラ
PSC
とリロードARR
を設定すると、それぞれの出力がタイマーサイクルごとに1回トグルされるため、希望する周波数の2倍になります。 TIM4->CCR3=0
とTIM4->CCR4=(TIM4->ARR+1)/2
を一方向のカウントに設定します。カウンターが停止している間にスワップして逆方向に移動します。TIM4->CCER
の出力を有効にします。TIM4->CR1
のCEN
ビットを設定またはリセットして、カウントを開始および停止することができます。- サイクル数をカウントするには、
TIM4->DIER
でイベントをトグルまたは更新するための割り込みを設定するか、別のタイマーをTIM4のスレーブとして使用できます。
- を出力する
0b010
に各オーバーフローにトリガパルスをTIM4->CR2
にMMS
ビットを設定:カウントするTIM3
。 TIM3->SMCR
を外部クロックモード1に設定し、TIM4の内部トリガを選択します。TIM3->ARR
を必要な半サイクル数-1に設定します。- 更新時に割り込みを構成します。
- カウンタを起動します。
は「wawelength」値のテーブルからマスタータイマーのARR
とCCR
レジスタを更新するために、スレーブによってトリガDMAバーストを使用してのように、タイマーで可能ないくつかのより多くのトリックがあります。
こんにちはベレンディ、ご協力いただきありがとうございます。 私は変数ダウンの使用を理解したいと思いますか?私は何を使うべきですか? 私は、直角位相エンコーダを読み取るためにタイマを使用していました。あなたの設定は非常に詳細なようですが、私はそれを詳しく調べます。 – vib
'down'は方向を逆転させます。 'down == 0 'のとき、ビットシフトは何もしません。ビット8はスワップ後に反転します。 'down == 1 'のとき、マスクはシフトされ、ビット9は反転されます。 – berendi
OKありがとうございました。 説明したようにタイマーを設定してmain.cを投稿してもよろしいですか? 私は何かしようとしましたが、すべてのパラメータを理解していないので、希望の方形波が得られません。 これは非常に親切です;) – vib
- 1. Javaによるバイト・ビット操作
- 2. ビット操作AND
- 3. C++ビット操作
- 4. ビット操作
- 5. ビット操作
- 6. Cビット操作
- 7. ビット操作を使わない乱数生成
- 8. Cビット設定(ビット操作)
- 9. Elasticsearchインデックスの作成直後に読み取り操作が発生する
- 10. アセンブリのビット操作
- 11. モニタに送信される信号を操作する
- 12. 交通信号機のコーディング
- 13. 信号のエラーPost_SaveとPre_Save:作成され、自己!直し方?
- 14. ビット操作符号化インタビューをクラッシュする
- 15. ビット操作MIPSアセンブリ
- 16. 16進ビット操作
- 17. 32ビット整数のビット操作
- 18. 長いビットのビット操作エラー
- 19. ロング・カウント・セットおよびアンセット・ビットでのJavaビット操作
- 20. Javaのロング - ビットの操作
- 21. DataTableの交差操作
- 22. ANSI Cのビット操作ライブラリ
- 23. Perlでのビット操作
- 24. Cコードでのビット操作
- 25. Pythonのビット配列操作
- 26. ビット単位の操作:FitsBits
- 27. Javaビット操作の問題
- 28. ByteArrayからのビット操作
- 29. ByteStringのビット単位操作
- 30. ビット単位のC操作
増分/減分(モジュロ4)? – wildplasser
必要な0,1,3,2シーケンスを生成しません – berendi