0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于N32G45的定時器PWM輸出

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-12-05 12:08 ? 次閱讀

? PWM是一種對模擬信號電平進(jìn)行????數(shù)字編碼?????的方法。通過高????分辨率????計數(shù)器的使用,方波的占空比被調(diào)制用來對一個具體????模擬信號????的電平進(jìn)行編碼。PWM信號仍然是數(shù)字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時候即是直流供電被加到負(fù)載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬值都可以使用PWM進(jìn)行編碼。

脈寬調(diào)制(PWM,Pulse Width Modulation)是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中 。

?PWM的一個優(yōu)點是從處理器到???被控系統(tǒng)???信號都是數(shù)字形式的,再進(jìn)行數(shù)模轉(zhuǎn)換??蓪⒃肼曈绊懡档阶畹停梢愿?a target="_blank">電腦一樣)。噪聲只有在強到足以將邏輯1改變?yōu)檫壿?或?qū)⑦壿?改變?yōu)檫壿?時,也才能對數(shù)字信號產(chǎn)生影響。

1.PWM模式

用戶可以使用 PWM 模式產(chǎn)生一個信號,其占空比由 TIMx_CCDATx 寄存器的值決定,其頻率由TIMx_AR 寄存器的值決定。 并且取決于 TIMx_CTRL1.CAMSEL 的值, TIM 可以在邊沿對齊模式或中央對齊模式下產(chǎn)生 PWM 信號。

用戶可以通過設(shè)置 TIMx_CCMODx. OCxMD=110 或設(shè)置 TIMx_CCMODx.OCxMD=111 來設(shè)置 PWM 模式 1 或 PWM 模式 2。 要使能預(yù)加載寄存器,用戶必須設(shè)置相應(yīng)的 TIMx_CCMODx.OCxPEN。 然后設(shè)置 TIMx_CTRL1.ARPEN 自動重裝載預(yù)加載寄存器。

用戶可以通過設(shè)置 TIMx_CCEN.CCxP 來設(shè)置 OCx 的極性。當(dāng) TIM 處于 PWM 模式時, TIMx_CNT 和 TIMx_CCDATx 的值總是相互比較。

只有當(dāng)更新事件發(fā)生時,預(yù)加載寄存器才會轉(zhuǎn)移到影子寄存器。 因此,用戶必須在計數(shù)器開始計數(shù)之前通過設(shè)置 TIMx_EVTGEN.UDGN 來復(fù)位所有寄存器。

1.1 PWM中央對齊模式

如果用戶設(shè)置 TIMx_CTRL1.CAMSEL 等于 01、 10 或 11, PWM 中央對齊模式將被激活。 比較標(biāo)志的設(shè)置取決于 TIMx_CTRL1.CAMSEL 的值。 設(shè)置比較標(biāo)志的情況有 3 種,僅當(dāng)計數(shù)器向上計數(shù)時,僅當(dāng)計數(shù)器向下計數(shù)時,或當(dāng)計數(shù)器向上計數(shù)和向下計數(shù)時。 用戶不應(yīng)通過軟件修改 TIMx_CTRL1.DIR,它是由硬件更新的。

中央對齊 PWM 波形示例如下,波形設(shè)置為: TIMx_AR=8, PWM 模式 1 ,當(dāng)計數(shù)器向下計數(shù)對應(yīng)TIMx_CTRL1.CAMSEL=01 時設(shè)置比較標(biāo)志。

pYYBAGONZnuACHpTAAEI05e7VJM794.png

使用中央對齊模式時用戶應(yīng)注意的事項如下:

計數(shù)器向上或向下計數(shù)取決于 TIMx_CTRL1.DIR 的值。 注意不要同時更改 DIR 和 CAMSEL 位

用戶在中央對齊模式下不要寫計數(shù)器,否則會導(dǎo)致意想不到的結(jié)果。 例如:

如果寫入計數(shù)器的值為 0 或者是 TIMx_AR 的值,則方向會被更新,但不會產(chǎn)生更新事件

