STM32CubeMX タイマー PWM 出力
知識百科事典 – PWM の概要
PWM は、アナログ信号のレベルをデジタル的にエンコードする方法です。高分解能カウンタの使用により、方形波のデューティ サイクルが変調され、特定のアナログ信号のレベルがエンコードされます。いかなる瞬間においても、フルスケール DC 電源は完全にオン (ON) であるか、まったくオンではない (OFF) かのいずれかであるため、PWM 信号は依然としてデジタルのままです。電圧源または電流源は、ON または OFF の繰り返しパルス シーケンスでアナログ負荷に印加されます。ON の場合は DC 電源が負荷に追加されたとき、OFF の場合は電源が切断されたときです。帯域幅が十分である限り、PWM を使用して任意のアナログ値をエンコードできます。
パルス幅変調 (PWM、パルス幅変調) は、マイクロプロセッサのデジタル出力を使用してアナログ回路を制御する非常に有効な技術であり、測定、通信から電力制御、変換に至るまで、多くの分野で広く使用されています。
PWM の利点の 1 つは、プロセッサから制御対象システムへの信号がデジタル形式であり、デジタルからアナログへの変換が実行されることです。ノイズの影響を最小限に抑えることができます(パソコンと同様)。ノイズがデジタル信号に影響を与えるのは、論理 1 を論理 0 に、または論理 0 を論理 1 に変えるほど強い場合のみです。
STM32タイマーPWM出力の概要
タイマ パルス幅変調モードは、TIMx_ARR レジスタによって決定される周波数と TIMx_CCRx レジスタによって決定されるデューティ サイクルを持つ信号を生成できます。TIMx_CCMRx レジスタの OCxM ビットに「110」 (PWM モード 1) または「111」 (PWM モード 2) を書き込むと、PWM を生成するように各 OCx 出力チャネルを独立して設定できます。TIMx_CCMRx レジスタの OCxPE ビットを設定して、対応するプリロード レジスタを有効にする必要があります。最後に、TIMx_CR1 レジスタの ARPE ビットを設定して (アップカウントまたは中心対称モードで) 自動リロード プリロード レジスタを有効にする必要があります。
プリロード レジスタは、更新イベントが発生した場合にのみシャドウ レジスタに転送されるため、カウンタがカウントを開始する前に、TIMx_EGR レジスタの UG ビットをセットしてすべてのレジスタを初期化する必要があります。OCx の極性は、TIMx_CCER レジスタの CCxP ビットを使用してソフトウェアで設定でき、アクティブ High またはアクティブ Low に設定できます。TIMx_CCER レジスタの CCxE ビットは、OCx 出力イネーブルを制御します。
- PWMモードの概要
カウンタのアップカウント モード (つまり、TIMx_CR1 の DIR ビットが 0) では、TIMx_CNT<TIMx_CCRx の場合、PWM 信号リファレンス OCxREF は High になり、それ以外の場合は Low になります。TIMx_CCRx の比較値が自動リロード値 (TIMx_ARR) より大きい場合、OCxREF は「1」のままです。比較値が 0 の場合、OCxREF は「0」のままです。以下の図は、TIMx_ARR=8 (ARR リロード レジスタ、タイマのカウント周期を示す) の場合のエッジ揃え PWM 波形の例です。
この例では、IO 出力モード - PWM 波形出力を実装します。LED駆動を例に挙げると、高度なタイマー機能(PWMモード)を使用して、呼吸する光の効果を実現します。
1. ハードウェアインターフェース
このハードウェア プラットフォームには 3 つの LED ライトがあります: LED2、LED3、LED4 LED2 は PA1 に接続され、LED2 は PB8 に接続され、LED4 は PB9 に接続されます。CH2 は外部ピン PB8 および PB9 に対応します
。
2 ソフトウェア設計
STM32CubeMX ツールを開き、タイマー 4 を設定し、PB8 をタイマー 4 のチャネル 3 (多重化プッシュプル出力) として設定し、PB9 をタイマー 4 のチャネル 4 (多重化プッシュプル出力) として設定します。
タイマ 4 の基本構成と PWM モードの構成
タイマ チャネル モードを PWM モードに設定し、分周率を 72、リロード値を 500、アクティブ レベルを Low レベルに設定します。
3. パラメータの説明
モデル | 説明する |
---|---|
インプットキャプチャダイレクトモード | インプットキャプチャダイレクトモード |
インプットキャプチャ間接モード | インプットキャプチャ間接モード |
TRC によるインプットキャプチャ | インプットキャプチャトリガモード |
アウトプットコンペア出力なし | 出力コンペア (フリーズ モード 000) |
アウトプットコンペア CH3 | 出力コンペア (001) |
PWM生成 出力なし | PWM は出力を生成しません |
PWM生成 CH3 | CH3へのPWM出力 |
CH3 結合チャンネル | ジョイントチャンネル |
xor アクティベーション | タイマ入力 XOR モード |
4. コード生成
TIM4の基本機能構成
/* TIM4 init function */
void MX_TIM4_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {
0};
TIM_MasterConfigTypeDef sMasterConfig = {
0};
TIM_OC_InitTypeDef sConfigOC = {
0};
htim4.Instance = TIM4;//定时器4
htim4.Init.Prescaler = 72-1;//分频系数72分频
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;//向上计数方式
htim4.Init.Period = 300;//重装装载值
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//无时钟分频
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//自动重装载预装载使能
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)//初始化定时器
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;//PWM模式1,CNT<CCR为有效电平
sConfigOC.Pulse = 0;//占空比
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;//有效电平时间
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;//快速比较使能
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)//PWM模式初始化
{
Error_Handler();
}
if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim4);//硬件层初始户化
}
PWM モード設定:
PB8、PB9 ピン設定および PWM モード イネーブル
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//初始化通道3
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//初始化通道4
ピンモード設定と PWM 初期化
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {
0};
if(timHandle->Instance==TIM4)
{
/* USER CODE BEGIN TIM4_MspPostInit 0 */
/* USER CODE END TIM4_MspPostInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM4 GPIO Configuration
PB8 ------> TIM4_CH3
PB9 ------> TIM4_CH4
*/
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN TIM4_MspPostInit 1 */
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_3);//启动通道3
HAL_TIM_PWM_Start(timHandle,TIM_CHANNEL_4);//启动通道4
/* USER CODE END TIM4_MspPostInit 1 */
}
}
4. ブリージングライトの主な機能の例
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/*实现呼吸灯*/
if(flag==0)i++;
else i--;
if(i>=300)flag=1;
if(i==0)flag=0;
HAL_Delay(3);
htim4.Instance->CCR3=i;//调节占空比
htim4.Instance->CCR4=i;
}
5. HALライブラリタイマーの共通機能の紹介
HAL ライブラリのタイマの基本関数のソースコードは stm32f1xx_hal_tim.c に、拡張関数の関数は stm32f1xx_hal_tim_ex.c にあり、ここではよく使われるいくつかの関数を中心に紹介します。(以下にリストされている関数は、ユーザーによる呼び出しまたは変更が必要な場合があります)。
/*硬件层初始化:时钟、中断,DMA*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim);
/*中断方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
/*DMA方式开启定时器*/
HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length);
/*开启定时器PWM模式*/
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
/*获取状态*/
HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim);
/*中断方式开启定时器输入捕获功能*/
HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
6. ソフトウェアシミュレーションエフェクト表示
KEIL ソフトウェア シミュレーションを通じて、ピン レベルの変化、KEIL ソフトウェア関連の設定を確認します。
CPU DLL: SARMCM3.DLL
ダイアログ DLL: DARMSTM.DLL パラメータ: -pSTM32F103C8
シミュレーション モードに入る:
ピン レベルの変化波形を確認する:
波形効果: