PWMレジスタの初期化

このモジュールは主に PWM 波形機能と出力周波数デューティ サイクルを調整できるインプット キャプチャ機能を実現し、カウンタとしても使用できます。

1. 主な特長

1. 16 ビットのアップまたはダウン カウンタ。
2. 最大 6 つの PWM チャネルをサポートします。
3. 各チャネルは出力比較またはエッジ整列 PWM モード波形出力をサポートし、出力比較動作の設定、クリア、スイッチングをサポートし、PWM 出力の極性はオプションです。
4. 各チャンネルは立ち上がり、立ち下がり、または任意のエッジ入力キャプチャ トリガーをサポートします。
5. すべてのチャンネルで、中心揃えのパルス幅変調をサポートします。
6. システムクロック、水晶発振器クロック、または外部クロック入力として選択できるタイマークロックソースは、クロック 1/2/4/8/16/32/64/128 分周をサポートします。
7. 各チャネルに対して 1 つの関数割り込みとカウンタ オーバーフロー割り込みをサポートします。
8. 各チャネル ポートと外部クロック ポートは個別に有効化およびストローブされ、PWM カウントがサポートされている場合、チャネル ポートまたは外部クロック ポートは有効化されません。これらは GPIO 機能として個別に設定できます。
9. ADC サンプリングをトリガーするための PWM カウントをサポートします。

2. 初期化

pwm_init

/*!
    \brief      pwm initialize 
    \param[in]  pwm_sc: pwm control register  
    \param[in]  pwm_mod: pwm mod count        
    \param[out] none
    \retval     none
*/
void pwm_init(uint8_t pwm_sc,uint16_t pwm_mod)
{
    PWM_MOD = pwm_mod;
    PWM_SC = pwm_sc;
    if((pwm_sc & PWM_SC_TOIE) != 0U){
        NVIC_EnableIRQ(PWM_TOF_IRQN);
    }else{
        NVIC_DisableIRQ(PWM_TOF_IRQN);
    }
}

入力は pwm_sc レジスタと pwm_mod です。  

pwm_sc レジスタ:

8です

ビット 0 ~ 2 は PWM_SC_CLK_DIV (XXX) カウント クロックは PWM_SC_CLK_DIV の X 乗で分周されます。

ビット 3 ~ 4 PWM_SC_CLK_SEL (01) は、システム クロック カウントの選択を示します。

5 ビット PWM_SC_CPWMS (0) はカウントアップを意味します

6ビット PWM_SC_TOIE (1) 割り込みイネーブルをオンにする

7 ビット PWM_SC_TOF (0) はオーバーフローしません

0 ~ 2 ビットの PWM_SC_CLK_DIV レジスタは次のとおりです。5 をバイナリ (101) に変換するために 32 分周を選択します。 

 次に、pwm_sc は 01001101 として設定され、16 進数の 0x4D に変換されます。

 pwm_mod レジスタ:

0~15桁なので、カウンタ周期の最大値は111111111111111、10進数に換算すると32767になります。

カウンタモジュロレジスタ
カウンタ周期を設定するか、システムをリセットするか、PWM_CNT レジスタに書き込んでカウンタをクリアします。書き込みモード
最初のカウンタのオーバーフローを避けるために、レジスタをカウントする前にカウンタを閉じるか、カウンタをリセットする必要があります。
時の混乱が起こります。

 2000 (周期は 2ms) に設定しました。具体的なサイズは使い方によって異なります。一般的にはあまり大きくありません。私は PWM を使用してモーターを駆動します。

16進数に変換すると0x07D0になります

したがって、pwm_init は pwm_init(0x4D,0x07D0) として初期化されます。

pwm_ch1_init チャネルの初期化

pwm_ch_sc 制御レジスタと pwm_ch_cnt を入力します。

pwm_ch_sc

/*!
    \brief      pwm channel 1 initialize 
    \param[in]  pwm_ch_sc: pwm channel 1 control register
    \param[in]  pwm_ch_cnt: pwm channel 1 count  
    \param[out] none
    \retval     none
*/
void pwm_ch1_init(uint8_t pwm_ch_sc,uint16_t pwm_ch_cnt)
{
    PWM_C1SC = pwm_ch_sc;
    PWM_C1V = pwm_ch_cnt;   //占空比
    if((pwm_ch_sc & PWM_CnSC_IE) != 0U){
        NVIC_EnableIRQ(PWM_CH1_IRQn);
    }else{
        NVIC_DisableIRQ(PWM_CH1_IRQn);
    }
}

ビット 0 ~ 2 は PWM_SC_CLK_DIV (000) カウントクロックは 2 のべき乗で分周されます PWM_SC_CLK_DIV

ビット 3 ~ 4 PWM_SC_CLK_SEL (01) は、システム クロック カウントの選択を示します。

5 ビット PWM_SC_CPWMS (1) は、カウントアップとそれに続くカウントダウンを意味します (中央揃え)

6ビット PWM_SC_TOIE (1) 割り込みイネーブルをオンにする

7 ビット PWM_SC_TOF (0) はオーバーフローしません

pwm_ch1_sc は 01101000


pwm_ch_cnt

カウント値レジスタ
現在のカウント値を記録するか、システムをリセットするか、このレジスタに書き込んでカウンタをクリアします。

 3. 周期とデューティサイクル

PWM 信号の周期は、モジュラス レジスタ PWM_MOD の値によって決まります (16 進数0x07D0=10 進数 2000=2ms )。

デューティ サイクルは、チャネル レジスタ PWM_C x V の設定によって決まります。この PWM 信号の極性は、 PWM_C x SC_ELS 制御ビット の設定によって決まります。0% と 100% の両方のデューティ サイクルが可能です。

pwm_ch1_init チャネル初期化のPWM_C x V PWM_C1V = pwm_ch_cnt;

そして、PWM_C1V は 次のようなレジスタアドレスです

 デューティ サイクル = ( pwm_ch_cnt)/( pwm_mod )

50% = 1000/2000 = 0x03E8 /  0x07D0

この場合、pwm は常に 50 のデューティ サイクルを出力します。デューティ サイクルを調整したい場合は、pwm_ch_cnt のサイズを調整します。

ハードウェアの原理はおそらく、pwm が高レベルを入力すると三極管が接続され、正極と負極が接続されてモーターが駆動され、デューティ サイクルの速度が高レベルを設定する時間になるというものです。サイクルの中で。ハイレベルの期間は 100% のデューティサイクルです。

方向については、一般的にリレーを使用してモーターの方向を制御し、PWM でモーターの速度を制御します。

おすすめ

転載: blog.csdn.net/qq_51679917/article/details/130195075