如果寫入計數(shù)器的值大于自動重載的值,則方向不會更新

為了安全起見,建議用戶在啟動計數(shù)器之前設(shè)置 TIMx_EVTGEN.UDGN 以通過軟件生成更新,并且在計數(shù)器運行時不要寫入計數(shù)器。

1.2 PWM 邊沿對齊模式

邊沿對齊模式有兩種配置,向上計數(shù)和向下計數(shù)。

向上計數(shù)

用戶可以設(shè)置 TIMx_CTRL1.DIR=0 使計數(shù)器向上計數(shù)。

PWM 模式 1 的示例:

當(dāng) TIMx_CNT < TIMx_CCDATx 時, OCxREF 為高電平,否則為低電平。 如果 TIMx_CCDATx 中的比較值大于自動重載值,則 OCxREF 將保持為 1。相反,如果比較值為 0,則 OCxREF 將保持為 0。當(dāng) TIMx_AR=8 時, PWM 波形如下:

poYBAGONZ2WAZ0JjAAB7R9Iyi64267.png

向下計數(shù)

用戶可以設(shè)置 TIMx_CTRL1.DIR=1 使計數(shù)器向下計數(shù)。

PWM 模式 1 的示例:

當(dāng) TIMx_CNT > TIMx_CCDATx 時, OCxREF 為低電平,否則為高電平。 如果 TIMx_CCDATx 中的比較值大于自動重載值,則 OCxREF 將保持為 1。

注:若第n 個PWM 周期CCDATx 影子寄存器>=AR 值,第n+1 個PWM 周期CCDATx 的影子寄存器值是0。在第n+1 個PWM周期的計數(shù)器為0 的時刻,雖然計數(shù)器 = CCDATx 影子寄存器的值 = 0, OCxREF =‘0’,但不會產(chǎn)生比較事件。

2.通過PWM輸出呼吸燈示例

1.根據(jù)N32G45帖子介紹可知LED硬件接口:https://bbs.elecfans.com/jishu_2320004_1_1.html

poYBAGOLSzGAEIR2AAApZY0b19M245.png#pic_center

2.接下來我我們以D2、D3為例(D2、D3剛才處于TIM3的通道1和通道2上),實現(xiàn)PWM輸出控制LED。

根據(jù)參考手冊第7章可以看到,我們想要實現(xiàn)該功能,就需要開始TIM3的部分重映射功能。

pYYBAGONaPWALuFjAACJ53d22dI465.png

TIM3通道的部分重映射配置如下:

  RCC->APB2PCLKEN|=1<<0;//AFIO
  AFIO->RMP_CFG&=~(0x3<<10);
  AFIO->RMP_CFG|=2<<10;//開啟部分重映像
  AFIO->RMP_CFG&=~(0x7<<24);
  AFIO->RMP_CFG|=1<<24;//將PB4設(shè)置為普通IO

寄存器相關(guān)介紹可查看N32用戶手冊第7.4章節(jié)AFIO寄存器配置。

3.配置定時器基本功能和PWM模式。

在完成PWM模式輸出時,我們需要先完成定時器的基本功能配置(開定時器時鐘、設(shè)置預(yù)分頻系數(shù),設(shè)置周期時間)。

定時器相關(guān)寄存器可參考N32用戶手冊12.4章節(jié)。下面列舉幾個常用寄存器。

控制寄存器1(TIM_CTRL1)

pYYBAGONasOAXDf7AACnE-rkno0333.png

本寄存器主要實現(xiàn)定時器的基本功能配置:設(shè)置計數(shù)模式、開始定時器等。

預(yù)分頻器(TIM_PSC)

pYYBAGONayWABR5CAACvUSRIfKQ765.png

本寄存器設(shè)置定時器的工作頻率,例如要實現(xiàn)計數(shù)器+1的時長為1us,則時鐘的PSC=72-1;

注意:定時器的時鐘線工作頻率為72MHZ,即CK_PSC=72MHZ

重裝載寄存器(TIM_AR)

poYBAGONa8yAfM3bAAGaxQwgmfk599.png

