国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

GD32F303固件庫開發(fā)(13)----定時器TIM捕獲PWM測量頻率與占空比

發(fā)布者:JoyousJourney最新更新時間:2024-11-18 來源: elecfans關鍵字:GD32F303  固件庫開發(fā)  定時器  TIM  捕獲PWM  測量頻率  占空比 手機看文章 掃描二維碼
隨時隨地手機看文章

概述

本章配置GD32F303輸出PWM,同時使用TIM測量PWM頻率和正占空比。 查閱手冊可以得知,PB11為定時器1的通道3,讓其輸出PWM,PA6為定時器2的通道0,讓作為TIM定時器輸入。 需要GD樣片的可以加群申請:615061293 。

在這里插入圖片描述

在這里插入圖片描述

生成例程

這里準備了自己繪制的開發(fā)板進行驗證。

管腳圖如下所示。

在這里插入圖片描述

在這里插入圖片描述

keil配置

microlib 進行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫少,并且根本不具備某些 ISO C 特性。 某些庫函數(shù)的運行速度也比較慢,如果要使用printf(),必須開啟。

在這里插入圖片描述

使能串口

/* 使能GPI0A,用PA9、PA10為串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的時鐘 */

    rcu_periph_clock_enable(RCU_USART0);


    /*配置USARTx_Tx(PA9)為復用推挽輸出*/

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /*配置USARTx_RxPA9)為浮空輸入 */

    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);


    /* USART 配置 */

    usart_deinit(USART0);//重置串口0

    usart_baudrate_set(USART0, 115200U);//設置串口0的波特率為115200

    usart_word_length_set(USART0, USART_WL_8BIT);          // 幀數(shù)據(jù)字長

        usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 無奇偶校驗位

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能發(fā)送器

    usart_enable(USART0);//使能USART

串口重定向

/* retarget the C library printf function to the USART */

int fputc(int ch, FILE *f)

{

    usart_data_transmit(USART0, (uint8_t)ch);

    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));

    return ch;

}

串口重定向后就可以使用printf進行打印。


占空比與頻率計

占空比=(t1-t0)/(t2-t0) 頻率=(t2-t0)/時鐘頻率= =(t2-t0)/(120M/(psc+1))

在這里插入圖片描述

周期需要2個上升沿去判斷,設定第一個上升沿time_flag由0->1,下降沿time_dowm_flag由0->1,此時就知道正占空比時間,當在產(chǎn)生上升沿時候,就可以計算出周期使用的時間。

在這里插入圖片描述


GPIO初始化

/*!

    rief      configure the GPIO ports

    param[in]  none

    param[out] none

    

etval     none

*/

void gpio_configuration(void)

{

        rcu_periph_clock_enable(RCU_GPIOB);

    rcu_periph_clock_enable(RCU_GPIOA);

    rcu_periph_clock_enable(RCU_AF);


    /*configure PA6 (TIMER2 CH0) as alternate function*/

    gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_6);

        //TIMER1-CH3

        gpio_pin_remap_config(GPIO_TIMER1_PARTIAL_REMAP1, ENABLE);

        gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_11);        

}

開啟中斷

/*!

    rief      configure the nested vectored interrupt controller

    param[in]  none

    param[out] none

    

etval     none

*/

void nvic_configuration(void)

{

    nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);

    nvic_irq_enable(TIMER2_IRQn, 1, 1);

}

TIM1輸出PWM初始化


PWM頻率計算如下所示。

在這里插入圖片描述


void timer1_config(void)

{

    /* -----------------------------------------------------------------------

    TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles:

    TIMER1CLK = SystemCoreClock / 120 = 1MHz


    TIMER1 channel0 duty cycle = (4000/ 16000)* 100  = 25%

    TIMER1 channel1 duty cycle = (8000/ 16000)* 100  = 50%

    TIMER1 channel2 duty cycle = (12000/ 16000)* 100 = 75%

    ----------------------------------------------------------------------- */

    timer_oc_parameter_struct timer_ocintpara;

    timer_parameter_struct timer_initpara;


    rcu_periph_clock_enable(RCU_TIMER1);


    timer_deinit(TIMER1);


    /* TIMER1 configuration */

    timer_initpara.prescaler         = 119;

    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;

    timer_initpara.counterdirection  = TIMER_COUNTER_UP;

    timer_initpara.period            = 1000;

    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;

    timer_initpara.repetitioncounter = 0;

    timer_init(TIMER1,&timer_initpara);


    /* CH0,CH1 and CH2 configuration in PWM mode */

    timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;

    timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;

    timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;

    timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;

    timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;

    timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;

    timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocintpara);


    /* CH3 configuration in PWM mode0,duty cycle 50% */

    timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,500);

    timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0);

    timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE);


    /* auto-reload preload enable */

    timer_auto_reload_shadow_enable(TIMER1);

    /* auto-reload preload enable */

    timer_enable(TIMER1);

}

