1. 程式人生 > >STM32HAL定時器PWM輸出呼吸燈

STM32HAL定時器PWM輸出呼吸燈

  1. STM32定時器區別

     基本定時器主要特徵:

     ●16位自動重灌載累加計數器 

    ●16位可程式設計(可實時修改)預分頻器,用於對輸入的時鐘按係數為1~65536之間的任意數值分頻 

    ●在更新事件(計數器溢位)時產生中斷/DMA請求 

高階與通用定時器功能包括(紅色字型為高階定時器與通用定時器區別)
    ● 16位向上、向下、向上/向下自動裝載計數器
    ● 16位可程式設計(可以實時修改)預分頻器,計數器時鐘頻率的分頻係數為1~65536 之間的任意數值
    ● 4個獨立通道:
    ─ 輸入捕獲
   ─ 輸出比較
   ─ PWM生成(邊緣或中間對齊模式)


   ─ 單脈衝模式輸出
  ● 使用外部訊號控制定時器和定時器互連的同步電路
  ● 如下事件發生時產生中斷/DMA:
  ─ 更新:計數器向上溢位/向下溢位,計數器初始化(通過軟體或者內部/外部觸發)
  ─ 觸發事件(計數器啟動、停止、初始化或者由內部/外部觸發計數)
  ─ 輸入捕獲
  ─ 輸出比較
  ● 支援針對定位的增量(正交)編碼器和霍爾感測器電路
  ● 觸發輸入作為外部時鐘或者按週期的電流管理 

  ● 死區時間可程式設計的互補輸出 

  ● 允許在指定數目的計數器週期之後更新定時器暫存器的重複計數器
  ● 剎車輸入訊號可以將定時器輸出訊號置於復位狀態或者一個已知狀態 

2.STM32L051定時器只有通用定時器(TIM2/3,TIM21/22),基本定時器(TIM6/7),使用通用定時器2四個通道輸出PWM波。

·   計數器暫存器 (TIMx_CNT)計數器的時鐘可通過預分頻器進行分頻。 計數器由預分頻器輸出 CK_CNT 提供時鐘,僅當 TIMx_CR1 暫存器中的計數器啟動位(CEN) 1 時,才會啟動計數器實際的計數器使能訊號 CNT_EN CEN 1 的一個時鐘週期後被置 1  
  ·預分頻器暫存器 (TIMx_PSC)預分頻器可對計數器時鐘頻率進行分頻,分頻係數介於 1 65536 之間。該預分頻器基於16 /32 位暫存器(TIMx_PSC 暫存器)所控制的 16 位計數器。由於該控制暫存器具有緩衝功能,因此預分頻器可實現實時更改。而新的預分頻比將在下一更新事件發生時被採用。

 
·   自動過載暫存器 (TIMx_ARR)自動過載暫存器是預裝載的。對自動過載暫存器執行寫入或讀取操作時會訪問預裝載暫存器。預裝載暫存器的內容既可以直接傳送到影子暫存器,也可以在每次發生更新事件 (UEV)時傳送到影子暫存器,這取決於 TIMx_CR1 暫存器中的自動過載預裝載使能位 (ARPE)。當計數器達到上溢值(或者在遞減計數時達到下溢值)並且 TIMx_CR1 暫存器中的 UDIS 位為0 時,將傳送更新事件。該更新事件也可由軟體產生。

·  計數器模式 遞增計數模式,計數器從 0 計數到自動過載值(TIMx_ARR 暫存器的內容),然後重新從 0 開始計數並生成計數器上溢事件。

  遞減計數模式下,計數器從自動過載值(TIMx_ARR 暫存器的內容)開始遞減計數到 0,然後重新從自動過載值開始計數並生成計數器下溢事件。  

  中心對齊模式(遞增/遞減計數下,計數器從 0 開始計數到自動過載值(TIMx_ARR 暫存器的內容) – 1,生成計數器上溢事件;然後從自動過載值開始向下計數到 1 並生成計數器下溢事件。之後從0 開始重新計數。 

  佔空比:高低電平所佔的時間的比率佔空比越大,電路開通時間就越長。通過改變佔空比來控制高低電平在一個週期內所佔的時間。

3.PWM實現呼吸燈

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)

