衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32入門學習筆記之PWM輸出實驗

jf_78858299 ? 來源:滑小稽筆記 ? 作者:電子技術園地 ? 2023-02-16 10:25 ? 次閱讀

9.1 PWM簡介

脈沖寬度調制(Pulse Width Modulation)技術,簡稱PWM調制技術,是一種通過改變脈沖的寬度以及頻率來改變輸出頻率的一種控制方式。采樣控制理論中有一個重要結論:沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同。PWM控制技術就是以該結論為理論基礎,對半導體開關器件的導通和關斷進行控制,使輸出端得到一系列幅值相等而寬度不相等的脈沖,用這些脈沖來代替正弦波或其他所需要的波形。按一定的規則對各脈沖的寬度進行調制,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。

STM32定時器除了有計數,定時,輸入捕獲功能以外,還有PWM輸出功能,主要工作原理就是通過在定時器內部設置閾值,當CNT計數器的數小于這個閾值的時候輸出1個電平,當CNT的數據大于這個閾值的時候輸出另一個電平。通過改變這個閾值來改變占空比(因為CNT最大計數值就是65535),通過改變計數頻率來改變PWM脈沖頻率。

9.2 相關寄存器

9.2.1 捕獲/比較寄存器:TIMx_CCMRx

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OC2CE OC2M[2:0] OC2PE OC2FE CC2S[1:0] OC1CE OC1M[2:0] OC1PE OC1FE CC1S[1:0]

OCxCE:輸出比較x清0使能

0:OCxREF不受ETRF輸入的影響

   1:一旦檢測到ETRF輸入高電平,清除OCxREF=0

OCxPE:輸出比較x預裝載使能

0:禁止預裝載功能,寫入的數值立即起作用

   1:開啟預裝載功能,TIMx_CCRx的預裝載值在更新事件到來時被加載至當前寄存器中

注1 :一旦LOCK級別設為3并且CC1S=00則該位不能被修改

注2 :僅在單脈沖模式下,可以在未確認預裝載寄存器情況下使用PWM模式,否則其動作不確定

OCxFE:輸出比較x快速使能(該位用于加快CC輸出對觸發輸入事件的響應)

0:根據計數器與CCRx的值,當觸發器的輸入有一個有效沿時,激活CCx輸出的最小延時為5時鐘周期

   1:OC被設置為比較電平而與比較結果無關,觸發器有效沿和CCx輸出間的延時被縮短為3個時鐘周期

注3 :只在通道被配置成PWM1或PWM2模式時起作用

OCxM[2:0]:輸出比較x模式

圖片

CCxS[1:0]:捕獲/比較x選擇(用于定義通道x輸入還是輸出)

00:輸出模式

01:輸入模式,映射在TI1上

10:輸入模式,映射在TI2上

11:輸入模式,映射在TRC上,此模式引用于內部觸發器輸入被選中時

9.2.2 剎車和死區寄存器:TIMx_BDTR

注:這個寄存器只有TIM1和TIM8這兩個高級定時器才需要控制。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MOE AOE BKP BKE OSSR OSSI LOCK[1:0] DTG[7:0]

Bit 15:主輸出使能(一旦剎車輸入有效,該位被硬件異步清0)

0:禁止OC和OCN輸出或強制為空閑狀態

   1:如果設置了相應的使能位,則開啟OC和OCN輸出。

Bit 14:自動輸出使能

0:MOE只能被軟件置1

   1:MOE能被軟件置1或在下一個更新事件被自動置1

** 注1** :一旦LOCK級別設為1,則該位不能被修改

Bit 13:剎車輸入極性

0:剎車輸入低電平有效

   1:剎車輸入高電平有效

** 注2** :一旦LOCK級別設為1,則該位不能被修改

** 注3** :任何對該位的寫操作都需要一個APB時鐘的延遲以后才能起作用

Bit 12:剎車功能使能

