目錄
- 一、定時器控制LED周期性亮滅
- (一)定時器
- 1.STM32F103定時器分類及區別
- 2.通用定時器主要功能
- 3.通用定時器工作過程
- (二)STM32CubeMX創建工程
- (三)代碼實現
- (四)實驗結果
- 二、PWM模式控制LED呼吸燈
- (一)PWM工作原理
- 1.PWM一個周期
- 2.PWM輸出模式區別
- 3.PWM的計數模式
- (二)STM32CubeMX創建工程
- (三)代碼實現
- (四)實驗結果
- 參考鏈接
一、定時器控制LED周期性亮滅
(一)定時器
1.STM32F103定時器分類及區別
STM32F103
一共有8個定時器TIM1~TIM8
。STM32的定時器分為基本定時器、通用定時器和高等定時器。
①TIM6
、TIM7
(基本定時器):基本定時器是只能向上計數的16位定時器,基本定時器只能有定時的功能,沒有外部IO口,所以沒有捕獲和比較通道。
②TIM2
、TIM3
、TIM4
、TIM5
(通用定時器):通用定時器是可以向上計數,也可以向下計數的16位定時器。通用定時器可以定時、輸出比較、輸入捕捉,每個通用定時器具有4個外部IO口。
③TIM1
、TIM8
(高級定時器):高級定時器是是可以向上計數,也可以向下計數的16位定時器。高等定時器可以定時、輸出比較、輸入捕捉、還可以輸出三相電機互補信號,每個高等定時器有8個外部IO口。
此次主要使用通用定時器,故后續了解以通用定時器為主
2.通用定時器主要功能
通用TIMx (TIM2、TIM3、TIM4和TIM5)
定時器功能包括:
● 16位向上、向下、向上/向下自動裝載計數器
● 16位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻系數為1~65536之間的任意數值
● 4個獨立通道:
─ 輸入捕獲
─ 輸出比較
─ PWM生成(邊緣或中間對齊模式)
─ 單脈沖模式輸出
● 使用外部信號控制定時器和定時器互連的同步電路
● 如下事件發生時產生中斷/DMA:
─ 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
─ 觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
─ 輸入捕獲
─ 輸出比較
● 支持針對定位的增量(正交)編碼器和霍爾傳感器電路
通用定時器計數模式:①向上計數 ②向下計數 ③中心對齊
3.通用定時器工作過程
從時鐘源產生框可以看到
定時器時鐘有四種來源:
● 內部時鐘(CK_INT
)
● 外部時鐘模式1:外部輸入腳(TIx
) (輸入捕獲的引腳)
● 外部時鐘模式2:外部觸發輸入(ETR
)
● 內部觸發輸入(ITRx
):(定時器級聯)使用一個定時器作為另一個定時器的預分頻器,如可以配置一個定時器Timer1
而作為另一個定時器Timer2
的預分頻器。
產生CK_PSC
時鐘,然后在從模式控制器內設置好計數模式(向上向下),再經過預分頻器產生CK_CNT
,若為CNT
計數器向下計數,則當其計數到0時,自動重裝載寄存器會重新為CNT
計數器裝載新值重新遞減計數,并產生一個更新事件。
時基單元:
● 計數器寄存器(TIMx_CNT
)
● 預分頻器寄存器 (TIMx_PSC
)
● 自動裝載寄存器 (TIMx_ARR
)
輸入捕獲:信號通過捕獲通道進入,經濾波,經分頻,到捕獲比較寄存器。(經輸入捕獲與輸出比較的四個通道其實是一個)
(二)STM32CubeMX創建工程
這里我們 arr=4999 psc=6399 Tclk=16Mhz Tout = (5000*6400)/16 us = 2s
(三)代碼實現
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static unsigned char ledState = 0;if (htim == (&htim2)){if (ledState == 0)HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);ledState = !ledState;}
}
(四)實驗結果
二、PWM模式控制LED呼吸燈
(一)PWM工作原理
脈沖寬度調制(Pulse width modulation,PWM)是一種對模擬信號電平進行數字編碼的方法。
STM32的每個通用定時器都有獨立的4個通道可以用來作為:輸入捕獲、輸出比較、PWM輸出、單脈沖模式輸出等。
STM32的定時器除了TIM6和TIM7(基本定時器)之外,其他的定時器都可以產生PWM輸出。其中,高級定時器TIM1、TIM8可以同時產生7路PWM輸出。
1.PWM一個周期
- 定時器從0開始向上計數
- 當0-t1段,定時器計數器TIMx_CNT值小于CCRx值,輸出低電平
- t1-t2段,定時器計數器TIMx_CNT值大于CCRx值,輸出高電平
- 當TIMx_CNT值達到ARR時,定時器溢出,重新向上計數…循環此過程
- 至此一個PWM周期完成
每個定時器有四個通道,每一個通道都有一個捕獲比較寄存器。
將寄存器值和計數器值比較,通過比較結果輸出高低電平,便 可以實現脈沖寬度調制模式(PWM信號)。
向上計數:
假定定時器工作在向上計數 PWM模式:
當 CNT<CCRx 時,輸出 0
當 CNT>=CCRx 時輸出 1
當 CNT 達到 ARR 值的時候,重新歸零,然后重新向上計數,依次循環。
改變 CCRx 的值,就可以改變 PWM 輸出的占空比,改變 ARR 的值,就可以改變 PWM 輸出的頻率。
2.PWM輸出模式區別
PWM模式1:在向上計數時,一旦TIMx_CNT<TIMx_CCR1
時通道1為有效電平,否則為無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1
時通道1為無效電平(OC1REF=0
),否則為有效電平(OC1REF=1
)
PWM模式2:在向上計數時,一旦TIMx_CNT<TIMx_CCR1
時通道1為無效電平,否則為有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1
時通道1為有效電平,否則為無效電平
注意:PWM的模式只是區別什么時候是有效電平,但并沒有確定是高電平有效還是低電平有效。這需要結合CCER寄存器的CCxP位的值來確定
3.PWM的計數模式
向上計數模式:
下面是一個PWM模式1的例子。當TIMx_CNT<TIMx_CCRx
時PWM信號參考OCxREF
為高,否則為低。如果TIMx_CCRx
中的比較值大于自動重裝載值(TIMx_ARR
),則OCxREF
保持為’1’。如果比較值為0,則OCxREF
保持為’0’:
向下計數模式:
在PWM模式1,當TIMx_CNT>TIMx_CCRx
時參考信號OCxREF為低,否則為高。如果TIMx_CCRx
中的比較值大于TIMx_ARR
中的自動重裝載值,則OCxREF
保持為’1’。該模式下不能產生0%的PWM波形
中央對齊模式:
當TIMx_CR1
寄存器中的CMS
位不為’00’時,為中央對齊模式(所有其他的配置對OCxREF/OCx
信號都有相同的作用)。根據不同的CMS
位設置,比較標志可以在計數器向上計數時被置’1’、在計數器向下計數時被置’1’、或在計數器向上和向下計數時被置’1’。TIMx_CR1
寄存器中的計數方向位(DIR)由硬件更新,不要用軟件修改它。
(二)STM32CubeMX創建工程
(三)代碼實現
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */while (pwmVal< 500){pwmVal++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改占空比// TIM3->CCR1 = pwmVal; 與上方相同HAL_Delay(1);}while (pwmVal){pwmVal--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比較值,修改占空比// TIM3->CCR1 = pwmVal; 與上方相同HAL_Delay(1);}HAL_Delay(200);
}
/* USER CODE END 3 */
(四)實驗結果
參考鏈接
定時器&PWM應用編程
STM32CubeMX & Keil——STM32F103C8T6:PWM控制LED燈