STM32CubeMX と keil に基づいて、ユニバーサル タイマー割り込みを使用して固定 PWM および調整可能な PWM 波出力を実現し、それぞれ LED 点滅と呼吸光を実現します。

序文

前回のブログでLEDの点滅を実現する基本的なタイマーについて書きましたが、主にプリスケーラーとカウント、それにレベル反転を使用するもので、原理も具体的な動作も比較的簡単です。
このブログでは、ユニバーサルタイマーを選択して、PWM波を出力する機能を使用して、少し難しい効果のデモンストレーションを実行します。
このブログでは、LED0 の点滅と LED0 の呼吸光の効果をさらに実現するために、固定 PWM と可変 PWM を出力する方法について書きます。
功能实现效果:
PF9 は PWM 波を出力して LED0 を制御し、1 秒のサイクルと 0.5 秒の状態変化で点滅します。
PF9 は 20ms のクロック周期で LED0 を制御する PWM 波を出力し、呼吸する光を実現します。


1. PWM波形の説明

PWM波、パルス幅変調(パルス幅変調)とは、電気信号のパルス幅を調整する技術です。信号の高レベル時間と低レベル時間のデューティ サイクルを制御することで、情報を送信したり、出力を正確に制御したりできます。
PWM波では周期が固定されており、周期とは完全なハイレベルとローレベルの時間の長さを指します。パルス幅は高レベルまたは低レベルの期間であり、必要に応じて調整できます。パルス幅は信号の振幅に比例します。つまり、パルス幅が広いほど信号振幅は大きくなり、パルス幅が狭いほど信号振幅は小さくなります。

PWM 波の利点は次のとおりです。
1. シンプルで信頼性: PWM 変調回路は比較的シンプルで、低コストで信頼性が高くなります。
2. 高効率・省エネ:デューティ比を調整することでPWM波の出力平均値を制御できるため、高効率なエネルギー変換が可能となり、電力損失を低減できます。
3. 正確な制御: パルス幅を調整することにより、出力電圧、電流、または電力を正確に制御できます。
4. 強力な適応性: PWM テクノロジーはさまざまな種類の負荷に適しており、さまざまなニーズを満たすために周波数とデューティ サイクルを調整できます。

简单点概括一下つまり、ハイレベルとローレベルの方形波を出力し、デューティサイクルは調整可能です。


2.ユニバーサルタイマー

2.1 TIM14 を使用する理由

1つ目は機能要件ですが、このブログはLED0の点滅と呼吸の光効果について書いているので、実際にはPF9端子にPWM波の出力を与える必要があります。
以下の回路図から、PF9 が LED0 に接続されているだけでなく、TIM14_CH1 の出力としても使用できることがわかります。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
TIM14 が STM32CubeMX で直接有効になっている場合、TIM14 には STM32F407 で設定できる 2 つのピンがあるため、PF9 ではない可能性があります。PA7 を設定した場合、実際には出力 PWM 波を LED0 に与えることができません。ここでは便宜上、LED0 の PF9 の TIM14_CH1 を設定に使用します。
ここに画像の説明を挿入します

2.2 TIM14機能の紹介

TIM14は一般的なタイマの一種で以下の機能を持っていますが、このブログではPWM生成機能を使用します。
1. タイミング機能: TIM14 は、時間間隔または継続時間を測定するための単純なタイマーとして使用できます。経過時間はカウンタ値をインクリメントすることで記録され、タイミング精度はプリスケーラ係数とクロック ソースに基づいて決定されます。
2. タイミング割り込み: 特定のカウント値に達したときに割り込み要求を生成するように TIM14 を構成できます。カウンタの自動リロード値を設定し、割り込みを有効にすると、割り込みイベントをトリガーして特定のタスクまたは操作を実行できます。
3.PWM 生成: TIM14 を使用して、単純なパルス幅変調 (PWM) 信号を生成できます。カウンタのオートリロード値と比較レジスタの値を設定することで、パルスの周波数とデューティサイクルを制御できます。
4. シングル パルス モード: TIM14 は、特定のトリガー条件下でシングル パルス信号を生成するシングル パルス モードもサポートしています。トリガーソース、トリガー極性、パルス幅は、さまざまなアプリケーションシナリオに合わせて設定できます。
5. キャプチャ/比較モード: TIM14 は、入力キャプチャ モードで外部イベントまたは信号エッジを検出し、カウンタの現在値を記録できます。同時に、比較モードで比較レジスタの値と比較して、対応するイベントまたは出力動作をトリガーすることもできます。

2.3 いくつかの設定パラメータの説明

プリスケーラ係数などについては、STM32CubeMX および keil をベースにした LED 点滅を実現するための STM32F407 をベースとした基本的なタイマ割り込みを参照してくださいので、ここでは詳しく説明しません。
ここでは、前のブログと比較して PWM の新しい機能の一部、つまりPWM Generation Channel 1設定についてのみ説明します。

ここに画像の説明を挿入します

Mode:ここでは、PWM モード 1 と PWM モード 2 のどちらかを選択できます。この 2 つの違いは、
前者では、CNT<CCR である限り、つまり、カウンタの値が比較レジスタを設定すると、チャネルは有効になります。その逆も真実です。
前者の場合、ダウンカウントでは、CNT<CCR、つまりカウンタ値が設定された比較レジスタ値より小さい限り、チャネルは無効になります。その逆も真実です。
後者は前者の逆で、たとえば、インクリメンタルカウントの場合、CNT<CCR の場合、チャネルは無効になります。その逆も真実です。

Pulse:PWM パルス幅。CCR の値を設定します。ここでの値は、カウント期間全体よりも小さい必要があります。
Output compare preload:出力比較プリロード。自動リロードのプリロードに似ています。この値が有効な場合、CCR の値を変更します (ここでは、pluse の値です)。変更された値は、次の UEV イベントが有効になるまで待つ必要があります。それ以外の場合は、すぐに有効になります。
Fast Mode:出力比較高速モードを使用するかどうかは、レジスタ TIMx_CCMR1 の OC1FE ビットを設定して、トリガ入力イベントの CC 出力への影響を高速化することであり、通常は Disable に設定できます。
CH Polarity:チャンネル極性。有効な状態であり、High に設定すると、チャネルが有効なときに出力が High レベルになります。


2.4 PWM実装プロセスと割り込み

PWM 実装の全体的なプロセスは大まかに次のとおりです。
1.初始化定时器:まず、適切なタイマーを選択し、その基本構成を初期化する必要があります。これには、タイマーのモードの選択、クロック ソースとプリスケーラーの設定、カウンターのビット数の構成が含まれます。
2.设置PWM周期:必要に応じて PWM 波の周期を設定します。これは、タイマーの自動リロード値 (自動ロード レジスタ) を設定することによって実現されます。自動リロード値は、リロードして再びカウントを開始するまでのカウンタのカウント時間を決定し、それによって PWM 波の周期が決定されます。
3. 设置PWM占空比:PWM 波形の必要なデューティ サイクルに従って、タイマ (コンペア レジスタ) の比較値を設定します。比較レジスタの値によって、PWM 波の状態 (ハイ レベルまたはロー レベル) が変化するまでのカウンタのカウント時間が決まります。比較値を適切に調整することにより、所望のデューティ サイクルを達成できます。
4.使能定时器和PWM输出:タイマーを有効にし、PWM 出力を有効にします。これには通常、タイマー カウンターの有効化、PWM 出力チャネルのオン、対応するピンと出力ポートの設定が含まれます。
5.等待定时器中断或轮询:特定の実装に応じて、適切な処理を実行するか、PWM 波形のステータスを更新するために、タイマー割り込み要求を待つか、タイマー ステータスをポーリングして比較値に達したかどうかを判断するかを選択できます。

この実験を行う際、STM32CubeMX を使用して多数のコードを設定しました。書き込み後、機能しないことがわかりました。コードを注意深く確認したところ、有効になっていないことがわかりました。
次に、構成の完了後に PWM を有効にする方法を書き留めます。

2.4.1 無停電PWM出力(LED点滅)

PWM の出力を有効にし、関数を使用する必要がありますHAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)。この関数の最初のパラメーターは、TIM のイベント処理クラス オブジェクト (ここでは TIM14 のオブジェクトです) であり、次はチャネルです。TIM14 にはチャンネルが 1 つしかないため、ここでは CH1 にする必要があります。

この関数を使用する前にHAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)、この関数を使用する必要がありますHAL_TIM_Base_Start(TIM_HandleTypeDef *htim)。この関数は前者の前提条件、つまり、最初に Base_Start、次に PWM_Start があります。これも理解しやすいです。つまり、最初にいくつかの基本機能を有効にしてから、より高度な機能を有効にします。
LED の点滅は実際には固定デューティ サイクルの場合であるため、固定デューティ サイクルの PWM 波のみを中断することなく出力する必要があります。

2.4.2 割り込みPWM出力(LEDブリージングライト)

PWM 出力を中断すると、実際には各 PWM サイクルの終わりに割り込みがトリガーされます。したがって、上記と同様に、最初に基本機能を有効にしてから、高度な機能を有効にする必要があります。これは割り込みモードであるため、割り込みの初期化と割り込みベクタの優先順位の設定に加えて、対応する割り込み関連のスタートアップ関数を呼び出すだけで済みます。通常、割り込み関連の関数IT(の後には割り込みがあります)

HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim、uint32_t チャネル);

割り込みを使用する利点は、割り込みがトリガーされるたびにコールバック関数の CCR 値を変更できることです。これにより、デューティ サイクルが変更され、呼吸する光の効果が得られます。


3. STM32CubeMX 構成

3.1 GPIO 構成

