2017-08-30 11 views
2

私は直角信号を生成しようとしますが、可能な限り低い動作をします。私は信号を送信するためにSTM32とGPIOピンB8とB9を使用します。 ピン8とピン9のペアには、時計方向の4つのオプションがあります。 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の逆数、または他の方法でのラウンドを取得します。あなたは2つのビットを交換し、方向に応じて0x100または0x200と排他的に交換します。

タイマー(または2つ)を使用
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の両方をトグルモードに設定し、OC1MOC2MビットをTIM4->CCMR1に設定して0b011に設定します。
  • プリスケーラPSCとリロードARRを設定すると、それぞれの出力がタイマーサイクルごとに1回トグルされるため、希望する周​​波数の2倍になります。
  • TIM4->CCR3=0TIM4->CCR4=(TIM4->ARR+1)/2を一方向のカウントに設定します。カウンターが停止している間にスワップして逆方向に移動します。
  • TIM4->CCERの出力を有効にします。
  • TIM4->CR1CENビットを設定またはリセットして、カウントを開始および停止することができます。
  • サイクル数をカウントするには、TIM4->DIERでイベントをトグルまたは更新するための割り込みを設定するか、別のタイマーをTIM4のスレーブとして使用できます。

  • を出力する0b010に各オーバーフローにトリガパルスをTIM4->CR2MMSビットを設定:カウントするTIM3
  • TIM3->SMCRを外部クロックモード1に設定し、TIM4の内部トリガを選択します。
  • TIM3->ARRを必要な半サイクル数-1に設定します。
  • 更新時に割り込みを構成します。
  • カウンタを起動します。

は「wawelength」値のテーブルからマスタータイマーのARRCCRレジスタを更新するために、スレーブによってトリガDMAバーストを使用してのように、タイマーで可能ないくつかのより多くのトリックがあります。

+0

こんにちはベレンディ、ご協力いただきありがとうございます。 私は変数ダウンの使用を理解したいと思いますか?私は何を使うべきですか? 私は、直角位相エンコーダを読み取るためにタイマを使用していました。あなたの設定は非常に詳細なようですが、私はそれを詳しく調べます。 – vib

+0

'down'は方向を逆転させます。 'down == 0 'のとき、ビットシフトは何もしません。ビット8はスワップ後に反転します。 'down == 1 'のとき、マスクはシフトされ、ビット9は反転されます。 – berendi

+0

OKありがとうございました。 説明したようにタイマーを設定してmain.cを投稿してもよろしいですか? 私は何かしようとしましたが、すべてのパラメータを理解していないので、希望の方形波が得られません。 これは非常に親切です;) – vib