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

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

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

基于N32G45的定時(shí)器PWM輸出

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

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

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

?PWM的一個(gè)優(yōu)點(diǎn)是從處理器到???被控系統(tǒng)???信號(hào)都是數(shù)字形式的,再進(jìn)行數(shù)模轉(zhuǎn)換。可將噪聲影響降到最低(可以跟電腦一樣)。噪聲只有在強(qiáng)到足以將邏輯1改變?yōu)檫壿?或?qū)⑦壿?改變?yōu)檫壿?時(shí),也才能對(duì)數(shù)字信號(hào)產(chǎn)生影響。

1.PWM模式

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

用戶可以通過設(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 自動(dòng)重裝載預(yù)加載寄存器。

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

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

1.1 PWM中央對(duì)齊模式

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

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

pYYBAGONZnuACHpTAAEI05e7VJM794.png

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

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

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

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

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

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

1.2 PWM 邊沿對(duì)齊模式

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

向上計(jì)數(shù)

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

PWM 模式 1 的示例:

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

poYBAGONZ2WAZ0JjAAB7R9Iyi64267.png

向下計(jì)數(shù)

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

PWM 模式 1 的示例:

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

注:若第n 個(gè)PWM 周期CCDATx 影子寄存器>=AR 值,第n+1 個(gè)PWM 周期CCDATx 的影子寄存器值是0。在第n+1 個(gè)PWM周期的計(jì)數(shù)器為0 的時(shí)刻,雖然計(jì)數(shù)器 = CCDATx 影子寄存器的值 = 0, OCxREF =‘0’,但不會(huì)產(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上),實(shí)現(xiàn)PWM輸出控制LED。

根據(jù)參考手冊(cè)第7章可以看到,我們想要實(shí)現(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用戶手冊(cè)第7.4章節(jié)AFIO寄存器配置。

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

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

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

控制寄存器1(TIM_CTRL1)

pYYBAGONasOAXDf7AACnE-rkno0333.png

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

預(yù)分頻器(TIM_PSC)

pYYBAGONayWABR5CAACvUSRIfKQ765.png

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

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

重裝載寄存器(TIM_AR)

poYBAGONa8yAfM3bAAGaxQwgmfk599.png

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

捕獲比較寄存器(TIM_CCDAT1)

pYYBAGONbG2AAMhYAAI5Zu_qx7Y685.png

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

捕獲/比較寄存器(TIM_CCMOD)

pYYBAGONbPWAXvWRAAHWWWbmmrI017.png

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

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

pYYBAGONbWOAMz3ZAACmpeu2tvM984.png

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

2.1 定時(shí)配置示例

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

/***********************************
**
**函數(shù)功能:定時(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  --重裝載值(即周期時(shí)間)
**    ccr --占空比
**  注意:本示例采用部分重映射功能  
**作者:IT_阿水
************************************/
void TIM3_PWM_Out(u8 chx,u16 psc,u16 ar,u16 ccr)
{
  /*1.開時(shí)鐘*/
  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.定時(shí)器配置*/
  RCC->APB1PCLKEN|=1<<1;//TIM3
  RCC->APB1PRST|=1<<1;//開啟復(fù)位時(shí)鐘
  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;//占空比,有效電平時(shí)間
    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;//占空比,有效電平時(shí)間
    TIM3->CCEN|=1<<4;//開啟CH2
  }
  TIM3->CTRL1|=1<<0;//開啟定時(shí)器
}

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

通過調(diào)節(jié)PWM輸出的占空比,實(shí)現(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ā)送測(cè)試示例!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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5186

    瀏覽量

    213937
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3248

    瀏覽量

    114800
  • n32g455
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    937
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    N32G45的工程項(xiàng)目如何添加AT組件?

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

    定時(shí)器輸出PWM實(shí)驗(yàn)

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

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

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

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

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

    如何通過STM32的定時(shí)器輸出PWM?

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

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

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

    STM32-通用定時(shí)器-PWM輸出

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

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

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

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

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

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

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

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

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

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

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

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

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

    詳解stm32的定時(shí)器8輸出PWM

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