一、STM32 PWM工作過程:
STM32 PWM工作過程(通道1為例)
CCR1:捕獲比較(值)寄存器(x=1,2,3,4):設置比較值。
CCMR1: OC1M[2:0]位:對于PWM方式下,用于設置PWM模式1【110】或者PWM模式2【111】
CCER:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平有效。
CCER:CC1E位:輸入/捕獲1輸出使能。0:關(guān)閉,1:打開。
二、PWM模式1 & PWM模式2:
寄存器TIMx_CCMR1的OC1M[2:0]位來分析:
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
(1)自動重載的預裝載寄存器:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
簡單的說,ARPE=1,ARR立即生效。。。APRE=0,ARR下個比較周期生效。
(2)STM32 定時器3輸出通道引腳:
Datasheet中表格會有詳細說明
三、PWM輸出庫函數(shù)概述:
(1)PWM輸出庫函數(shù):
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{
uint16_t TIM_OCMode; //PWM模式1或者模式2
uint16_t TIM_OutputState; //輸出使能 OR失能
uint16_t TIM_OutputNState;
uint16_t TIM_Pulse; //比較值,寫CCRx
uint16_t TIM_OCPolarity; //比較輸出極性
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設TIM3 OC2
(2)設置比較值函數(shù):
void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
(3)使能輸出比較預裝載:
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
(4)使能自動重裝載的預裝載寄存器允許位:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
四、PWM輸出配置步驟:
① 使能定時器3和相關(guān)IO口時鐘。
使能定時器3時鐘:RCC_APB1PeriphClockCmd();
使能GPIOB時鐘:RCC_APB2PeriphClockCmd();
② 初始化IO口為復用功能輸出。函數(shù):GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
③ 這里我們是要把PB5用作定時器的PWM輸出引腳,所以要重映射配置,
所以需要開啟AFIO時鐘。同時設置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
④ 初始化定時器:ARR,PSC等:TIM_TimeBaseInit();
⑤ 初始化輸出比較參數(shù):TIM_OC2Init();
⑥ 使能預裝載寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
⑦ 使能定時器:TIM_Cmd();
⑧ 不斷改變比較值CCRx,達到不同的占空比效果:TIM_SetCompare2();
五、STM32 PWM工作過程---輸入捕獲:
附可直接使用的配置:(方便做各種智能車、擂臺等4PWM)
1、底層配置:
void speed_Init(void) //TIM3_CH1->PC6 CH2->PC7 CH3->PC8 CH4->PC9
{
//**********電機驅(qū)動設置************//
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能GPIO外設和AFIO復用功能模塊時鐘
TIM_DeInit(TIM3);//初始化TIM3寄存器
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //Timer3完全重映射 TIM3_CH1->PC6 CH2->PC7 CH3->PC8 CH4->PC9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; //TIM1_CH1 //設置該引腳為復用輸出功能,輸出TIM3 CH1的PWM脈沖波形 GPIOC.6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
//**************************************************************************
// 定時器1設置: 72分頻,頻率10KHz,向上計數(shù),105是為了速度為100時,PWM占空比不會到100,方便電機驅(qū)動自舉生壓。一般PWM頻率大于1K,4-10K比較好。
//**************************************************************************
TIM_TimeBaseStructure.TIM_Period = 105-1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 主定時器T3為 PWM3 模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的預裝載寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的預裝載寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的預裝載寄存器
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能的預裝載寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能定時器3
TIM_Cmd(TIM3, ENABLE);
}
2、函數(shù)調(diào)用:
#include "delay.h"
#include "sys.h"
#include "sumjess_pwm.h"
int main(void)
{
int b = 0;
delay_init();
speed_Configuration();
while(1)
{
for(b=0;b<100;b+=10){
TIM_SetCompare1(TIM3,b); delay_ms(100);}
for(b=100;b>1;b-=10){
TIM_SetCompare1(TIM3,b); delay_ms(100);}
TIM_SetCompare1(TIM3,0); delay_ms(2000);
for(b=0;b<100;b+=10){
TIM_SetCompare2(TIM3,b); delay_ms(100);}
for(b=100;b>1;b-=10){
TIM_SetCompare2(TIM3,b); delay_ms(100);}
TIM_SetCompare2(TIM3,0); delay_ms(2000);
for(b=0;b<100;b+=10){
TIM_SetCompare3(TIM3,b); delay_ms(100);}
for(b=100;b>1;b-=10){
TIM_SetCompare3(TIM3,b); delay_ms(100);}
TIM_SetCompare3(TIM3,0); delay_ms(2000);
for(b=0;b<100;b+=10){
TIM_SetCompare4(TIM3,b); delay_ms(100);}
for(b=100;b>1;b-=10){
TIM_SetCompare4(TIM3,b); delay_ms(100);}
TIM_SetCompare4(TIM3,0); delay_ms(2000);
}
}
☆注:該函數(shù)滿載為105,即:TIM_SetCompare1(TIM3,105);由于驅(qū)動半橋需要自舉升壓,占空比必須小于98%。最好在95%以下。所以寫者留出5%,使用時只需寫:0%~100%之間即可。
六、STM32 輸入捕獲工作過程(通道1為例):
一句話總結(jié)工作過程:通過檢測TIMx_CHx上的邊沿信號,在邊沿信號發(fā)生跳變(比如上升沿/下降沿)的時候,將當前定時器的值(TIMx_CNT)存放到對應的捕獲/比較寄存器(TIMx_CCRx)里面,完成一次捕獲。
(1)步驟1:設置輸入捕獲濾波器(通道1為例)
(2)步驟2:設置輸入捕獲極性(通道1為例)
(3)步驟三:設置輸入捕獲映射通道(通道1為例):
(4)步驟四:設置輸入捕獲分頻器(通道1為例):
(5)步驟五:捕獲到有效信號可以開啟中斷:
(6)最后:看看定時器通道對應引腳TIM5為例:
七、輸入捕獲通道初始化函數(shù):
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
typedef struct
{
uint16_t TIM_Channel; //捕獲通道1-4
uint16_t TIM_ICPolarity; //捕獲極性
uint16_t TIM_ICSelection; //映射關(guān)系
uint16_t TIM_ICPrescaler; //分頻系數(shù)
uint16_t TIM_ICFilter; //濾波器
} TIM_ICInitTypeDef;
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM5_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM5, &TIM5_ICInitStructure);
八、通道極性設置獨立函數(shù):
void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
九、獲取通道捕獲值
uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);
十、輸入捕獲的一般配置步驟:
① 初始化定時器和通道對應IO的時鐘。
② 初始化IO口,模式為輸入:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 輸入
③初始化定時器ARR,PSC
TIM_TimeBaseInit();
④初始化輸入捕獲通道
TIM_ICInit();
⑤如果要開啟捕獲中斷,
TIM_ITConfig();
NVIC_Init();
⑥使能定時器:TIM_Cmd();
⑦編寫中斷服務函數(shù):TIMx_IRQHandler();
上一篇:STM32復習筆記(九)OLED的介紹和使用方法
下一篇:STM32復習筆記(六)看門狗
推薦閱讀
史海拾趣