TIM2輸入捕獲設置

void timer2_config(void)

{

    /* TIMER2 configuration: input capture mode -------------------

    the external signal is connected to TIMER2 CH0 pin (PB4)

    the rising edge is used as active edge

    the TIMER2 CH0CV is used to compute the frequency value

    ------------------------------------------------------------ */

    timer_ic_parameter_struct timer_icinitpara;

    timer_parameter_struct timer_initpara;

        //開啟定時器時鐘

    rcu_periph_clock_enable(RCU_TIMER2);


    timer_deinit(TIMER2);


    /* TIMER2 configuration */

    timer_initpara.prescaler         = 120-1;//定時器的時鐘頻率是120MHz,預分頻120-1

    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;//對齊模式

    timer_initpara.counterdirection  = TIMER_COUNTER_UP;//向上計數(shù)

    timer_initpara.period            = 65535;//重載值

    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;//不分頻

    timer_initpara.repetitioncounter = 0;//重復計數(shù)

    timer_init(TIMER2,&timer_initpara);


    /* TIMER2  configuration */

    /* TIMER2 CH0 input capture configuration */

    timer_icinitpara.icpolarity  = TIMER_IC_POLARITY_RISING;//捕獲極性,上升沿捕獲

    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;//通道輸入模式選擇

    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;//分頻

    timer_icinitpara.icfilter    = 0x0;//濾波

    timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);


    /* auto-reload preload enable */

    timer_auto_reload_shadow_enable(TIMER2);//自動重載使能

    /* clear channel 0 interrupt bit */

    timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0);//CH0 通道中斷清除

    /* channel 0 interrupt enable */

    timer_interrupt_enable(TIMER2,TIMER_INT_CH0);//CH0 通道中斷使能


    /* TIMER2 counter enable */

    timer_enable(TIMER2);

}

中斷

#define IR_IN1  gpio_input_bit_get (GPIOA, GPIO_PIN_6)

uint8_t time_up_flag=0;//上升沿標志位

uint8_t time_dowm_flag=0;//下降沿標志位


uint32_t time_up_num=0;//上升沿計數(shù)

uint32_t time_dowm_num=0;//下降沿計數(shù)

float time_frequency;//頻率

float time_duty;//占空比



void TIMER2_IRQHandler(void)

{

            timer_ic_parameter_struct timer_icinitpara;

    timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;

    timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;

    timer_icinitpara.icfilter    = 0x0;        

 if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH0)){

        /* clear channel 0 interrupt bit */

        timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0);        


        if(IR_IN1&&time_up_flag==0)//第一次上升

        {

            time_up_flag=1;

            timer_icinitpara.icpolarity = TIMER_IC_POLARITY_FALLING;  //設置為下降沿

            timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);    

            timer_counter_value_config(TIMER2 , 0); // 計數(shù)清零,從頭開始計


        }

        else if(IR_IN1==0&&time_dowm_flag==0)//下降

        {


            time_dowm_num = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0)+1; // 讀取捕獲計數(shù),這個時間即為上升沿持續(xù)的時間

            timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;  //設置為上升沿

            timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);    

            time_dowm_flag=1;

        }        

        else if(IR_IN1&&time_dowm_flag==1)//第二次之后上升

        {        

            time_up_num = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_0)+1;; // 讀取捕獲計數(shù),這個時間即為上升沿持續(xù)的時間

                timer_icinitpara.icpolarity = TIMER_IC_POLARITY_FALLING;  //設置為下降沿

                timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);

            time_dowm_flag=0;

            timer_counter_value_config(TIMER2 , 0); // 計數(shù)清零,從頭開始計