重裝載寄存器為實現(xiàn)定時器計數(shù)周期。

捕獲比較寄存器(TIM_CCDAT1)

pYYBAGONbG2AAMhYAAI5Zu_qx7Y685.png

當(dāng)為輸出模式時,CCDAT寄存器用于設(shè)置占空比;當(dāng)為輸入模式時,CCDAT用于保存捕獲到的電平時間;

捕獲/比較寄存器(TIM_CCMOD)

pYYBAGONbPWAXvWRAAHWWWbmmrI017.png

捕獲比較寄存器用于設(shè)置輸入捕獲模式和輸出比較模式的通道參數(shù)信息。

捕獲/比較使能寄存器(TIM_CCEN)

pYYBAGONbWOAMz3ZAACmpeu2tvM984.png

捕獲比較使能寄存器用于啟動通道、設(shè)置有效電平極性。

2.1 定時配置示例

完成定時器基本功能配置,設(shè)置周期時間,設(shè)置分頻系數(shù),配置通道參數(shù),輸出PWM。

/***********************************
**
**函數(shù)功能:定時器器PWM輸出
**TIM3通道引腳: 
**           沒有重映射   部分重映射     完全重映射
**  TIM3_CH1    PA6           PB4             PC6
**  TIM3_CH2    PA7           PB5             PC7
**形參:
**    chx --要開啟的通道(1 --通道1,2--通道2, 3 --表示開啟通道1和通道2)
**    psc --預(yù)分頻系數(shù)
**    ar  --重裝載值(即周期時間)
**    ccr --占空比
**  注意:本示例采用部分重映射功能  
**作者:IT_阿水
************************************/
void TIM3_PWM_Out(u8 chx,u16 psc,u16 ar,u16 ccr)
{
  /*1.開時鐘*/
  RCC->APB2PCLKEN|=1<<3;//PB
  RCC->APB2PCLKEN|=1<<0;//AFIO
  AFIO->RMP_CFG&=~(0x3<<10);
  AFIO->RMP_CFG|=2<<10;//開啟部分重映像
  AFIO->RMP_CFG&=~(0x7<<24);
  AFIO->RMP_CFG|=1<<24;//將PB4設(shè)置為普通IO
  /*2.配置GPIO*/
  GPIOB->PL_CFG&=0xFF00FFFF;
  GPIOB->PL_CFG|=0x00BB0000;//通用復(fù)用推挽輸出模式
  /*3.定時器配置*/
  RCC->APB1PCLKEN|=1<<1;//TIM3
  RCC->APB1PRST|=1<<1;//開啟復(fù)位時鐘
  RCC->APB1PRST&=~(1<<1);//取消復(fù)位
  TIM3->CTRL1|=1<<7;
  TIM3->PSC=psc-1;//預(yù)分頻
  TIM3->AR=ar;//重裝載值
  
  /*輸出PWM配置*/
  if(chx&0x1)
  {
    TIM3->CCMOD1&=~(0x3<<0);//輸出
    TIM3->CCMOD1|=1<<2;//快速使能
    TIM3->CCMOD1|=1<<3;//預(yù)加載
    TIM3->CCMOD1|=0x6<<4;//PWM0
    TIM3->CCDAT1=ccr;//占空比,有效電平時間
    TIM3->CCEN|=1<<0;//開啟CH1
  }
  if(chx&1<<1)//CH2
  {
    TIM3->CCMOD1&=~(0x3<<8);//輸出
    TIM3->CCMOD1|=1<<10;//快速使能
    TIM3->CCMOD1|=1<<11;//預(yù)加載
    TIM3->CCMOD1|=0x6<<12;//PWM0  
    TIM3->CCDAT2=ccr;//占空比,有效電平時間
    TIM3->CCEN|=1<<4;//開啟CH2
  }
  TIM3->CTRL1|=1<<0;//開啟定時器
}

2.2 呼吸燈效果實現(xiàn)

通過調(diào)節(jié)PWM輸出的占空比,實現(xiàn)LED呼吸燈效果。