0:禁止剎車輸入

   1:開啟剎車輸入

    **注4** :當設置了LOCK級別1時,該位不能被修改

    **注5** :任何對該位的寫操作都需要一個APB時鐘的延遲以后才能起作用

Bit 11:運行模式下“關閉狀態”選擇(該位用于當MOE=1且通道為互補輸出)

0:當定時器不工作時,禁止OC/OCN輸出(OC/OCN使能輸出信號=0)

1:當定時器不工作時,一旦CCxE或CCxNE為1,先開啟OC/OCN并輸出無效電平,再置使能輸出信號為1

注6 :一旦LOCK級別設為2,則該位不能被修改

Bit 10:空閑模式下“關閉狀態”選擇(該位用于當MOE=0且通道設為輸出時)

0:當定時器不工作時,禁止OC/OCN輸出(OC/OCN使能輸出信號=0)

1:當定時器不工作時,一旦CCxE或CCxNE為1, OC/OCN先輸出其空閑電平,然后使能輸出信號為1

注7 :一旦LOCK級別設為2,則該位不能被修改

Bit 9~Bit 8:鎖定設置(該位為防止軟件錯誤而提供寫保護)

00:鎖定關閉,寄存器無寫保護

01:鎖定級別1,不能寫入TIMx_BDTR寄存器DTG、 BKE、 BKP、 AOE位和TIMx_CR2寄存器OISx/OISxN位

10:鎖定級別2,不能寫入鎖定級別1中的各位,也不能寫入CC極性位

11:鎖定級別3,不能寫入鎖定級別2中的各位,也不能寫入CC控制位

** 注8** :在系統復位后,只能寫一次LOCK位,一旦寫入TIMx_BDTR寄存器,則其內容凍結直至復位

Bit 7~Bit 0:死區發生器設置(定義了插入互補輸出之間的死區持續時間)

9.3 PWM實驗例程

利用STM32的PA8輸出頻率1KHz,占空比為30%,高電平有效的脈沖。

(1)創建基礎工程與pwm.c和pwm.h文件,并將pwm.c和pwm.h文件添加進工程。

圖片

(2)pwm.h添加代碼如下。

圖片

(3)pwm.c添加代碼如下。

#include "pwm.h"
/***************************************************
Name    :PWM_Init
Function    :PWM輸出初始化
Paramater  :
      psc:預分頻系數
Return    :None
***************************************************/
void PWM_Init( u16 psc )
{
  RCC->APB2ENR |= 1<<2 ;
  GPIOA->CRH &= 0xFFFFFFF0 ;                  //清除PA8配置
  GPIOA->CRH |= 0x0000000B ;                  //PA8復用功能輸出
  RCC->APB2ENR |= 1<<11 ;                    //TIM1時鐘開啟
  TIM1->ARR = 100 ;
  TIM1->PSC = psc ;
  TIM1->CCMR1 |= 7<<4 ;                    //CH1 PWM2模式
  TIM1->CCMR1 |= 1<<3 ;                    //CH1預裝載使能
  TIM1->CCER |= 1<<1 ;                      //OC1低電平有效
  TIM1->CCER |= 1<<0 ;                      //OC1輸出使能
  TIM1->BDTR |= 1<<15 ;                    //MOE輸出使能
  TIM1->CR1 |= 1<<7 ;                      //自動重裝載使能
  TIM1->CR1 |= 1<<0 ;                      //開啟定時器1
}
/***************************************************
Name    :PWM_Set
Function    :PWM設置
Paramater  :
      pwm_data:占空比
Return    :None
***************************************************/
void PWM_Set( u8 pwm_data )
{
  TIM1->CCR1 = pwm_data ;
}

(4)1.c添加代碼如下。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "pwm.h"


