Blue Bridge Cup Embedded-タイマー(2)(キー)-PWMと出力の比較

ブルーブリッジカップタイマーには、主にTIM1(高度なタイマー、後で紹介します)、TIM2、およびTIM3が含まれます。ここでは、一般的なタイマーのPWM構成を記述するための例としてタイマー2を取り上げます。

ポイント1

PWM周波数はARRによって決定され、デューティサイクルはCCRXレジスタによって決定されます。

IOポートの多重化クロックを有効にすることを忘れないでください。

PWMモード1およびPWMモード2の概念。
ここに画像の説明を挿入

構成手順

1.データシートでTIM2チャネルに対応するIOポートを見つけます。
ここに画像の説明を挿入

2.初期化関数を記述します(注記は非常に詳細です)

 void Tim2_PWM_Config(u16 arr,u16 psc)//都是16位的寄存器
{
    
    
 GPIO_InitTypeDef GPIO_InitStructure;
 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能复用时钟
 
 TIM_TimeBaseInitStructure.TIM_Period=arr;//自动重装载值设置值的时候要注意减一位
 TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//预分频系数
 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//定时器初始化
 
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Init(GPIOA,&GPIO_InitStructure);
 
 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出状态使能
 TIM_OCInitStructure.TIM_Pulse=500;//设置占空比
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效还是低电平有效。
 TIM_OC2Init(TIM2,&TIM_OCInitStructure);
 
 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出状态使能
 TIM_OCInitStructure.TIM_Pulse=700;//设置占空比
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//高电平有效还是低电平有效。
 TIM_OC3Init(TIM2,&TIM_OCInitStructure);
 
 
 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能预装载寄存器
 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能预装载寄存器
 
 TIM_Cmd(TIM2,ENABLE);//定时器使能。
}

注:「TIM_OCInitStructure.TIM_Pulse」の相対値を変更して、異なるデューティサイクルの波形を出力するだけです。

3.さらに、習得して巧みに使用する必要のあるライブラリ関数:

void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//设置计数器的数值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);//设置定时器通道1的比较值,也就是CCR1寄存器的值
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);              //得到定时器通道1的比较值
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);		//得到当前定时器的预分频系数

ポイント2

Lanqiaoカップのテストの質問では、タイマーのさまざまなチャネルを使用して、さまざまな周波数のPWM波を生成できます。上記はできません。'TIM_TimeBaseInitStructure.TIM_Prescaler = psc;'であるため、この関数は頻度が確実であると判断しました。2つのチャネルが異なる周波数とデューティサイクルのPWM波を生成することを実現するには、出力比較モードが必要です。出力比較モードの知識については、この大物を見てください
以下は、私が作成したコードと、ロジックアナライザーで見た効果です。ここに特定のコードを入れました

2つのチャネルの周波数とデューティサイクルが異なることがわかります。ここに画像の説明を挿入

予防

大物の記事によると、私はいくつかのメモと基本的な概念を書きました
。1。タイマー初期化のプリロードレジスタが有効になっていません。これは、ポイント1のPWM初期化とは異なります。

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);//预装载寄存器不使能

2.タイマーの出力モードをTIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;変更します
ここに画像の説明を挿入
ここに画像の説明を挿入
このモードの意味を詳しく説明します。これらの2つの図から、このモードの機能は次のようになります。CCRの値がレジスタとCNTカウンタの値が等しいレベルが反転します。

3.別の概念は** TIM_ITConfig(TIM2、TIM_IT_CC2 | TIM_IT_CC3、ENABLE); **タイマー割り込みの意味:CCRレジスタの値とカウンタの値が等しい場合、割り込みが入力されます。

総括する

PWMを生成するこれらの2つのモードは非常に重要であり、両方を習得するのが最善です。

おすすめ

転載: blog.csdn.net/qq_43690936/article/details/105162640