網(wǎng)頁設(shè)計(jì)題材優(yōu)化的含義
一、基礎(chǔ)知識(shí)
1、寄存器的配置
(1)GPIOX_AFRL:GPIO復(fù)用功能低位寄存器
GPIOX_AFRH:GPIO復(fù)用功能高位寄存器
(2)配置PA5 GPIOA->MODER(端口模式寄存器),10為復(fù)用功能,是指除了普通輸入/出,還有其他功能TIM等
(3)GPIO->OTYPER:0為推挽,1為開漏輸出,推挽輸出在示波器上看主要為方波形,而開漏在示波器顯示為鋸齒波。但要注意使PUPDR設(shè)置為上拉電阻狀態(tài)。
(4)GPIOX_OSPEED(端口輸出速度寄存器):低速 2MHz,中速 10~25MHz 高速 20~50MHz,具體的大小與對(duì)應(yīng)連接的電壓和電容相關(guān)。
(5)設(shè)置AFRL寄存器,AF0~15指GPIOX的16種模式(一般AF0~7可改,4~6僅限GPIOA,8~15保留),AFR[0]指GPIOX_AFRL寄存器,管理0~7個(gè)管腳;AFR[1]指GPIOX_AFRH寄存器,管理8~15個(gè)管腳。
(6)TIM_CCER:捕獲使能寄存器,使能輸入捕獲必須設(shè)置CC1E = 1
(7)TIM_CCR1:捕獲/比較寄存器1,用來存儲(chǔ)捕獲發(fā)生時(shí)TIMX_CNT值,通過了一次上升沿捕獲與下降沿捕獲差值可算出高電平脈沖寬度。
2、占空比的計(jì)算
占空比(Duty Cycle)是脈沖信號(hào)中高電平持續(xù)時(shí)間與整個(gè)周期時(shí)間的比率。它通常用于描述脈沖寬度調(diào)制(PWM)信號(hào),其中信號(hào)在一定頻率下在高電平和低電平之間切換。
設(shè)置寄存器ARR的值確定周期,設(shè)置CCRx值設(shè)置占空比,CNT小于CCR時(shí)輸出為高,CNT大于CCR輸出為低,占空比 = CCR/ARR = 高電平時(shí)間/周期
3、實(shí)現(xiàn)邏輯原理
(1)PWM波利用微處理器的數(shù)字輸出來控制模擬電路
(2)STM32沒有專門的PWM引腳,所以采用IO口的復(fù)用模式
(3)TIM1是STM32高級(jí)定時(shí)器,它的每個(gè)通道都有對(duì)應(yīng)的互補(bǔ)通道來互補(bǔ)輸出PWM
(4)STM32的定時(shí)器除了TIM6和TIM7,其他定時(shí)器都可用來產(chǎn)生PWM輸出。
(5)面積等效原理:只要正弦波與t坐標(biāo)軸圍起來陰影面積相同,不管哪種電壓波形效果大概相同
?
二、功能需求
開發(fā)呼吸燈功能,即LED燈一亮一滅,亮滅交替,周而復(fù)始。亮滅時(shí)長(zhǎng)約為1s。
三、設(shè)計(jì)思路
將PA5配置為TIM2的CH1輸出。采用定時(shí)器TIM2產(chǎn)生PWM波形,周期為2s且占空比為50%,即1s時(shí)長(zhǎng)的低電平、1s時(shí)長(zhǎng)的高電平。
四、軟件流程圖
五、程序設(shè)計(jì)?
1、PWM輸出端口初始化
采用PwmOutInit函數(shù)實(shí)現(xiàn)PA5復(fù)用為TIM2的CH1輸出。代碼如下:
void PwmOutInit(void)
{RCC->AHB1ENR|=1<<0; //使能GPIOAGPIOA->MODER=(GPIOA->MODER&~(0x3<<10))|(0x2<<10); //設(shè)置PA5為AF復(fù)用、推挽輸出、無上拉、無下拉、中速GPIOA->OTYPER&=~(1<<5); GPIOA->PUPDR&=~(0x3<<10);GPIOA->OSPEEDR=(GPIOA->OSPEEDR&~(0x3<<10))|(1<<10);GPIOA->AFR[0]=(GPIOA->AFR[0]&~(0xF<<20))|(1<<20); //設(shè)置AFRL寄存器,將PA5復(fù)用為TIM2的CH1輸出
}
2、定時(shí)器初始化函數(shù)
采用TimerInit函數(shù)實(shí)現(xiàn)定時(shí)器2的參數(shù)配置。
時(shí)鐘源TIMCLK的頻率為16MHz,設(shè)計(jì)預(yù)分頻系數(shù)N=2000,計(jì)數(shù)器分頻系數(shù)M=16000,那么共320萬個(gè)分頻,定時(shí)時(shí)長(zhǎng)為M*N/TIMCLK = 2s。因此預(yù)分頻寄存器PSC的值為N-1 = 1999,自動(dòng)重載寄存器ARR的值為M-1 = 15999.比較寄存器為計(jì)數(shù)器自動(dòng)重載值的一半,即8000.具體代碼如下:
void TimerInit(void)
{RCC->APB1ENR |=1<<0; //使能TIM2TIM2->CR1 =1<<7; //配置為自重載預(yù)載使能、邊沿對(duì)齊、向上計(jì)數(shù)工作模式TIM2->PSC =1999; //16MHz/2000 = 8KHzTIM2->ARR =15999; //8KHz/16000=0.5Hz,PWM周期為2sTIM2-CCMR1 = (TIM2->CCMR1&~(0x00FF))|0x68; //配置CH1為PWM1輸出模式TIM2->CCER |=1; //使能比較通道1作為輸出TIM2->CCR1 8000; //占空比50%TIM->CR1 |=1; //開啟TIM2
}
?
?