[1] [2]
關鍵字:GD32F303  固件庫開發(fā)  定時器  TIM  捕獲PWM  測量頻率  占空比 引用地址:GD32F303固件庫開發(fā)(13)----定時器TIM捕獲PWM測量頻率與占空比

上一篇:關于GD32F350R8的家庭環(huán)境智能控制系統(tǒng)的介紹和應用
下一篇:【GD32F303紅楓派開發(fā)板使用手冊】第二十講 SPI-SPI NAND FLASH讀寫實驗

推薦閱讀最新更新時間:2025-07-01 09:08

stm32定時器輸入捕獲pwm
花了兩天時間終于把stm32f103的定時器輸入捕獲弄懂了,這里以TIM3的通道ch1為例,要實現(xiàn)輸入捕獲需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.這里抓取了一些收據(jù)手冊中寄存器描述的圖 下面一一介紹: TIMx_ARR寄存器為自動重裝載的值 TIMx_CR1這里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置對應通道映射到那個IC,TI。 這里我們是第一通道故只需配置低8位,cc1s為配置ch1映射到那個TI,IC1PSC為配置是否分頻,1c1f為配置是否濾波。 TIMx_psc寄存器 T
[單片機]
STM32F103ZET定時器TIM1輸出六路帶死區(qū)互補PWM波形
使用默認引腳輸出6路PWM,#define FullRemap_TIM1則重映射 PIN腳; 遺留問題:調(diào)用TIM_CCxNCmd(TIM1, TIM_Channel_X, TIM_CCx_Enable);導致互補PWM無輸出。 TIM_CCxCmd(TIM1, TIM_Channel_X, TIM_CCx);確可以正常開關PWM輸出; 遇到問題:PA8、10、PB13、14、15均有輸出,PA9無輸出; 問題解決:雖然沒初始化UART1模塊,但打開RCC_APB2Periph_USART1時鐘導致; void Timer1_Init(void) { TIM_OCInitTypeDef TIM_OCIni
[單片機]
STM32通用定時器TIM2-5)基本用法
STM32的定時器是個強大的模塊,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做PWM輸出或者輸入捕獲功能。從系統(tǒng)框架圖下看,名為TIMx的有八個,其中TIM1和TIM8掛在APB2總線上,而TIM2-TIM7則掛在APB1總線上。其中TIM1&TIM8稱為高級控制定時器(advanced control timer).他們所在的APB2總線也比APB1總線要好。APB2可以工作在72MHz下,而APB1最大是36MHz。 由上圖可知,當APB1 的預分頻系數(shù)為1 時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1 的頻率;當APB1的預分頻系數(shù)為其它數(shù)值(即預分頻系數(shù)為2、4、8 或16)時,這個
[單片機]
STM32通用<font color='red'>定時器</font>(<font color='red'>TIM</font>2-5)基本用法
GD32F303紅楓派開發(fā)板使用手冊】第十三講 ADC-內(nèi)部溫度傳感器和參考電壓采樣實驗
13.1實驗內(nèi)容 本實驗是通過ADC注入組采樣內(nèi)部溫度傳感器和參考電壓,通過本實驗主要學習以下內(nèi)容: 內(nèi)部溫度傳感器和參考電壓簡介 ADC注入組采樣配合ADC中斷應用 13.2實驗原理 13.2.1內(nèi)部溫度傳感器和參考電壓簡介 GD32F303有兩個內(nèi)部通道,分別為內(nèi)部溫度傳感器(ADC0_CH16)和內(nèi)部參考電壓Vrefint(ADC0_CH17)。 溫度傳感器可以用來測量器件周圍的溫度。溫度傳感器的輸出電壓隨溫度線性變化,由于生產(chǎn)過程的多樣化,溫度變化曲線的偏移在不同的芯片上會有不同(最多相差45°C)。內(nèi)部溫度傳感器更適合于檢測溫度的變化,而不是測量絕對溫度。如果需要測量精確的溫度,應該使用一個外置的溫度傳感器來校準這
[單片機]
【<font color='red'>GD32F303</font>紅楓派<font color='red'>開發(fā)</font>板使用手冊】第十三講 ADC-內(nèi)部溫度傳感器和參考電壓采樣實驗
GD32F303紅楓派開發(fā)板使用手冊】第六講 PMU-低功耗實驗講
6.1實驗內(nèi)容 通過本實驗主要學習以下內(nèi)容: PMU原理; 低功耗的進入以及退出操作; 6.2實驗原理 6.2.1PMU結(jié)構(gòu)原理 PMU即電源管理單元,其內(nèi)部結(jié)構(gòu)下圖所示,由該圖可知,GD32F303系列MCU具有三個電源域,包括VDD/VDDA電源域、1.2V電源域以及電池備份域,其中,VDD /VDDA域由電源直接供電。在VDD/VDDA域中嵌入了一個LDO,用來為1.2V域供電。在備份域中有一個電源切換器,當VDD/VDDA電源關閉時,電源切換器可以將備份域的電源切換到VBAT引腳,此時備份域由VBAT引腳(電池)供電。 VDD/VDDA電源域 VDD 域為數(shù)字電源域包括HXTAL(高速外部晶體振蕩器)、LDO
[單片機]
【<font color='red'>GD32F303</font>紅楓派<font color='red'>開發(fā)</font>板使用手冊】第六講 PMU-低功耗實驗講
STM32CUBEMX開發(fā)GD32F303(4)----GPIO輸出模式
概述 以STM32CUBEMX創(chuàng)建STM32F103工程,同時移植在GD32F303中,同時通過GD32303C_START開發(fā)板內(nèi)進行驗證。 需要樣片的可以加Qun申請:615061293。 硬件準備 這里準備了2塊開發(fā)板進行驗證,分別是GD32303C_START開發(fā)板。 開發(fā)板管腳配置 在GD32303C_START中的LED管腳配置如下所示。 不同速率對應的波形 以PC3為例,在推挽輸出無上下拉情況下,輸出速率主要有4種,一般的低端MCU只有3種,沒有Very High。 下面是ST的配置圖。 在固件庫中,定義如下所示。 LOW速率 Medium速率 High速率 Very High速率 可以看
[單片機]
STM32CUBEMX<font color='red'>開發(fā)</font><font color='red'>GD32F303</font>(4)----GPIO輸出模式
基于FPGA的多通道頻率測量系統(tǒng)設計
設計了一種多通道頻率測量系統(tǒng)。系統(tǒng)由模擬開關、信號調(diào)理電路、FPGA、總線驅(qū)動電路構(gòu)成,實現(xiàn)對頻率信號的分壓、放大、濾波、比較、測量,具備回路自測試功能,可與主設備進行數(shù)據(jù)交互,具有精度高、可擴展、易維護的特點,有一定的工程應用價值。 頻率測量電路是很多檢測與控制系統(tǒng)的重要組成部分,在航空機載計算機領域具有廣泛的應用環(huán)境。隨著檢測與控制系統(tǒng)復雜程度的提高,頻率測量電路也被提出了新的要求,例如多通道實時采集、高精度測量等。FPGA的特點是完全由用戶通過軟件進行配置和編程,從而完成某種特定的功能,且可以反復擦寫,因此,以FPGA為核心進行電路搭建已成為當前數(shù)字系統(tǒng)設計的主流方法。本文利用FPGA設計了一種多通道頻率測量系統(tǒng),易于擴展,
[測試測量]
基于FPGA的多通道<font color='red'>頻率</font><font color='red'>測量</font>系統(tǒng)設計
高準確性的頻率測量系統(tǒng)
1? 引言 ??? 頻率是電力電子系統(tǒng)中1個基本的物理量,其測量問題在工程應用中非常重要。通常的測量方案是選用單片機或可編程邏輯器件。然而,在某些特殊場合,工作環(huán)境惡劣,要求測量精度高、可靠性強,使用常規(guī)的方案難以達到要求,或成本過高。本文提出了一種基于PC104測控計算機的頻率測量系統(tǒng),依據(jù)初步測試得到的待測頻率大小選用不同的基準頻率,測量精度達到0.2%,且實現(xiàn)了同時測量多路信號的頻率。 2? 總體設計????? ??? 交變信號的頻率是指單位時間內(nèi)信號周期性變化的次數(shù),即發(fā)fx =N/t,可見測量fx須將N或t作為基準,對另一個量進行測量 ?;镜臏y量頻率方法有兩種:一種是測頻法,由測量電路給出標準閘門信號t =Tr,
[電源管理]
高準確性的<font color='red'>頻率</font><font color='red'>測量</font>系統(tǒng)
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved