開網站賣茶要怎么做一站式營銷推廣
定時器概念(常用于輸出PWM波形,驅動電機)
時間=脈沖數時鐘周期; 這里的脈沖數=6553665536,支持定時器級聯(lián),從而延長定時
定時器類型
基本定時器原理圖(UI:更新中斷, U:更新事件,僅支持向上計時模式)
(stm32主模式)可以通過映射U(事件)至到觸發(fā)器(TRGO)來控制DAC的輸出,這樣就不用CPU花費大量的中斷時間輸出DAC
通用定時器原理圖(支持向上/下計時模式,中央對齊計時模式)
中央對齊計時模式(計數器的值和重裝值相等時產生一次中斷,計數器值再減為零再產生一次中斷)
高級定時器
DTG(Dead Time Generate): 死區(qū)生成電路,用于防止直通
BKIN:剎車輸入
定時中斷基本結構
預分頻器時序
計數器時序圖
影子寄存器的作用:讓值的更改與更新事件保持同步,防止在運行途中更改造成錯誤
MyClock.c
#include "stm32f10x.h"
extern uint16_t Num;
//定時器初始化
void Timer_Init(void){// Enables or disables the Low Speed APB (APB1) peripheral clock.(外部時鐘)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//(內部時鐘)TIM_InternalClockConfig(TIM2);//基本定時器配置TIM_TimeBaseInitTypeDef BaseTI;BaseTI.TIM_ClockDivision = TIM_CKD_DIV1;BaseTI.TIM_CounterMode = TIM_CounterMode_Up; //向上計數法BaseTI.TIM_Prescaler = 7200-1; //PSC,計數器(PSC大,ARR小,則定時器頻率低,OV=C_PSC/PSC+1/ARR+1)BaseTI.TIM_Period = 1000-1; //ARR,重定位值 ,(PSC小,ARR大,則定時器頻率高) BaseTI.TIM_RepetitionCounter = 0; //Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restarts from the RCR valueTIM_TimeBaseInit(TIM2,&BaseTI); //由于時鐘在初始化的時候,觸發(fā)了一次更新事件使預分頻器的值有效,所以要清除掉更新事件,避免后續(xù)計時器數值從一開始TIM_ClearFlag(TIM2,TIM_FLAG_Update); //中斷配置,由更新事件觸發(fā)中斷TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中斷控制器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = TIM2_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 2;NI.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NI);//啟動定時器TIM_Cmd(TIM2,ENABLE);
}
//對射式定時器初始化
void MappintTimer_Init(void){// Enables or disables the Low Speed APB (APB1) peripheral clock.(外部時鐘)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //紅外射線引腳GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_IPU;GI.GPIO_Pin = GPIO_Pin_0;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);//(外部時鐘)TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00); //時鐘模式,外部觸發(fā)計數器,外部觸發(fā)極性(這里是不反轉,低電平有效),濾波器(采樣n個點都相同,才輸出濾波器)//基本定時器配置TIM_TimeBaseInitTypeDef BaseTI;BaseTI.TIM_ClockDivision = TIM_CKD_DIV1;BaseTI.TIM_CounterMode = TIM_CounterMode_Up; //向上計數法BaseTI.TIM_Prescaler = 1-1; //PSC,計數器(PSC大,ARR小,則定時器頻率低,OV=C_PSC/PSC+1/ARR+1),這里從0~9BaseTI.TIM_Period = 10-1; //ARR,重定位值 ,(PSC小,ARR大,則定時器頻率高),這里不需要分頻 BaseTI.TIM_RepetitionCounter = 0; //Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restarts from the RCR valueTIM_TimeBaseInit(TIM2,&BaseTI); //由于時鐘在初始化的時候,觸發(fā)了一次更新事件使預分頻器的值有效,所以要清除掉更新事件,避免后續(xù)計時器數值從一開始TIM_ClearFlag(TIM2,TIM_FLAG_Update); //中斷配置,由更新事件觸發(fā)中斷TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中斷控制器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NI;NI.NVIC_IRQChannel = TIM2_IRQn;NI.NVIC_IRQChannelCmd = ENABLE;NI.NVIC_IRQChannelPreemptionPriority = 2;NI.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NI);//啟動定時器TIM_Cmd(TIM2,ENABLE);
}
//時鐘中斷控制,這個函數可以定義在主函數外面,這樣就不用使用extern修飾變量
void TIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){Num++;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}
}
PWM波形
PWM(Pulse Width Modulation)波形,即脈沖寬度調制波形,是一種通過調整一系列等幅脈沖的寬度來對輸出進行編碼和控制的技術。在PWM信號中,每個脈沖的幅度保持恒定,但是脈沖的持續(xù)時間(寬度)變化,從而改變脈沖的占空比,即高電平時間與整個脈沖周期的比例。這種調制方式使得PWM信號能夠等效地模擬出不同強度的模擬信號,常用于控制電機轉速、LED亮度調節(jié)、電源轉換等領域。
PWM波形的關鍵特性包括:
-脈沖序列:PWM波由一系列矩形波(方波)組成。
-固定周期:每個PWM周期的時間長度是固定的。
-可變寬度:每個脈沖的高電平時間(即“開啟時間”)可以改變,低電平時間相應調整以保持周期不變,這樣就改變了占空比。
-占空比:占空比是指一個周期內高電平時間與整個周期時間的比例,通常以百分比表示,用于控制輸出的有效功率或模擬信號的強度。
-等效模擬信號:通過調整占空比,PWM可以近似模擬連續(xù)的模擬信號,如正弦波,用于驅動如電機或LED等設備,實現平滑的控制效果。
在逆變電路和電源管理應用中,常用的PWM調制方法之一是SPWM(Sinusoidal PWM),它通過使脈沖寬度按照正弦波的形狀變化,使得輸出的PWM波形在一定意義上等效于期望的正弦波形,從而控制輸出電壓或電流的大小和頻率。
PWM基本結構
PWM頻率
CK_PSC
在PWM(Pulse Width Modulation,脈沖寬度調制)控制中,CK_PSC通常指的是時鐘預分頻系數(Prescaler value for Clock)。這是微控制器(如STM32系列)中的定時器模塊中的一個配置參數,用于調整定時器的時鐘頻率。
具體來說,CK_PSC是定時器輸入時鐘(CK_INT,來自系統(tǒng)時鐘或者外部時鐘源)在進入定時器計數器之前經過的一個分頻器。通過設置不同的CK_PSC值,可以減慢定時器的計數速度,使得計數器能以較低的頻率進行計數,這對于生成各種不同頻率的PWM信號非常關鍵。預分頻的計算公式通常是 Timer Clock Frequency = (Input Clock Frequency) / (PSC + 1)。
例如,如果你有一個基于STM32的系統(tǒng),其系統(tǒng)時鐘頻率為72MHz,而你需要一個較慢的PWM頻率輸出,你可以通過設置合適的CK_PSC值來實現這一點。增加PSC值會降低到達計數器的時鐘頻率,從而允許更精細地控制PWM信號的頻率和占空比。
在編程時,通常會通過設置定時器的相關寄存器(如STM32中的TIMx_PSC寄存器)來配置CK_PSC的值,以滿足特定應用的需求。
CCR 和 ARR
自動重裝載寄存器(ARR)用于確定波形的頻率(即周期)、捕獲比較寄存器(CCRx)(用于確定占空比的)
PWM的工作過程如下:首先ARR寄存器里面的值確定了一個PWM周期(注意這個周期是在PWM系統(tǒng)初始化的時候寫入ARR寄存器的,寫入以后一般就不再改動了)。然后CCR寄存器里面的值是PWM工作過程中確定的,它可以為一個定值,也可以是一個變化的值。
PWM分辨率
PWM分辨率是指在PWM一個周期內能夠實現的占空比調整的最小單位,它是衡量PWM信號精細程度的一個重要指標。PWM通過調整脈沖信號高電平時間的長短來模擬輸出不同的平均電壓值,而這個調整的細膩程度就是由分辨率決定的。
具體來說,PWM分辨率可以用比特數表示,常見的有8位、10位、12位等。一個8位的PWM控制器可以提供2^8=256個不同的占空比等級,這意味著在一個PWM周期內,高電平時間可以有256種不同的設置。相應地,10位分辨率則可以提供1024個不同的占空比等級,12位則有4096個等級,依此類推。分辨率越高,能夠實現的控制精度就越高,輸出的模擬信號就越接近真實連續(xù)的模擬信號。
PWM分辨率的計算也可以關聯(lián)到具體的時鐘頻率上,比如一個PWM的時鐘頻率確定時,提高分辨率會導致每個脈沖寬度的可調步進減小,從而使得控制更為精確。反之,分辨率較低意味著調整的步長較大,占空比的變化相對粗糙。
呼吸燈電路圖
注意事項
占空比為10%的PWM波形(示波器顯示)
呼吸燈核心代碼
//主函數
#include "stm32f10x.h" // Device header
#include "MyDelay.h" //自定義延時函數
#include "Delay.h" //官方延遲函數
#include "Button.h" //按鍵Led驅動
#include "stdio.h"
#include "PWM.h"
#include "OLED.h"int main(void){//環(huán)境配置OLED_Init();PWM_Init();while(1){for(int i=1;i<=100;i+=2){OLED_ShowNum(1,1,666,3);PWM_SetCompare1(i);Delay_ms(20);}for(int i=100;i>=1;i-=2){OLED_ShowNum(1,1,666,3);PWM_SetCompare1(i);Delay_ms(20);} }return 0;
}//PWM.h
#ifndef PWM_H
#define PWM_H
//初始化PWM
void PWM_Init(void);
//用于動態(tài)改變CCR,調節(jié)LED燈的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare);
#endif//PWM.c
#include "stm32f10x.h" // Device header
//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //時鐘中斷RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //為呼吸燈指定引腳PA0GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP; //定時器(外設)控制引腳,要用復用推挽輸出GI.GPIO_Pin = GPIO_Pin_0;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2); //內部時鐘TIM_TimeBaseInitTypeDef TI; //時鐘中斷配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1; // ARRTI.TIM_Prescaler = 720-1; // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE); //時鐘中斷使能//時鐘中斷的輸出比較模塊定義: PWM波形,頻率1KHZ,占空比50%,分辨率為 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化輸出比較模塊,后續(xù)修改某個屬性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High; //極性,高電平有效電平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0; //CCR捕獲寄存器,可以通過改變CCR的值,調制PWM波形的占空比,從而改變LED燈的亮度 TIM_OC1Init(TIM2,&OCI); //pwm波形初始化
}//用于動態(tài)改變CCR,調節(jié)LED燈的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare){TIM_SetCompare1(TIM2,Compare); //該函數用于設置CRR的值}//重映射端口PA15
#include "stm32f10x.h" // Device header//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //時鐘中斷RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //為呼吸燈指定引腳PA0//法二:為了提高引腳使用率,重映射端口,打開AFIO,重映射引腳,解除調試端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG調試,這里用的是ST-LinkGPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP; //定時器(外設)控制引腳,要用復用推挽輸出GI.GPIO_Pin = GPIO_Pin_15;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2); //內部時鐘TIM_TimeBaseInitTypeDef TI; //時鐘中斷配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1; // ARRTI.TIM_Prescaler = 720-1; // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE); //時鐘中斷使能//時鐘中斷的輸出比較模塊定義: PWM波形,頻率1KHZ,占空比50%,分辨率為 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化輸出比較模塊,后續(xù)修改某個屬性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High; //極性,高電平有效電平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0; //CCR捕獲寄存器,可以通過改變CCR的值,調制PWM波形的占空比,從而改變LED燈的亮度 TIM_OC1Init(TIM2,&OCI); //pwm波形初始化
}//用于動態(tài)改變CCR,調節(jié)LED燈的亮度,PWM使用的PA0端口
void PWM_SetCompare1(uint16_t Compare){TIM_SetCompare1(TIM2,Compare); //該函數用于設置CRR的值}
舵機
按鍵控制舵機旋轉
#include "stm32f10x.h" // Device header
#include "MyDelay.h" //自定義延時函數
#include "Delay.h" //官方延遲函數
#include "Button.h" //按鍵Led驅動
#include "stdio.h"
#include "PWM.h"
#include "OLED.h"
#include "Servos.h"
float Angle;
int KeyNum;
int main(void){//環(huán)境配置OLED_Init();Servos_PWM_Init();Button_Init();//顯示角度OLED_ShowString(1,1,"Angle:");while(1){KeyNum = Key_GetNum();if(KeyNum == 1){Angle += 25;if(Angle>=180) Angle = 180;OLED_ShowNum(1,7,Angle,5);Servos_SetAngle(Angle);} if(Angle>=180){Angle = 0; OLED_ShowNum(1,7,Angle,5);Servos_SetAngle(0);} }return 0;
}#ifndef Servos_h
#define Servos_h
//舵機PWM波形初始化
void Servos_PWM_Init(void);
//動態(tài)改變PWM通道2的波形
void PWM_SetCompare2(uint16_t Compare);
//設置舵機旋轉角度
void Servos_SetAngle(float Angle);
#endif#include "stm32f10x.h"
//舵機PWM波形初始化
void Servos_PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //時鐘中斷RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //為呼吸燈指定引腳PA0GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP; //定時器(外設)控制引腳,要用復用推挽輸出GI.GPIO_Pin = GPIO_Pin_1;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2); //內部時鐘TIM_TimeBaseInitTypeDef TI; //時鐘中斷配置TI.TIM_ClockDivision = TIM_CKD_DIV2;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 20000; // ARRTI.TIM_Prescaler = 72; // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE); //時鐘中斷使能//時鐘中斷的輸出比較模塊定義: PWM波形,舵機要求時鐘20ms,頻率50HZ,占空比動態(tài)變化,分辨率動態(tài)變化,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化輸出比較模塊,后續(xù)修改某個屬性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High; //極性,高電平有效電平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0; //調制PWM波形的占空比,從而控制舵機,舵機CCR取值范圍:500 ~ 2500 TIM_OC1Init(TIM2,&OCI); //pwm通道1初始化 TIM_OC2Init(TIM2,&OCI); //pwm通道2}//動態(tài)改變PWM通道2的CCR
void PWM_SetCompare2(uint16_t Compare){TIM_SetCompare2(TIM2,Compare);
}//設置舵機旋轉角度
void Servos_SetAngle(float Angle){float sum = 500 + (Angle/180*2000); //CCR:500~2500 與 角度:0~180 計算得出PWM_SetCompare2(sum);
}
直流電機
//電機驅動代碼
#include "stm32f10x.h" // Device header
#include "MyDelay.h" //自定義延時函數
#include "Delay.h" //官方延遲函數
#include "Button.h" //按鍵Led驅動
#include "stdio.h"
#include "OLED.h"
#include "Servos.h"
#include "DCmotors.h"int Speed,KeyNum;
int main(void){//環(huán)境配置OLED_Init();DCmotors_Init();Button_Init();Motor_SetSpeed(-50);OLED_ShowString(1,1,"Circle Speed:");while(1){KeyNum = Key_GetNum(); //獲取按鍵鍵碼if (KeyNum == 1) //按鍵1按下{Speed += 20; //速度變量自增20if (Speed > 100) //速度變量超過100后{Speed = -100; //速度變量變?yōu)?100//此操作會讓電機旋轉方向突然改變,可能會因供電不足而導致單片機復位//若出現了此現象,則應避免使用這樣的操作}}Motor_SetSpeed(Speed); //設置直流電機的速度為速度變量OLED_ShowSignedNum(2, 1, Speed, 3); //OLED顯示速度變量}return 0;
}#ifndef DCmotors_h
#define DCmotors_h
//直流電機驅動
void DCmotors_Init(void);
//設置電機旋轉速度以及旋轉方向(電流方向決定旋轉方向)
void Motor_SetSpeed(int8_t Speed);
#endif#include "stm32f10x.h"
#include "OLED.h"
#include "PWM.h"
//直流電機驅動
void DCmotors_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_Out_PP; //要用推挽輸出(不由片上外設控制,無需復用推挽輸出)GI.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);PWM_Init(); //PWM波形初始化
}
//設置電機旋轉速度以及旋轉方向(電流方向決定旋轉方向)
void Motor_SetSpeed(int8_t Speed){if (Speed >= 0) //如果設置正轉的速度值{GPIO_SetBits(GPIOA, GPIO_Pin_4); //PA4置高電平GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PA5置低電平,設置方向為正轉PWM_SetCompare3(Speed); //PWM設置為速度值}else //否則,即設置反轉的速度值{GPIO_ResetBits(GPIOA, GPIO_Pin_4); //PA4置低電平GPIO_SetBits(GPIOA, GPIO_Pin_5); //PA5置高電平,設置方向為反轉PWM_SetCompare3(-Speed); //PWM設置為負的速度值,因為此時速度值為負數,而PWM只能給正數}
}//封裝好的PWM模塊
#ifndef PWM_H
#define PWM_H
//初始化PWM
void PWM_Init(void);
//用于動態(tài)改變CCR,調節(jié)LED燈的亮度,PWM使用的PA0端口
void PWM_SetCompare3(uint16_t Compare);
#endif#include "stm32f10x.h" // Device header
//初始化PWM
void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //時鐘中斷RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //為呼吸燈指定引腳PA0//法二:為了提高引腳使用率,重映射端口,打開AFIO,重映射引腳,解除調試端口
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG調試,這里用的是ST-LinkGPIO_InitTypeDef GI;GI.GPIO_Mode = GPIO_Mode_AF_PP; //(外設)控制引腳,PA2要用復用推挽輸出GI.GPIO_Pin = GPIO_Pin_2;GI.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GI);TIM_InternalClockConfig(TIM2); //內部時鐘TIM_TimeBaseInitTypeDef TI; //時鐘中斷配置TI.TIM_ClockDivision = TIM_CKD_DIV2 ;TI.TIM_CounterMode = TIM_CounterMode_Up;TI.TIM_Period = 100-1; // ARRTI.TIM_Prescaler = 36-1; // PSC ,CK_PSC=72MHZTI.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TI);TIM_Cmd(TIM2,ENABLE); //時鐘中斷使能//時鐘中斷的輸出比較模塊定義: PWM波形,頻率1KHZ,占空比50%,分辨率為 1%,TIM_OCInitTypeDef OCI;TIM_OCStructInit(&OCI); //先初始化輸出比較模塊,后續(xù)修改某個屬性OCI.TIM_OCMode = TIM_OCMode_PWM1;OCI.TIM_OCPolarity = TIM_OCPolarity_High; //極性,高電平有效電平OCI.TIM_OutputState = ENABLE;OCI.TIM_Pulse = 0; //CCR捕獲寄存器,可以通過改變CCR的值,調制PWM波形的占空比,從而改變LED燈的亮度 TIM_OC3Init(TIM2,&OCI); //pwm波形初始化 }//用于動態(tài)改變CCR,調節(jié)LED燈的亮度,PWM使用的PA0端口
void PWM_SetCompare3(uint16_t Compare){TIM_SetCompare3(TIM2,Compare); //該函數用于設置CRR的值}