ブルーブリッジカップタイマーには、主に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つのモードは非常に重要であり、両方を習得するのが最善です。