STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用:LEDの明るさを制御する

エントリー



前の2つの記事では、必要な周波数のクロック信号をPWMを使用して生成し、LEDでグローとその不在の等しい間隔を受信しました。 この問題には実際に対処する場所があります(後続の記事では間違いなく遭遇します)。 しかし、ほとんどの場合、PWMは別の目的に使用されます。 最も一般的な方法の1つは、LEDの輝度またはモーターの回転速度を制御することです。 また、PWMを使用して、サウンドを生成できます(これは次の記事になります)。 この記事では、コントローラーのLEDの明るさを制御する方法を説明します。







始めましょう:メインタイマーの設定を変更する



この記事のプロジェクトを基礎として取り上げます。 initTimerPWMled関数に基づいて、 initTimerPWMconstPeriod関数作成します。 関数パラメーターはPWM_speed(PWM周波数)ではなく、 timeEnabledState-パルスアクション時間になります。 この短い記事では、PWM法による出力での電圧生成の理論を完全に説明しています。 まず、パラメーターを決定しましょう。

時間が短いほど良い。 0xFFFFサイクルの期間を選択しました。 良い結果を得るには、これらの期間の最大頻度が必要です。 これを行うには、initTimerPWMconstPeriod関数でクロック分周器をオフにします。
MDR_TIMER1->PSG = 0; //    .
      
      



次に、信号の形成方法を変更する必要があります。 前の記事から思い出すように、 CH1_CNTRLレジスタのOCCMビットグループがこれを担当します。 次に、CNT == CCR1のREF信号の逆モードを選択しました。 CCRはデフォルトで0だったので、メインカウンターのARRを調整しました-同じ効果が得られました。 ここで、ARRでは、全期間のティック数(0xFFFF)を書き込み、CRRでは、出力のユニットのティック数(パルス持続時間)を書き込みます。 そして、モード6(0b110:DIR = 0(カウントアップ)の場合は1、CNT <CCR、それ以外の場合は0;)を選択します。

 MDR_TIMER1->ARR = 0xFFFF; //  .        0  0xFFFF. MDR_TIMER1->CCR1 = timeEnabledState; //    1     0 - . MDR_TIMER1->CH1_CNTRL = 6<<TIMER_CH_CNTRL_OCCM_Pos; // REF = 1,  CNT < CCR1, 0 - CNT >= CCR1;
      
      





実際、この段階では、すでにPWM信号のデューティサイクルを設定する関数があります。 ただし、CCR1の値を変更するときは、カウンターが超えないようにする必要があります。 これを行うには、レジスターCH1_CNTRL2の CRRRLDビットを設定します。 CCR1およびCCR2の値を変更できるのは、CNT == 0の場合のみです。
 MDR_TIMER1->CH1_CNTRL2 = TIMER_CH_CNTRL2_CCRRLD; // CCR1    CNT = 0.    .
      
      







終了:割り込みパラメーターの変更



PWM設定を見つけました。 キーをポーリングするための割り込みをわずかに変更するだけです。 その期間のパルス持続時間を特徴付ける新しい変数を設定します。 PWM_timeと呼びましょう。 デフォルトでは、0xFFFFになります(この値のPWMはなく、LEDは点灯しています)。 次に、キーを押したときに一歩踏み出す間隔を調べます。 これを行うには、期間のティック数を単純な要因に分解します。
 // 65535 = 3·5·17·257. 257        0 -    257 -   . =>  3*5*17 = 255.
      
      



計算から、255の間隔で歩くと、0から257までのスケール全体を通過できることがわかります。これを行います。 次のコードを取得します。

 // 65535 = 3·5·17·257. 257        0 -    257 -   . =>  3*5*17 = 255. if (UP_FLAG == 0) PWM_time+=255; // ,   - .   - -   . else if (DOWN_FLAG == 0) PWM_time-=255; else if (LEFT_FLAG == 0) PWM_time-=255; else if (RIGHT_FLAG == 0) PWM_time+=255; if (PWM_time < 0) PWM_time = 0; // ,   ""        . else if (PWM_time > 0xFFFF) PWM_time = 0xFFFF;
      
      



新しい値を割り当てるためだけに残ります。
 MDR_TIMER1->CCR1 = PWM_time; //  .
      
      



繰り返しますが、私たちは期間に触れないことに注意してください。 彼は不変です。 パルス幅のみを変更します。 全体の中断は次のようになります。
 int PWM_time = 0xFFFF; //    . void Timer2_IRQHandler (void) { MDR_TIMER2->STATUS = 0; //  .   . //LED1_FLAG = !LED1_FLAG; // ,    . // 65535 = 3·5·17·257. 257        0 -    257 -   . =>  3*5*17 = 255. if (UP_FLAG == 0) PWM_time+=255; // ,   - .   - -   . else if (DOWN_FLAG == 0) PWM_time-=255; else if (LEFT_FLAG == 0) PWM_time-=255; else if (RIGHT_FLAG == 0) PWM_time+=255; if (PWM_time < 0) PWM_time = 0; // ,   ""        . else if (PWM_time > 0xFFFF) PWM_time = 0xFFFF; MDR_TIMER1->CCR1 = PWM_time; //  . }
      
      



LEDの反転ラインを意図的に隠し、割り込みが発生していることを示しました。 2つのLEDに十分な電流がなく、望ましくないリップルが発生するためです。



おわりに



この記事では、PWMを構成および管理する方法について説明しました。 次の記事では、PWMを使用してサウンドを生成しようとします。



githubのプロジェクト。



以前の記事のリスト。
  1. STM32F103からK1986BE92QIに渡します。 または、ロシアのマイクロコントローラの最初の知り合い。
  2. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 keilでプロジェクトを設定し、LEDを点滅させます。
  3. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 システムタイマー(SysTick)。
  4. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 クロック設定
  5. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用化:音声を生成および再生します。 パート1:矩形および正弦波信号を生成します。 DACのマスタリング(DAC)。
  6. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用化:音声を生成および再生します。 パート2:正弦波信号を生成します。 DMAをマスターします。
  7. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用化:音声を生成および再生します。 パート3:正弦波信号を生成します。 DMA +タイマーの最初の知人の簡単な外観。
  8. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用化:音声を生成および再生します。 パート4:1ボイスおよびマルチボイスのミュージックカードのデジタルパーツを作成します。
  9. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用的なアプリケーション:キーを調べ、PWMを生成します。 CMSISとSPLコードの比較(PWM + TIM + PORT)。 パート1
  10. STM32からロシアのマイクロコントローラーK1986BE92QIに渡します。 実用的なアプリケーション:キーを調べ、PWMを生成します。 CMSISとSPLコードの比較(PWM + TIM + PORT)。 パート2



All Articles