#include "n32g45x.h"
#include 
#include 
#include "led.h"
#include "key.h"
#include "usart.h"
#include "delay.h"
#include "timer.h"
int main()
{
  u8 key_val;
  int time=0;
  u8 flag=0;
  LED_Init();
  KEY_Init();
  USART_Init(115200);
  TIM3_PWM_Out(3,72,400,0);
  printf("串口初始化完成rn");
  while(1)
  {
    key_val=Key_Scan();  
    if(key_val)
    {
      printf("串口+DMA數(shù)據(jù)發(fā)送測試示例!rn");
    }
    if(usart1_flag)
		{
			usart1_rx_buff[usart1_cnt]='?';
			printf("%s,%drn",usart1_rx_buff,usart1_cnt);
      if(strcmp((char *)usart1_rx_buff,"LED1_ON")==0)LED_D1=1;
      else if(strcmp((char *)usart1_rx_buff,"LED1_OFF")==0)LED_D1=0;
      else if(strcmp((char *)usart1_rx_buff,"LED2_ON")==0)LED_D2=1;
      else if(strcmp((char *)usart1_rx_buff,"LED2_OFF")==0)LED_D2=0;
      else if(strcmp((char *)usart1_rx_buff,"LED3_ON")==0)LED_D3=1;
      else if(strcmp((char *)usart1_rx_buff,"LED3_OFF")==0)LED_D3=0;
			usart1_flag=0;
		}  
    if(time>=400)flag=1;
    else if(time<=0)flag=0;
    if(flag)time--;
    else time++;
    TIM3->CCDAT1=time;
    TIM3->CCDAT2=time;
    Delay_Ms(10);
  }    
}
pYYBAGONbq-AGOePAA0nwUWXJUc426.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5060

    瀏覽量

    212262
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113713
  • n32g455
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    904
收藏 人收藏

    評論

    相關(guān)推薦

    定時器應(yīng)用之PWM輸出

    定時器應(yīng)用之PWM輸出1.1 TIM1_CH1N 與 TIM1_CH1 的區(qū)別在剛準(zhǔn)備使用定時器的時候,我看了下原理圖,發(fā)現(xiàn)對于
    發(fā)表于 08-19 08:40

    N32G45的工程項目如何添加AT組件?

    目前使用的是N32G45的工程項目,需要添加AT組件,然后我根據(jù)文檔發(fā)現(xiàn)沒有AT的代碼,從rtthread studio新建的項目中把AT文件夾復(fù)制過來,在其中使用ENV工具配置,手動將程序全都放進(jìn)工程中新建的文件夾,編譯的時候發(fā)現(xiàn)沒有,下載了at_device軟件版之后不知道怎么配置了。
    發(fā)表于 09-07 16:52

    定時器輸出PWM實驗

    定時器輸出PWM 實驗 一. 實驗?zāi)康睦?b class='flag-5'>定時器控制產(chǎn)生占空比可變的PWM 波。二. 實驗設(shè)備及器件IBM PC 機 一臺DP-51PRO
    發(fā)表于 09-22 10:49 ?7328次閱讀

    AVR單片機定時器輸出PWM的設(shè)計及注意問題

    本內(nèi)容提供了AVR單片機定時器輸出PWM的設(shè)計及注意問題,根據(jù)PWM的特點,在使用ATmega128的定時/計數(shù)
    發(fā)表于 11-09 17:39 ?1608次閱讀

    關(guān)于定時器輸出PWM頻率范圍及占空比精度

    定時器輸出PWM頻率范圍及占空比精度
    的頭像 發(fā)表于 03-12 10:37 ?1.3w次閱讀

    如何通過STM32的定時器輸出PWM

    ? 本文將介紹通過STM32的定時器輸出PWM,如果對定時器不太熟悉的同學(xué)可以看下之前的文章《STM32基礎(chǔ)定時器詳解》,關(guān)于
    的頭像 發(fā)表于 02-20 15:08 ?2.2w次閱讀
    如何通過STM32的<b class='flag-5'>定時器</b><b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>?

    淺談定時器基礎(chǔ)知識與PWM輸出原理

    轉(zhuǎn)速等。 本篇先介紹定時器的基礎(chǔ)知識,然后對照這些知識介紹一下定時器輸出PWM的基本原理,以及編程實現(xiàn)與代碼分析。 首先來看一下定時器的基礎(chǔ)
    的頭像 發(fā)表于 04-05 10:35 ?1.4w次閱讀
    淺談<b class='flag-5'>定時器</b>基礎(chǔ)知識與<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>原理

    STM32-通用定時器-PWM輸出

    1 通用定時器PWM概述1.1STM32定時器輸出通道引腳這里以TIM3為例來講解。STM32的通用定時器分為TIM2、TIM3、TIM4、
    發(fā)表于 11-26 15:36 ?23次下載
    STM32-通用<b class='flag-5'>定時器</b>-<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>

    電機控制基礎(chǔ)——定時器基礎(chǔ)知識與PWM輸出原理

    轉(zhuǎn)速等。本篇先介紹定時器的基礎(chǔ)知識,然后對照這些知識介紹一下定時器輸出PWM的基本原理,以及編程實現(xiàn)與代碼分析。首先來看一下定時器的基礎(chǔ)介紹
    發(fā)表于 11-30 14:21 ?38次下載
    電機控制基礎(chǔ)——<b class='flag-5'>定時器</b>基礎(chǔ)知識與<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>原理

    普通定時器輸出互補PWM帶死區(qū)

    普通定時器輸出互補PWM帶死區(qū)一般來說三相半橋電路需要互補PWM驅(qū)動,而且互補PWM需要帶死區(qū),死區(qū)的大小跟管子的性能參數(shù)有關(guān)。公司為了省成
    發(fā)表于 12-16 16:59 ?24次下載
    普通<b class='flag-5'>定時器</b><b class='flag-5'>輸出</b>互補<b class='flag-5'>PWM</b>帶死區(qū)

    STM32定時器應(yīng)用——輸出PWM給電機調(diào)速

    (含源碼)運用定時器調(diào)整PWM輸出值,使直流電機從慢到快,再從快到慢。
    發(fā)表于 12-31 19:53 ?11次下載
    STM32<b class='flag-5'>定時器</b>應(yīng)用——<b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>給電機調(diào)速

    基于51定時器中斷PWM+L298N藍(lán)牙小車

    【開源教程】51單片機藍(lán)牙小車 定時器中斷 PWM調(diào)速控制 關(guān)鍵問題: 51藍(lán)牙串口通信、定時器、中斷、L298N、PWM調(diào)速;初來乍到,哪
    發(fā)表于 04-11 14:52 ?1次下載

    STM32F407入門開發(fā): 配置定時器輸出PWM方波

    STM32F407的定時器的 TIM6 和 TIM7 是普通定時器,除此之外,其他的定時器都可以用來產(chǎn)生 PWM 輸出。其中高級
    的頭像 發(fā)表于 05-28 13:43 ?1.4w次閱讀
    STM32F407入門開發(fā): 配置<b class='flag-5'>定時器</b><b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>方波

    基于N32G45的按鍵驅(qū)動

    N32G45系列集成了最新一代嵌入式ARM Cortex?-M4F處理,在Cortex?-M3內(nèi)核的基礎(chǔ)上強化了運算能力、新增加了浮點運算處理單元(FPU)、DSP和并行計算指令,提供1.25DMIPS/MHz的優(yōu)異性能。
    的頭像 發(fā)表于 12-04 10:44 ?1855次閱讀
    基于<b class='flag-5'>N32G45</b>的按鍵驅(qū)動

    詳解stm32的定時器8輸出PWM

    我在定時器3的例程上面改,改了很久都沒改好,百度看別人說定時器1和定時器8需要額外的指令用于PWM輸出,今天下午硬件的人來要東西了,來不及研
    的頭像 發(fā)表于 01-05 11:01 ?5996次閱讀