{

  GPIO_InitTypeDef   GPIO_InitStruct;

  __HAL_RCC_TIM2_CLK_ENABLE();  //TIM2時鐘使能

  __HAL_RCC_GPIOA_CLK_ENABLE(); //GPIOA時鐘使能

//引腳配置 定時器對應引腳去datasheet查詢

配置PA0 1 2 3對應定時器2 通道1 2 3 4

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  

  GPIO_InitStruct.Pull = GPIO_PULLUP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;

  GPIO_InitStruct.Pin = GPIO_PIN_0;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_2;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_3;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

/**************************************************************************/

TIM_HandleTypeDef    TimHandle; //結構體變數

TIM_OC_InitTypeDef sConfig;     //結構體變數

TimHandle.Instance = TIM2;  //定時器2 

TimHandle.Init.Prescaler    = (SystemCoreClock / 16000000) -1;//預分頻  定時器時鐘頻率= 系統時鐘頻率(32Mhz) / (分頻係數(32Mhz/16Mhz)-1+1) = 16Mhz

TimHandle.Init.Period       = 1600-1; //1600從0到1600為一個計數週期

TimHandle.Init.ClockDivision = 0;//設定時鐘分割

TimHandle.Init.CounterMode   = TIM_COUNTERMODE_UP; //計數模式:向上計數

if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)   

{

    /* Initialization Error */

    ErrorHandler();

}

/*********************************************/

//配置PWM通道  多有通道的通用配置

  sConfig.OCMode     = TIM_OCMODE_PWM1;

  sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfig.OCFastMode = TIM_OCFAST_DISABLE;

  sConfig.Pulse = 1200;  //設定通道1的脈衝值  1200/1600 = 75%

 if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)

  {

     ErrorHandler();

  }

 sConfig.Pulse = 800;  //設定通道2的脈衝值  800/1600 = 50%

 if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)

  {

     ErrorHandler();

  }

 sConfig.Pulse = 400;  //設定通道3的脈衝值  400/1600 = 25%

 if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK)

  {

     ErrorHandler();

  }

 sConfig.Pulse = 400;  //設定通道4的脈衝值  400/1600 = 25%

 if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_4) != HAL_OK)

  {

     ErrorHandler();

  }

HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1);//通道1開始生成PWM訊號

HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2);//通道2開始生成PWM訊號

HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_3);//通道3開始生成PWM訊號

HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_4);//通道4開始生成PWM訊號

/******************************************************************/

  while (1)

  {

  int i;

  for(i=0; i<1600; i+=4)  //1600/4 = 400個亮度梯度  

  {

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1,i); //修改佔空比 逐漸變亮

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_2,i);

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_3,i);

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_4,i);   

 HAL_Delay(10);

 }

  for(i=1600; i>0; i-=4)

  {

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_1,i);  //逐漸變暗

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_2,i);

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_3,i);

__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_4,i);

 HAL_Delay(10);

 }

HAL_Delay(1000);   //延遲1秒 一個呼吸燈週期

  }

相關推薦

STM32HAL定時PWM輸出呼吸

STM32定時器區別      基本定時器主要特徵:      ●16位自動重灌載累加計數器      ●16位可程式設計(可實時修改)預分頻器,用於對輸入的時鐘按係數為1~65536之間的任意數值分頻      ●在更新事件(計數器溢位)時產生中斷/DMA請求 

STM32學習筆記(5)——通用定時PWM輸出

part 大小 模式 lan 晶振 kcon 筆記 利用 .cn 1、TIMER輸出PWM基本概念 脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬

STM32學習筆記(7)——通用定時PWM輸出

nbsp 錯誤 buffer put inter def internal reset 有效 1、TIMER輸出PWM基本概念 脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利

STM32學習筆記(5):通用定時PWM輸出

PWM的輸出管腳是確定好的,具體的引腳功能可以檢視《STM32參考手冊》的“8.3.7 定時器複用功能重對映”一節。在此需要強調的是,不同的TIMx有分配不同的引腳,但是考慮到管腳複用功能,STM32提出了一個重映像的概念,就是說通過設定某一些相關的暫存器,來使得在其他非原始指定的管腳上也能輸出PWM。但是這

通用定時PWM輸出實驗

知識回顧 本節知識需要了解通用定時器原理的前提下進行學習 我們將通用定時器分為四個部分: 1,選擇時鐘 2,時基電路 3,輸入捕獲 4,輸出比較 本節定時器PWM輸出主要涉及到定時器框圖右下方部分,即輸出

STM32103C8T6定時1輸出兩路互補PWM

一、GPIO初始化    GPIO配置如下     GPIOA->CRH&=0XFFFFF000;    //清除PA8,9,10配置     GPIOA->CRH|=0X00000BBB;    //PA8,9,10推輓複用功能輸出

