久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5283|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32學(xué)習(xí)筆記5:通用定時器PWM輸出

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85109 發(fā)表于 2015-7-9 00:26 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
1.    TIMER輸出PWM基本概念

脈沖寬度調(diào)制(PWM),是英文“Pulse WidthModulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制。一般用來控制步進電機的速度等等。
STM32的定時器除了TIM6TIM7之外,其他的定時器都可以用來產(chǎn)生PWM輸出,其中高級定時器TIM1TIM8可以同時產(chǎn)生7路的PWM輸出,而通用定時器也能同時產(chǎn)生4路的PWM輸出。

1.1  PWM輸出模式
STM32PWM輸出有兩種模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位確定的(“110”為模式1,“111”為模式2)。模式1和模式2的區(qū)別如下:
110PWM模式1-在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為有效電平,否則為無效電平;在向下計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為無效電平(OC1REF=0),否則為有效電平(OC1REF=1)
111PWM模式2-在向上計數(shù)時,一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平;在向下計數(shù)時,一旦TIMx_CNT>TIMx_CCR1時通道1為有效電平,否則為無效電平。
由此看來,模式1和模式2正好互補,互為相反,所以在運用起來差別也并不太大。
而從計數(shù)模式上來看,PWM也和TIMx在作定時器時一樣,也有向上計數(shù)模式、向下計數(shù)模式和中心對齊模式,關(guān)于3種模式的具體資料,可以查看《STM32參考手冊》的“14.3.9 PWM模式”一節(jié),在此就不詳細贅述了。

1.2  PWM輸出管腳
PWM的輸出管腳是確定好的,具體的引腳功能可以查看《STM32參考手冊》的“8.3.7 定時器復(fù)用功能重映射”一節(jié)。在此需要強調(diào)的是,不同的TIMx有分配不同的引腳,但是考慮到管腳復(fù)用功能,STM32提出了一個重映像的概念,就是說通過設(shè)置某一些相關(guān)的寄存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這些重映像的管腳也是由參考手冊給出的。比如說TIM3的第2個通道,在沒有重映像的時候,指定的管腳是PA.7,如果設(shè)置部分重映像之后,TIM3_CH2的輸出就被映射到PB.5上了,如果設(shè)置了完全重映像的話,TIM3_CH2的輸出就被映射到PC.7上了。

1.3  PWM輸出信號
PWM輸出的是一個方波信號,信號的頻率是由TIMx的時鐘頻率和TIMx_ARR預(yù)分頻器所決定的,具體設(shè)置方法在前面一個學(xué)習(xí)筆記中有詳細的交代。而輸出信號的占空比則是由TIMx_CRRx寄存器確定的。其公式為“占空比=(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通過向CRR中填入適當(dāng)?shù)臄?shù)來輸出自己所需的頻率和占空比的方波信號。

2.    TIMER輸出PWM實現(xiàn)步驟
1.      設(shè)置RCC時鐘;
2.      設(shè)置GPIO時鐘;
3.      設(shè)置TIMx定時器的相關(guān)寄存器;
4.      設(shè)置TIMx定時器的PWM相關(guān)寄存器。

第1步設(shè)置RCC時鐘已經(jīng)在前文中給出了詳細的代碼,在此就不再多說了。需要注意的是通用定時器TIMx是由APB1提供時鐘,而GPIO則是由APB2提供時鐘。注意,如果需要對PWM的輸出進行重映像的話,還需要開啟引腳復(fù)用時鐘AFIO。
第2步設(shè)置GPIO時鐘時,GPIO模式應(yīng)該設(shè)置為復(fù)用推挽輸出GPIO_Mode_AF_PP,如果需要引腳重映像的話,則需要用GPIO_PinRemapConfig()函數(shù)進行設(shè)置。
第3步設(shè)置TIMx定時器的相關(guān)寄存器時,和前一篇學(xué)習(xí)筆記一樣,設(shè)置好相關(guān)的TIMx的時鐘和技術(shù)模式等等。具體設(shè)置參看“TIMER基本定時功能”的學(xué)習(xí)筆記。
第4步設(shè)置PWM相關(guān)寄存器,首先要設(shè)置PWM模式(默認情況下PWM是凍結(jié)的),然后設(shè)置占空比(根據(jù)前面所述公式進行計算),再設(shè)置輸出比較極性:當(dāng)設(shè)置為High時,輸出信號不反相,當(dāng)設(shè)置為Low時,輸出信號反相之后再輸出。最重要是是要使能TIMx的輸出狀態(tài)和使能TIMx的PWM輸出使能。
相關(guān)設(shè)置完成之后,就可以通過TIM_Cmd()來打開TIMx定時器,從而得到PWM輸出了。

3.    TIMER輸出PWM源代碼
由于我現(xiàn)在手上的奮斗開發(fā)板是將PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要進行引腳重映像。打開TIM3之后,PWM輸出,使得LED點亮,通過改變PWM_cfg()中的占空比可以調(diào)節(jié)LED的亮度。

#include "stm32f10x_lib.h"

void RCC_cfg();
void GPIO_cfg();
void TIMER_cfg();
void PWM_cfg();
//占空比,取值范圍為0-100
int dutyfactor = 50;

