#include
"sys.h"
/** 定時器3,可產生四路的pwm輸出,四個通道分別對應的引腳情況如下
tim3_ch1,tim3_ch2,tim3_ch3,tim3_ch4
沒有重映像的對應情況:
pa6,pa7,pb0,pb1
部分重映像:
pb4,pb5,pb0,pb1
完全重映像:
pc6,pc7,pc8,pc9
當我們的io口不僅僅是做普通的輸入輸出使用的時候,作為別的外設(ad,串列埠,定時器等)的特定功能引腳,就需要開啟外設.
這裡我們還需要開啟apb2外設上的復用時鐘afio,同時io口採用的是復用輸出!
我們這裡是沒有使用重對映功能.
*/// 巨集定義
//判斷當前是處於哪一種模式,以便於我們初始化io口
#define no_reamp 0
#define part_reamp 1
#define full_reamp 2
// ---> 這裡是需要制定的引數
//指定這裡的 當前的模式,我們給她預設指定是 沒有重對映
#define current_mode no_reamp
//*************根據當前模式初始化io口 函式
void
my_tim3_gpio_init
(void
) 部分重對映
case part_reamp:
全對映
case full_reamp:
default
:break;}
}/** 初始化定時器的時候指定我們分頻係數psc,這裡是將我們的系統時鐘(
72mhz)進行分頻
* 然後指定重裝載值arr,這個重裝載值的意思就是當 我們的定時器的計數值 達到這個arr時,定時器就會重新裝載其他值.
例如當我們設定定時器為向上計數時,定時器計數的值等於arr之後就會被清0重新計數
* 定時器計數的值被重裝載一次被就是乙個更新(update)
* 計算update時間公式
tout =
((arr+1)
*(psc+1)
)/tclk
公式推導詳解:
tclk是定時器時鐘源,在這裡就是72mhz
我們將分配的時鐘進行分頻,指定分頻值為psc,就將我們的tclk分了psc+
1,我們定時器的最終頻率就是tclk/
(psc+
1) mhz
這裡的頻率的意思就是1s中記 tclk/
(psc+
1)m個數 (
1m=10的6次方)
,每記乙個數的時間為(psc+1)
/tclk ,很好理解頻率的倒數是週期,這裡每乙個數的週期就是(psc+1)
/tclk 秒
然後我們從0記到arr 就是 (arr+1)
*(psc+1)
/tclk
舉例:比如我們設定arr=
7199
,psc=
9999
我們將72mhz (
1m等於10的6次方) 分成了(
9999+1
)等於 7200hz
就是一秒鐘記錄9000數,每記錄乙個數就是1
/7200秒
我們這裡記錄9000個數進入定時器更新(
7199+1
)*(1
/7200)=
1s,也就是1s進入一次更新update*/
//簡單進行定時器初始化,設定 預裝載值 和 分頻係數
void
my_tim3_init
(u16 arr,u16 psc)
//***************** 定時器pwm輸出初始化函式
void
my_tim3_pwm_init
(u16 arr,u16 psc)
//*********************主函式呼叫
intmain()
STM32 PWM原理總結
pwm的工作原理 假如我們要讓乙個led燈由暗到亮,就需要不斷的改變ccrx的值,也就是改變占空比。如果我們改變led燈由暗到亮的速度,我們就需要改變arr的值。pwm配置相關暫存器 使用通用定時器的pwm功能,除了配置一般定時器的方式之外,還需要三種暫存器來控制 捕獲 比較暫存器 timx ccr...
STM32 PWM輸出設定
計數器暫存器 timx cnt 預分頻器暫存器 timx psc 自動裝載暫存器 timx arr 重複次數暫存器 timx rcr 當timx cnt如果timx ccrx中的比較值大於自動重裝載值 timx arr 則ocxref保持為 1 如果比較值為0,則ocxref保持為 0 自動裝載暫存...
STM32 PWM移植排故
硬體更新後,pwm波沒有輸出。1,gpio設定通用推挽輸出用定時器產生方波,用示波器觀察是否正常產生方波。如果正常,硬體無問題,gpio無問題。2,定時器設定計數中斷,在中斷處理函式設定斷點,觀察能否進入斷點,如果能,則定時器模組無問題。晶元有相應定時器。3,檢查配置流程。1 管腳分配注意是否有re...