HAL ライブラリ - タイマーの使用法と PWM

51マイコンとのタイミング比較

51 マイクロコントローラーの遅延 (ソフトウェア タイミング):

//由stc软件生成的51延时代码
void Delay500ms() //@11.0592MHz
{
    
    
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
    
    
do
{
    
    
while (--k);
} while (--j);
} while (--i);
}

短所: 不正確、CPU リソースを占有する

stm32タイマーの動作原理:

正確なタイムベースを使用して、ハードウェアを通じてタイミング機能を実装します。タイマーの核となるのはカウンターです。
ここに画像の説明を挿入します

タイマーの分類:

  • 基本タイマー(TIM6~TIM7)
  • 汎用タイマ(TIM2~TIM5)
  • アドバンストタイマー (TIM1 および TIM8)

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

STM32F103C8T6 タイマー リソース:

ここに画像の説明を挿入します
一般的なタイマーの紹介:

  1. 16 ビットのアップ、ダウン、アップ/ダウン オートロード カウンター (TIMx_CNT)。
  2. 16 ビットのプログラマブル (リアルタイムで変更可能) プリスケーラー (TIMx_PSC)。カウンター クロック周波数の分周係数は1 ~ 65535 の
    任意の値です。
  3. 4 つの独立したチャネル (TIMx_CH1 ~ 4)、これらのチャネルは次のように使用できます。
    A. 入力キャプチャB
    出力比較
    C.PWM生成(エッジまたはセンターアライメントモード)
    D. シングルパルスモード出力
  4. タイマーの同期回路とタイマー相互接続 (1 つのタイマーを使用して別のタイマーを制御できます) は、外部信号 (TIMx_ETR) を使用して制御できます
  5. 割り込み/DMA は、次のイベントが発生したときに生成されます
    更新: カウンタのオーバーフロー/アンダーフロー、カウンタの初期化 (ソフトウェアまたは内部/外部トリガ経由)
    B. トリガーイベント (内部/外部トリガーによるカウンターの開始、停止、初期化またはカウント)
    C. 入力キャプチャ D
    出力比較
    E. 位置決め用のインクリメンタル (直角位相) エンコーダおよびホール センサー回路をサポート
    F. 外部クロックとしてのトリガー入力またはサイクルごとの電流管理

タイマーカウントモード:

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

タイマークロックソース:

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

タイマーオーバーフロー時間の計算式は次のとおりです。

ここに画像の説明を挿入します
(PSC は分周係数) (ARR はリロード値) (Tout は出力時間 (必須)) (Tclk はクロック周波数)
既知: Tclk = 72MHZ
たとえば、1000ms の時間を測定したい場合は、次のようになります。 PSC=7199、ARR=9999、Tclk=72M

################################################ #########################

PWMリソース

  • アドバンストタイマー(TIM1):7チャンネル
  • 汎用タイマ(TIM2~TIM4):各4チャンネル

PWM出力モード:

  • PWM モード 1: カウントアップ時、CNT < CCRx の場合、出力は有効レベル、それ以外の場合は無効レベル、カウントダウン時、
    CNT > CCRx の場合、出力は無効レベル、それ以外の場合は有効レベルです。

  • PWM モード 2: カウントアップ時、CNT < CCRx になると出力は無効レベルになり、それ以外の場合は有効レベルになります。カウントダウンする場合、出力は CNT > CCRx になると有効レベルになり、それ以外の場合は無効レベルになります

ここに画像の説明を挿入します
PWM デューティ サイクル: TIMx_CCRx レジスタによって決定されます。

PWM構成(Cube Max)

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

//启动tim2
HAL_TIM_Base_Start_IT(&htim2);
//配置占空比
//参数:句柄,通道,值
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);

PWM呼吸光実験

int main()
{
    
    
// 定义变量
uint16_t pwmVal=0; //调整PWM占空比
uint8_t flag=1; //设置改变方向。1:占空比越来越大;0:占空比越来越小

// 使能 Timer4 第3通道 PWM 输出
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
// while循环实现呼吸灯效果
	while (1)
	{
    
    
		HAL_Delay(1);
		if (flag)
		pwmVal++;
		else
		pwmVal--;
		if (pwmVal > 500)
		flag = 0;
		if (pwmVal == 0)
		flag = 1;
		//修改比较值,修改占空比
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
	}
}

仕上げる

ご質問がございましたら、お気軽にご質問いただき、一緒に前進してください。

おすすめ

転載: blog.csdn.net/qq_52749711/article/details/131350886