前書き#
もし以前に筆者が書いた「第一歩の設定」と「MSPM0 チュートリアル:SYSCONFIG の呼び出しと GPIO の出力と入力の設定」を読んでいない場合、設定エラーを防ぐためにこれらの 2 つを先に読むことを強くお勧めします。もしすでに SYSCONFIG の設定を完了している場合は、以下を続けて読んでください。
SYSCONFIG でタイマー PWM モードを設定する#
Keil を開き、empty.syscfg で sysconfig ツールを開きます。
まず、SYSCONFIG がこの PWM 設定についてどのように説明しているかを見てみましょう。
簡単に翻訳します:
この説明は、パルス幅変調(Pulse Width Modulation、PWM)ドライバモジュールの機能と設定オプションに関するものです。PWM は一般的なデジタル信号制御技術であり、指定されたデューティ比(デューティ比はパルス周期中の高レベル部分の時間とパルス周期全体の時間の比率)を持つエッジアラインドの波形を生成するために使用できます。
基本設定では、ユーザーは次のことができます:
- クロックソースの設定:PWM 波形のクロックソースを指定し、これは PWM 波形の周波数に影響します。
- タイマー設定の構成:PWM 波形の周期を調整します。通常、内部タイマーを設定することで実現されます。
- PWM の設定:
- PWM モードの選択:エッジアラインドモードやセンターアラインドモードなど。
- PWM チャネルの設定:比較値、デューティ比などのパラメータを含みます。これらのパラメータは出力される PWM 波形に影響します。
高度な設定では、ユーザーは次のことができます:
- クロストリガの設定:一部の複雑なアプリケーションでは、複数の PWM チャネルを同時に状態を変更する必要がある場合があります。その場合、クロストリガ機能を使用できます。
このモジュールは、TIMGx および TIMAx を含む MSPM0 の異なるタイプのタイマーをサポートしています。MSPM0L130x の機能は、以下の表に詳しく説明されています。具体的なパラメータや機能は、異なるデバイスによって異なる場合がありますので、選択したデバイスのデータシートを参照して詳細な情報を取得する必要があります。
非常に詳細な説明ですので、次に直接設定を開始しましょう。
ADD をクリックして、PWM を追加します。
関連する設定項目を設定し、Start Timer をクリックします。
次に PWM 設定に移りましょう。設定項目について説明します。
PWM モード
2 つのモードを設定できます。
エッジアラインド(Edge-Aligned)とセンターアラインド(Center-Aligned)です。
エッジアラインドモードでは:
- タイマーはカウントダウンモードに設定されます。ロード時に、出力信号は高に設定されます。比較値に達すると(デューティ比を決定する)、対応する出力信号は低に設定されます。したがって、各 PWM チャネルの立ち上がり時間(低から高への変化)は同じであり、立ち下がり時間(高から低への変化)は異なるデューティ比によって異なります。
センターアラインドモードでは:
- タイマーはアップダウンカウントモードに設定されます。カウント値が上昇し、比較値を超えると、出力は高に設定されます。カウント値が下降し、比較値に達すると、出力は低に設定されます。したがって、各 PWM チャネルの中央点は、タイマーの LOAD 値がカウンター内にあるときです。
これら 2 つのモードにはそれぞれ利点と欠点があり、異なるアプリケーションシナリオに適しています。エッジアラインドモードは実装が簡単で、より高い周波数の PWM 波形に適しています。一方、センターアラインドモードは対称的な PWM 波形を生成でき、モーターなどの負荷の電流リップルを減少させ、システムの効率と性能を向上させるのに役立ちます。
2 つの PWM チャネルを設定します。
FIle->Save をクリックします。
そして、Keil でコンパイルして、dl_config.c を初期化設定に更新します。
main 関数を書きます。
unsigned int utick = 0;//タイマー割り込みカウント
void SysTick_Handler(void)
{
SysTick->CTRL &= ~(1 << 16); /*タイマー割り込みフラグをクリア*/
utick++;//タイマー割り込みカウント
}
typedef enum CompareMode
{
CompareUp=0,
CompareDown
}CompareMode;
int main(void)
{
int pretime = 0;
unsigned short CompareValue0 = 100;
CompareMode comparemode = CompareUp;
SYSCFG_DL_init();
NVIC_EnableIRQ(UART1_INT_IRQn);
pretime = utick; //現在の時間を取得
while (1) {
switch (comparemode) {
case CompareUp:
if (utick > 100 + pretime)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, CompareValue0 += 50, DL_TIMER_CC_0_INDEX);
pretime = utick;//pretimeを更新
if (CompareValue0 > 700)
{
comparemode = CompareDown;//comparemodeをCompareDownに更新
}
}
break;
case CompareDown:
if (utick > 100 + pretime) {
DL_TimerG_setCaptureCompareValue(PWM_0_INST, CompareValue0 -= 50, DL_TIMER_CC_0_INDEX);
pretime = utick;//pretimeを更新
if (CompareValue0 < 100)
{
comparemode = CompareUp;//comparemodeをCompareUpに更新
}
}
break;
default:
// 他のケースを必要に応じて処理します。
break;
}
}
}
デモ#

転載の際は出典を明記してください。
By <a href=https://www.cnblogs.com/jiongsheng > QDU_jiongsheng