int main()
{
    intTemp;
      RCC_cfg();
      GPIO_cfg();
      TIMER_cfg();
      PWM_cfg();

      //使能TIM3計時器,開始輸出PWM
      TIM_Cmd(TIM3, ENABLE);

      while(1);
}

void RCC_cfg()
{
      //定義錯誤狀態(tài)變量
      ErrorStatus HSEStartUpStatus;
      
      //RCC寄存器重新設(shè)置為默認值
      RCC_DeInit();

      //打開外部高速時鐘晶振
      RCC_HSEConfig(RCC_HSE_ON);

      //等待外部高速時鐘晶振工作
      HSEStartUpStatus = RCC_WaitForHSEStartUp();
      if(HSEStartUpStatus == SUCCESS)
      {
             //設(shè)置AHB時鐘(HCLK)為系統(tǒng)時鐘
             RCC_HCLKConfig(RCC_SYSCLK_Div1);

             //設(shè)置高速AHB時鐘(APB2)HCLK時鐘
             RCC_PCLK2Config(RCC_HCLK_Div1);

             //設(shè)置低速AHB時鐘(APB1)HCLK2分頻
             RCC_PCLK1Config(RCC_HCLK_Div2);
            
             //設(shè)置FLASH代碼延時
             FLASH_SetLatency(FLASH_Latency_2);

             //使能預(yù)取指緩存
             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

             //設(shè)置PLL時鐘,為HSE9倍頻8MHz * 9 = 72MHz
             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

            //使能PLL
             RCC_PLLCmd(ENABLE);

             //等待PLL準(zhǔn)備就緒
             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

             //設(shè)置PLL為系統(tǒng)時鐘源
             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

             //判斷PLL是否是系統(tǒng)時鐘
             while(RCC_GetSYSCLKSource() != 0x08);
      }

      //開啟TIM3的時鐘
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
      //開啟GPIOB的時鐘和復(fù)用功能
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_cfg()
{
      GPIO_InitTypeDef GPIO_InitStructure;

      
      //部分映射,將TIM3_CH2映射到PB5
//    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
      GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

      //選擇引腳5
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
      //輸出頻率最大50MHz                                                        
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      //復(fù)用推挽輸出                                             
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

      GPIO_Init(GPIOB,&GPIO_InitStructure);
}

void TIMER_cfg()
{
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

      //重新將Timer設(shè)置為缺省值
      TIM_DeInit(TIM3);
      //采用內(nèi)部時鐘給TIM3提供時鐘源
      TIM_InternalClockConfig(TIM3);
      //預(yù)分頻系數(shù)為0,即不進行預(yù)分頻,此時TIMER的頻率為72MHz
      TIM_TimeBaseStructure.TIM_Prescaler = 0;
      //設(shè)置時鐘分割
      TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
      //設(shè)置計數(shù)器模式為向上計數(shù)模式
      TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
      //設(shè)置計數(shù)溢出大小,每計7200個數(shù)就產(chǎn)生一個更新事件,即PWM的輸出頻率為10kHz
      TIM_TimeBaseStructure.TIM_Period = 7200 - 1;
      //將配置應(yīng)用到TIM3
      TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
}

void PWM_cfg()
{
      TIM_OCInitTypeDef TimOCInitStructure;
      //設(shè)置缺省值
      TIM_OCStructInit(&TimOCInitStructure);
      //PWM模式1輸出
      TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      //設(shè)置占空比,占空比=(CCRx/ARR)*100%(TIM_Pulse/TIM_Period)*100%
      TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;
      //TIM輸出比較極性高
      TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
      //使能輸出狀態(tài)
      TimOCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
      //TIM3CH2輸出
      TIM_OC2Init(TIM3, &TimOCInitStructure);
      //設(shè)置TIM3PWM輸出為使能
      TIM_CtrlPWMOutputs(TIM3,ENABLE);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区免费视频 | 国产成人精品网站 | 欧美电影一区 | 精品一区二区在线观看 | 免费毛片网站在线观看 | 91一区二区三区在线观看 | 日韩无| 一区二区在线看 | 午夜在线视频一区二区三区 | 久久久久亚洲 | 成人在线视频免费观看 | 精品久久香蕉国产线看观看亚洲 | 亚洲视频一区 | 久久久久中文字幕 | 欧美一区二区三区免费电影 | 狠狠干美女 | 国产不卡在线 | 97精品国产 | 亚洲精品成人网 | 亚洲激精日韩激精欧美精品 | 亚洲精品一区中文字幕乱码 | 中文字幕一区二区三区精彩视频 | 国产日韩一区二区三免费高清 | 国产一区二区三区在线 | 精品一区二区免费视频 | 欧美亚洲高清 | 欧美精品一区二区三区四区 在线 | 日日骚网 | 99re在线免费视频 | 精品国产伦一区二区三区观看说明 | www.99精品 | 欧美一区二区三区免费在线观看 | 欧美激情精品久久久久久变态 | 国产精品99久久久久久动医院 | 一区二区在线观看av | 欧美性极品xxxx做受 | 91黄色免费看 | 在线观看视频一区 | 亚洲 精品 综合 精品 自拍 | 污免费网站 | av在线免费不卡 |