STM32輸出可調相位的1PPS

2021-10-08 06:14:11 字數 2303 閱讀 3943

在做晶振守時等專案時經常需要生成乙個可調相位的1pps,我最近就遇到了這樣的問題。利用stm32的定時器定時1s,然後在tim_it_update中斷時輸出1pps上公升沿理論是可以的,但是移動相位很不方便,修改定時器的計數值是乙個方法,但是這會引入很大的系統誤差。

利用stm32定時器的輸出比較模式輸出1pps並達到相位可調的目的是我目前想到的最好的方法,其實這種機制的原理很簡單。stm32的定時器的眾多暫存器中有幾個是我們經常要使用到的,它們分別是:

預分頻暫存器:配置它會將定時器的輸入主頻進行分頻。假設我的系統主頻是100m,我定時器的參考頻率是apb1也就是50m,如果我給預分頻暫存器中寫入4,則將定時器的頻率分為10m。

預裝載暫存器:這個暫存器在計數暫存器溢位是會將該暫存器的值裝入計數暫存器。

計數暫存器:按照上面預分頻的例子值,該暫存器每100ns暫存器值會加一直到到達預裝載值然後產生溢位中斷。

ccrx:當配置為比較輸出時,ccrx暫存器中的值與計數暫存器中的值相等時會觸發tim_it_ccrx中斷。

gpio_inittypedef gpio_initstructure;

tim_timebaseinittypedef tim_timebasestructure;

tim_ocinittypedef tim_ocinitstructure;

nvic_inittypedef nvic_initstructure;

/*設定中斷*/

nvic_initstructure.nvic_irqchannel = tim3_irqn;

nvic_initstructure.nvic_irqchannelpreemptionpriority =

1;

nvic_initstructure.nvic_irqchannelsubpriority =

1;

nvic_initstructure.nvic_irqchannelcmd = enable;

nvic_init

(&nvic_initstructure)

;/*時鐘*/

rcc_apb1periphclockcmd

(rcc_apb1periph_tim3, enable)

;//初始化tim3

tim_timebasestructure.tim_period =

1000000-1

;//設定在下乙個更新事件裝入活動的自動重裝載暫存器週期的值

tim_timebasestructure.tim_prescaler =72-

1;//72分頻,tim3 = 1mhz

tim_timebasestructure.tim_clockdivision = tim_ckd_div1;

//1分頻

tim_timebasestructure.tim_countermode = tim_countermode_up;

//向上計數模式

tim_timebaseinit

(tim3,

&tim_timebasestructure)

;//初始化tim3 channel2 pwm模式

tim_ocinitstructure.tim_ocmode = tim_ocmode_toggle;

tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;

//比較輸出使能

tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;

tim_ocinitstructure.tim_pulse =

1000000/2

;//tim3->ccr1初始值為500000

tim_oc1init

(tim3,

&tim_ocinitstructure)

;//根據t指定的引數初始化外設tim4 oc1

tim_itconfig

(tim3, tim_it_cc1,enable)

;tim_setcounter

(tim3,0)

;

上面的配置為定時器的計數暫存器計數值從0計數到999999,由於時鐘頻率恰好時1m,所以恰好是每1s計數值清一次零。我們設定在計數到5000000時產生比較輸出中斷。這樣迴圈往復就產生了乙個1pps。我們可以通過調節tim3->ccr1中的值來調節1pps的相位,調節步長為1us。

void

tim3_irqhandler

(void

)//tim3中斷

}

STM32的PWM輸出實驗

通過設定該暫存器 ccrx 來調整pwm輸出的占空比,如下圖所示 以通道1為例說明pwm的工作過程 首先通過設定ccr1 捕獲比較 值 暫存器 設定設定比較值。然後通過設定ccmr1 oc1m 2 0 位以及ccer cc1p位 輸入 捕獲1輸出極性 來設定高低電平的輸出模式,具體如圖所示 最後設定...

stm32定時器輸出4路頻率可調的原理分析

1標題說不清楚,簡單點說就是乙個定時器輸出4路可調節頻率的pwm。2這個功能能幹嘛?一般是用於控制多個步進電機。這樣做乙個定時器就可以控制4個電機了。先上 吧 u16 capture 0 vu16 ccr1 val 32768 vu16 ccr2 val 16384 vu16 ccr3 val 81...

STM32的中斷處理1

1 msp和psp 1 control暫存器 2 復位後預設使用msp。3 中斷為處理模式 handle 永遠是特權級 非中斷即為執行緒模式,可在中斷中指定 control 0 為特權級或使用者級。4 處理模式始終使用msp 執行緒模式可選使用psp或msp 有os時,一般使用psp 由exc re...