STM32單片機基礎12——使用通用定時器產生PWM驅動蜂鳴器

本篇詳細的記錄瞭如何使用STM32CubeMX配置STM32L431RCT6的通用定時器外設,產生PWM驅動無源蜂鳴器。

1. 準備工作

硬件準備

mark

  • 蜂鳴器

這裏我直接使用擴展板上的蜂鳴器,如圖:

mark

蜂鳴器的原理圖如下:

mark

軟件準備

  • 需要安裝好Keil - MDK及芯片對應的包,以便編譯和下載生成的代碼;

Keil MDK和串口助手的安裝包都可以關注“小熊派開源社區”微信公衆號,在資料教程一欄中可獲取安裝包。

2.生成MDK工程

選擇芯片型號

打開STM32CubeMX,打開MCU選擇器:
mark

搜索並選中芯片STM32L431RCT6:
mark

配置時鐘源

  • 如果選擇使用外部高速時鐘(HSE),則需要在System Core中配置RCC;
  • 如果使用默認內部時鐘(HSI),這一步可以略過;

這裏我都使用外部時鐘:
mark

配置通用定時器TIM16

知識小卡片——STM32L431的定時器

STM32L431xx 系列有 1 個高級定時器(TIM1), 3 個通用定時器(TIM2、TIM15、TIM16),兩個基本定時器(TIM6、TIM7),還有兩個低功耗定時器(LPTIM1、LPTIM2)。

STM32L431 的通用 TIMx (TIM2、TIM15、TIM16)定時器功能包括:

  • 16 位(TIM15,TIM16)/32 位(TIM2)向上、向下、向上/向下自動裝載計數器,注意:
    TIM15、TIM16 只支持向上(遞增)計數方式;

  • 16 位可編程(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數爲 1~65535 之間的任
    意數值。

  • 4 個獨立通道(TIMx_CH1~4, 其中 TIM15 最多 2 個通道, TIM16 最多 1 個
    通道),這些通道可以用來作爲:

    • 輸入捕獲
    • 輸出比較
    • PWM 生成(邊緣或中間對齊模式)
    • 單脈衝模式輸出
  • 可使用外部信號控制定時器和定時器互連的同步電路。

  • 如下事件發生時產生中斷/DMA:

    • 更新:計數器向上溢出/向下溢出,計數器初始化(通過軟件或者內部/外部觸發)
    • 觸發事件(計數器啓動、停止、初始化或者由內部/外部觸發計數)
    • 輸入捕獲
    • 輸出比較

知識小卡片結束啦~

接下來開始配置TIM16定時器的PWM功能:

首先選擇TIM,選擇通道1的功能,默認的CH1是PA6引腳,但是開發板上是與 PB8 連接的,所以在右邊將PB8配置爲TIM16_CH1
mark

接下來是對TIM16的參數設置,參照數據手冊中的RCC時鐘樹,TIM16內部時鐘來源是PCLK2 = 80Mhz,我們的目的是產生1khz的PWM,所以預分頻係數設置爲80-1,自動重載值爲1000-1,得到的計時器更新中斷頻率即爲80000000/80/1000 = 1000 Hz = 1K Hz
mark

其餘的一些設置保持默認即可,最後配置PWM佔空比:
mark

配置時鐘樹

STM32L4的最高主頻到80M,所以配置PLL,最後使HCLK = 80Mhz即可:
mark

生成工程設置

mark

代碼生成設置

最後設置生成獨立的初始化文件:
mark

生成代碼

點擊GENERATE CODE即可生成MDK-V5工程:
mark

3. 在MDK中編寫、編譯、下載用戶代碼

啓動定時器併產生PWM

最後在main函數中開啓TIM2並使能其中斷(TIM2初始化代碼之後):

while (1)
{
  HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1);
  HAL_Delay(1000);
  HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1);
  HAL_Delay(1000);
}

測試結果

編譯下載後即可聽到無源蜂鳴器開始工作。

至此,我們已經學會如何使用通用定時器產生PWM驅動蜂鳴器,下一節將講述如何使用硬件IIC接口讀寫EEPROM。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章