ここに画像の説明を挿入します

3.2 クロック構成

外部水晶発振器をオンにします (実際には、オンにすることはできません。クロックの最終周波数設定によって決まります。一般に、外部水晶発振器をオンにすると、クロックを設定するときにより多くのクロック周波数に適応します)。下の写真のクロックツリー、私のクロックは
ここに画像の説明を挿入します内部から来ています。高速水晶発振器は、実際には、外部水晶発振器がオンになっているかどうかとは何の関係もありません。内部高速水晶発振器を使用して最終的に100MHzの周波数を取得したためです。分周器と位相ロックループを介して水晶発振器を生成します。
次のクロックの HSI RC は 16MHz を提供しますが、ディストリビュータを通過すると 2MHz になり、100 倍され 2 で除算され、チップが PLLCLK を選択し、周波数が 2 倍になり、最終的に設定した 100MHz になります。
TIM14 は APB1 バス上にあるため、APB1 バスのクロック周波数にも注意する必要があります。これは自動的に 50MHz に設定されます。
つまり、TIM14 によって得られる初期クロックは 50MHz であり、その後のタイマー分周は 50MHz に基づいています。
ここに画像の説明を挿入します

3.3 タイマ関連のパラメータ設定


0.5sフリッカを実現する場合、1クロック周期1msとなるように分周係数を設定し、周期1sのPWM波周期を得るためにARRを999に設定する構成となります
デューティ サイクル500 ∗ 1 ms を得るには、パルスは 500 です 1000 ms = 500 ms 1000 ms = 0.5 \frac{500*1ms}{1000ms}=\frac{500ms}{1000ms}=0.51000ミリ500 1ミリ=1000ミリ500ミリ=0.5 PWM 波。

ここに画像の説明を挿入します
ブリージングライトエフェクトを実装する場合は、
1クロック周期0.1msとなるように分周係数を設定し、PWM波周期20msとなるようARRを199に設定します。
デューティ サイクル50 ∗ 0.1 ms を得るには、パルスは 50 です。 20 = 5 ms 20 ms = 0.25 \frac{50*0.1ms}{20}=\frac{5ms}{20ms}=0.252050 0.1ミリ=20ミリ5ミリ=0.25 PWM 波形。
ここに画像の説明を挿入します

これらを個別に設定する必要がある理由は、私自身の設定の効果がより明白であり、必要に応じて変更することもできるためです。


3.4 デバッグ構成

ここに画像の説明を挿入します

3.5 割り込み構成

ここに画像の説明を挿入します

3.6 コード生成

ここに画像の説明を挿入します
ここに画像の説明を挿入します


4. コードの書き方

4.1 LED点滅コードの書き込み

割り込みを使用しない場合、コードは比較的単純で、実際に必要なのは main 関数内で割り込みを有効にするだけです。
ここに画像の説明を挿入します

	//不使用中断即输出固定占空比的PWM
	HAL_TIM_Base_Start(&htim14);
	HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1);

LED 点滅の初期化パラメータ:
ここに画像の説明を挿入します

4.2 LED呼吸灯コードの書き込み

PWM のデューティ サイクル、つまり CCR 変数の値を調整する必要があるため、呼吸光には割り込みが必要です。
1 つ目は割り込みを有効にすることです

	//使用中断,在回调函数里改变占空比
	//HAL_TIM_Base_Start_IT(&htim14);
	//HAL_TIM_PWM_Start_IT(&htim14,TIM_CHANNEL_1);

コールバック関数は、HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)カウンターがパルスによって設定された値に達したときにトリガーされる関数です。
パルス幅などを調整するにはパラメータの設定も必要です。

uint16_t plusWidth=500;//脉宽
uint16_t dirInc=1;//脉宽变化方向,1为递增,0递减

コールバック関数コード:

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	//只针对TIM14进行中断处理
  if(htim->Instance!=TIM14)
	{
		return;
	}
	//如果是脉宽递增则增加脉宽
	if(dirInc==1)
	{
		plusWidth++;
		if(plusWidth>=195)
		{
			plusWidth=195;
			dirInc=0;
		}
	}
	//如果是脉宽递减则减少脉宽
	if(dirInc==0)
	{
		plusWidth--;
		if(plusWidth<=5)
		{
			plusWidth=5;
			dirInc=1;
		}
	}
	//__HAL_TIM_SetCompare(定时器对象指针,定时器通道,需要设置的CCR值);
	__HAL_TIM_SetCompare(&htim14,TIM_CHANNEL_1,plusWidth);
}	

ブリージングライトの初期化パラメータ設定
ここに画像の説明を挿入します


要約する

このブログはタイマーの PWM 機能とそのアプリケーション実装をまとめたもので、非常に詳細に書かれています。対応する MX プロジェクトと Keil コードを冒頭に置いていますので、自分で入手する必要があります。

おすすめ

転載: blog.csdn.net/Edwinwzy/article/details/131966919