int main()
{
  STM32_Clock_Init( 9 ) ;                    //STM32時鐘初始化
  SysTick_Init( 72 ) ;                      //SysTick初始化
  USART1_Init( 72, 115200 ) ;                  //初始化串口1波特率115200
  PWM_Init( 719 ) ;                      //PWM初始化
  PWM_Set( 30 ) ;                      //設置占空比30%
  while( 1 )
  {

  }
}

9.4 擴展:PWM實現DAC輸出

9.4.1 工作原理

由于STM32F1自帶2路DAC輸出,所以當DAC不夠用的時候,為了節約成本,需要利用PWM配合RC濾波器來實現DAC輸出,對于PWM脈沖的波形可以列寫出脈沖的時域函數表達式

圖片

9.4.2 電路設計

我們現在設計一個分辨率為8位的PWM信號,其實STM32的分辨率都可以達到16位,甚至32位,但是分辨率越高,速度就越慢,在8位分辨率條件下,我們要求1次諧波對輸出電壓的影響不要超過1個位的精度,也就是3.3/256=0.01289V。假設V~H~為3.3V,V~L~為0V,那么一次諧波的最大值是2*3.3/π=2.1V,這就要求我們的RC濾波電路提供至少-20lg(2.1/0.01289)=-44dB的衰減。

   STM32的定時器最快的計數頻率是72Mhz,8為分辨率的時候,PWM頻率為72M/256=281.25Khz。如果是1階RC濾波,則要求截止頻率為1.77Khz,如果為2階RC濾波,則要求截止頻率為22.34Khz。

圖片

上圖所示位二階RC濾波器的電路原理,根據二階RC濾波器的截止頻率計算公式

圖片

可以得到R28C37=R29C38=RC,通過這個公式我們選定的R和C的參數,并得到實際的截止頻率為33.8KHz,遠超過理論的截止頻率,該電路實測精度大約在0.5LSB左右。

9.4.3 實驗例程

在這里,我們只需要將實驗例程中的PWM頻率改為22.34KHz即可。通過改變占空比,我們可以用電壓表來測量出實際的輸出電壓。

PS:PWM實現DAC輸出最常見的功能就是語音合成芯片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6043

    文章

    44621

    瀏覽量

    638628
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5198

    瀏覽量

    214904
收藏 人收藏

    評論

    相關推薦

    STM32單片機學習筆記(6):PWM波形產生

    利用CubMX生成基于32單片機的HAl庫工程,然后編寫程序在proteus上仿真驗證。本項目最適合沒有開發板的同學學習,零成本利用仿真軟件率先入門STM32單片機。這是第六部分針對STM32
    發表于 07-19 15:34 ?2348次閱讀
    <b class='flag-5'>STM32</b>單片機<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>(6):<b class='flag-5'>PWM</b>波形產生

    STM32學習筆記(初學者快速入門)

    本帖最后由 eehome 于 2013-1-5 10:08 編輯 STM32學習筆記(初學者快速入門)
    發表于 08-18 21:35

    STM32學習筆記(初學者快速入門)

    STM32學習筆記(初學者快速入門)資料來自網絡資源
    發表于 06-11 20:23

    CubeMX入門STM32 HAL庫的學習筆記

    STM32CubeMX是ST官方開發的一款很好用的軟件,主要用于STM32系列單片機的硬件驅動層的配置。網上也有一些關于STM32CubeMX的相關教程,對它的相關操作進行說明。從今天起,小柯希望能將自己從CubeMX
    發表于 08-17 06:55

    STM32入門學習筆記 精選資料分享

    STM32入門學習筆記本文為筆者入門學習過程的記錄,只是零散的記錄了一些個人不太懂得,覺得需要經
    發表于 08-24 07:56

    STM32_PWM實驗

    STM32 PWM實驗,很好的學習資料,快來下載啊
    發表于 02-16 15:46 ?55次下載

    ALIENTEK_MINISTM32_實驗8_PWM輸出實驗

    ALIENTEK MINISTM32 實驗8 PWM輸出實驗,很好的資料,快來學習
    發表于 02-18 14:57 ?15次下載

    pwm輸出實驗

    基于STM32pwm輸出實驗,用DS0燈的亮度觀察pwm輸出的大小
    發表于 09-09 16:58 ?37次下載

    PWM輸出實驗_標準例程

    stm32開發板,標準例程-寄存器版本,PWM輸出實驗
    發表于 11-18 15:42 ?10次下載

    STM32各模塊學習筆記

    GPIO...............................................15 STM32筆記六 運行的必要硬件庫 ........................................2
    發表于 11-30 03:32 ?3177次閱讀

    STM32單片機PWM輸出學習

    STM32單片機PWM輸出學習PWM原理:PWM表示脈沖寬度調制,它是一系列脈沖,這些脈沖將以方
    發表于 11-11 11:51 ?26次下載
    <b class='flag-5'>STM32</b>單片機<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b><b class='flag-5'>學習</b>

    STM32學習心得二十七:PWM DAC數模轉換實驗PWM知識復習

    DAC和第14章——通用定時器硬件連接定時器1通道1輸出PWM,通過PA8輸出,經過二階RC濾波后輸出電壓。1. PWM復習也可參考《
    發表于 11-30 12:21 ?11次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b>心得二十七:<b class='flag-5'>PWM</b> DAC數模轉換<b class='flag-5'>實驗</b>及<b class='flag-5'>PWM</b>知識復習

    STM32學習筆記1——軟硬件基礎keil5編程與GPIO開發

    STM32學習筆記1——軟硬件基礎keil5編程與GPIO開發
    發表于 11-30 12:36 ?4次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>學習</b><b class='flag-5'>筆記</b>1——軟硬件基礎<b class='flag-5'>之</b>keil5編程與GPIO開發

    STM32PWM與示波器實驗

    STM32PWM與示波器實驗STM32輸出PWM波形1、PWM(脈沖寬度調制)介紹2、
    發表于 12-02 13:21 ?24次下載
    <b class='flag-5'>STM32PWM</b>與示波器<b class='flag-5'>實驗</b>

    實驗4——STM32PWM和DAC練習

    個周期2khz的正弦波(循環)三、用STM32F103的DAC功能將一段數字音頻歌曲數據轉換為模擬音頻波形輸出(循環)實驗要求閱讀學習野火開發板資料(零死角玩轉
    發表于 12-09 16:21 ?12次下載
    <b class='flag-5'>實驗</b>4——<b class='flag-5'>STM32</b>的<b class='flag-5'>PWM</b>和DAC練習
    偃师市| 水果机8键遥控器| 百家乐学院| 百家乐完美一对| 加州百家乐的玩法技巧和规则| 百家乐规律打| 全讯网a3322| 大发888 赌博网站| 百家乐桌布呢布| 大发888 58| 大发扑克官方网站| 百家乐官网玩法教材| 百家乐官网辅助分析软件| 博E百百家乐官网现金网| 澳门百家乐官网官网www.bjbj100.com| ea百家乐官网打水| 皇家百家乐官网的玩法技巧和规则 | 和平县| 百家乐官网园sun811| 恒丰百家乐官网的玩法技巧和规则 | 百家乐游戏机分析仪| 百家乐博欲乐城| 大发888 澳门赌场| 必博备用网址| 网上百家乐官网平台下载| 大中华百家乐官网的玩法技巧和规则 | 澳门百家乐娱乐城怎么样| 缅甸百家乐娱乐场开户注册| 真人游戏网| 和龙市| 博彩百家乐官网带连线走势图| 百家乐视频二人雀神| 全讯网77| 皇冠网现金网| 狮威百家乐官网娱乐平台| 百家乐玩法窍门| 百家乐平注常赢玩法| 宾阳县| 什么叫百家乐官网的玩法技巧和规则 | 百家乐摇色子网站| 大发888bet|