外貿(mào)模版網(wǎng)站奉化seo頁面優(yōu)化外包
接線圖:
這里將正極接到PA0引腳上,負(fù)極接到GND,這樣就高電平點亮LED,低電平熄滅。
占空比越大,LED越亮,占空比越小,LED越暗
PWM初始化配置
輸出比較函數(shù)介紹:
用這四個函數(shù)配置輸出比較模式,四個函數(shù)對應(yīng)四個輸出比較單元,這個函數(shù)使用結(jié)構(gòu)體初始化輸出比較單元的,這四個函數(shù)很重要需要掌握
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
這個是用來輸出比較結(jié)構(gòu)體賦一個默認(rèn)值的
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
功能運行時更改參數(shù)的函數(shù)
用來配置強(qiáng)制輸出模式的,如果想要在運行中暫停輸出波形并且強(qiáng)制輸出高或低電平 ,可以用下面函數(shù),不過用的不多,因為強(qiáng)制輸出高電平與占空比設(shè)置100%是一樣的,輸出低電平與占空比設(shè)置0%是一樣的。
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
這四個函數(shù)是用來配置CCR寄存器的預(yù)裝功能的,預(yù)裝功能就是影子寄存器,就是寫入的值不會立即生效,而是在更新事件才會生效(一般不用這些函數(shù))
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
這四個函數(shù)是用來配置快速使能的(用的也不多)
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
在手冊里,外部事件時清除REF信號有介紹。
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
?這些是單獨設(shè)置輸出比較的極性的,這里帶N的就是高級定時器里互補(bǔ)通道的配置,OC4沒有互補(bǔ)通道所以就沒有OC4N的函數(shù)
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
下面兩個是用來單獨修改輸出使能參數(shù)的
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);
選擇輸出比較模式,這個是用來單獨更改輸出比較模式的函數(shù)
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);
下面四個是用來單獨更改CCR寄存器值的函數(shù),這四個函數(shù)比較重要,我們在運行的時候,更改占空比就需要用到這四個函數(shù)
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
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);
這個函數(shù)僅高級定時器使用,在使用高級定時器輸出PWM時,需要調(diào)用這個函數(shù),使能主輸出,否則PWM將不能正常輸出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
根據(jù)結(jié)構(gòu)圖配置:
1.定義結(jié)構(gòu)體變量
定義GPIO與TIM所需的結(jié)構(gòu)體變量
//-----------------------------定義結(jié)構(gòu)體變量------------------------------TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定義TIMBase結(jié)構(gòu)體變量TIM_OCInitTypeDef TIM_OCInitStructure; //定義TIMOC結(jié)構(gòu)體變量GPIO_InitTypeDef GPIO_InitStructure; //定義GPIO結(jié)構(gòu)體變量
//-----------------------------定義結(jié)構(gòu)體變量------------------------------
2.RCC開啟時鐘
把我們要用到的TIM外設(shè)和GPIO外設(shè)的時鐘打開
3.配置時基單元
包括前面的時鐘源選擇、PSC預(yù)分頻器、CNT計數(shù)器、ARR自動重裝器
//-----------------------------配置時基單元---------------------------------TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //時鐘分頻TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數(shù)器模式 這里選擇向上計數(shù)TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //周期 就是ARR自動重裝器的值TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1; //是PSC預(yù)分頻器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重復(fù)計數(shù)器的值(這個是高級寄存器才有的,這里不需要用直接給0)TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //TIM初始化//-----------------------------配置時基單元---------------------------------
4.配置輸出比較單元
里面CCR的值、輸出比較模式、極性選擇、輸出使能這些參數(shù)(用結(jié)構(gòu)體統(tǒng)一配置)
//-----------------------------配置輸出比較單元-----------------------------TIM_OCStructInit(&TIM_OCInitStructure); //給結(jié)構(gòu)體賦一個初始值,因為我們還有其他的變量沒有賦值TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //設(shè)置輸出比較模式,這里選擇PWM模式1TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出比較的極性,這里選擇高極性,有效電平是高電平時輸出高電平 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //設(shè)置輸出使能TIM_OCInitStructure.TIM_Pulse = 50; //設(shè)置CCR值TIM_OC1Init(TIM2, &TIM_OCInitStructure);//-----------------------------配置輸出比較單元-----------------------------
5.配置GPIO
把PWM對應(yīng)的GPIO口,初始化為復(fù)用推挽輸出的配置
//-----------------------------配置GPIO初始化------------------------------GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置引腳GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIO初始化//-----------------------------配置GPIO初始化------------------------------
6.運行控制
啟動計數(shù)器,輸出PWM
TIM_Cmd(TIM2,ENABLE);//啟動定時器
配置一個頻率為 1KHz,占空比為50%的PWM波形
這里的ARR、PSC與CCR決定占空比
公式:
CK_PSC為72MHz,因為系統(tǒng)時鐘頻率為72MHz.
功能實現(xiàn):
實現(xiàn)呼吸燈效果需要不斷改變占空比的值,需要調(diào)用
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
函數(shù),在運行時不斷改變占空比的值。
功能函數(shù):
void PWM_SetComPer(uint16_t Compare)
{ TIM_SetCompare1(TIM2,Compare);}
主函數(shù):
#include "PWM.h"
int main(void)
{LED_Init();OLED_Init();PWM_Init();uint16_t i = 0;while(1){for(i = 0; i <= 100; i++){PWM_SetComPer(i);Delay_ms(10);}for(i = 0; i <= 100; i++){PWM_SetComPer(100-i);Delay_ms(10);}} }