STM32 通用定時輸出PWM功能 學習筆記

首先來說,你要使用PWM模式你得先選擇用哪個定時器來輸出PWM吧!除了TIM6、TIM7這兩個普通的定時器無法輸出PWM外,其餘的定時器都可以輸出PWM,每個通用定時器可以輸出4路PWM,高階定時器TIM1、TIM8每個可輸出7路PWM。選好定時器及通道後,下一步就是要使能

高階定時PWM互補輸出

一、程式設計要點1、初始化TMI相關GPIO2、初始化時基結構體3、初始化比較輸出結構體4、初始化死區剎車結構體5、編寫呼吸燈函式二、結構體&庫函式1、時基結構體 typedef struct {   uint16_t TIM_Prescaler;         /

STM32F407ZGT6 定時1輸出7路PWM(互補輸出

void Webb_TIM1_PWM(uint32_t arr,uint32_t psc) {   GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef WebbPwm; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitS

STM32CubeMX學習筆記——STM32H743通用定時PWM

STM32CubeMX學習筆記——STM32H743通用定時器PWM Github 功能簡述 STM32CubeMX配置 Pinout配置 Clock Configuration配置 Configuration

[STM32F103]定時PWM輸入

typedef struct {   uint16_t TIM_OCMode;  //PWM模式1或者模式2   uint16_t TIM_OutputState; //輸出使能 OR失能   uint16_t TIM_Output

基於PWM呼吸設計(Verilog版)

module Breath_Led(clk,rst,led); input clk,rst; output reg led; reg[19:0] count; reg[19:0] duty_cycle; always @(posedge clk) begin if(!rst) begin

STM32CubeMX學習教程之五:PWM實現呼吸效果

完整原始碼下載:https://github.com/simonliu009/STM32CubeMX-PWM-Output軟體:STM32CubeMX V4.25.0  System Workbench V2.4韌體庫版本:STM32Cube FW_F1 V1.6.1硬體:O

簡單的一個用定時控制的流水c程式

用定時器以間隔500MS在6位數碼管上依次顯示0、1、2、3….C、D、E、F,重複。 #include<reg52.h> typedef unsigned int u8; typede

51微控制器組合語言程式設計:用定時控制輸出矩形波

80C51微控制器的時鐘頻率為12MHz,利用定時器T1和P1.0輸出矩形脈衝。波形只畫出了2段:一段為100us 另一段為50us。要完全的、完整的、詳細的編寫此程式的過程!謝謝懸賞分:5 | 解決時間:2011-1-9 15:24------------------------最佳答案:用一個定時器定時

Stm32定時中斷使LED閃爍

知識點: Stm32共有11個定時器: 1.兩個高階定時器:TIM1、TIM8-------------------------APB2 2.四個通用定時器:TIM2~TIM5-------------------------APB1 3.兩個基本定時器:TIM6、TIM7

【技術】定時&PWM詳解

轉自 https://blog.csdn.net/lwj103862095/article/details/7857428 S3C2440定時器簡介: S3C2440一共有5個16位的定時器,其中定時器0、1、2、3有PWM(脈衝寬度調製)功能

ZYNQ自定義AXI匯流排IP應用——PWM實現呼吸效果

一、前言   在實時性要求較高的場合中,CPU軟體執行的方式顯然不能滿足需求,這時需要硬體邏輯實現部分功能。要想使自定義IP核被CPU訪問,就必須帶有匯流排介面。ZYNQ採用AXI BUS實現PS和PL之間的資料互動。本文以PWM為例設計了自定義AXI匯流排IP,來演示如何靈活運用ARM+FPGA的架構。 功

STM32 定時2 CH1 CH2 PWM輸出 產生呼吸效果

     PWM一般用來驅動電機(控制速度),控制LED亮度,驅動開關電源電路等等,本例項通過改變PWM佔空比的方式來驅動LED燈,形成呼吸燈的效果。用這種方式來學習STM32 TIM2輸出PWM的配置。      以STM32F103C8T6為例,從其資料手冊中可以看到,P

STM32定時產生PWM--呼吸

說明:本工程程式碼在STM32F407ZET6上測試通過。 1、PWM定義 Pulse Width Modulation:脈衝寬度調製(PWM) 2、用途 (1)控制輸出的電壓和電流 (2)燈光的亮度 (3)電機控制 3、分析PWM產生