1
單脈沖輸出
定時(shí)器單脈沖輸出是比較輸出應(yīng)用中的一種模式,所謂的單脈沖就是通過(guò)配置定時(shí)器使其在一個(gè)可控延時(shí)后,產(chǎn)生一個(gè)脈寬可控的脈沖。
單脈沖模式(One Pulse Mode)下,計(jì)數(shù)器響應(yīng)一個(gè)激勵(lì),產(chǎn)生一個(gè)脈寬可調(diào)的脈沖。配置 TIMx_CR1 寄存器的OPM=1,選擇單脈沖模式,觸發(fā)信號(hào)有效沿或配置 CEN=1 都可以啟動(dòng)計(jì)數(shù)器,直到下個(gè)更新事件發(fā)生或配置 CEN=0 時(shí),計(jì)數(shù)器停止計(jì)數(shù)。
產(chǎn)生脈沖的必要條件是比較值與計(jì)數(shù)器的初始值不同,所以在計(jì)數(shù)器啟動(dòng)之前的必要配置如下:
遞增計(jì)數(shù)方式:計(jì)數(shù)器 CNT < CCRx ≤ ARR。
遞減計(jì)數(shù)方式:計(jì)數(shù)器 CNT > CCRx。
圖 1 單脈沖模式
例如,在 TI2 檢測(cè)到上升沿,延遲 tDELAY 之后,在 OC2 上產(chǎn)生一個(gè)長(zhǎng)度為 tPULSE 的正脈沖。配置 TI2FP2 作為觸發(fā)源:
1
配置 TIMx_CCMR1 寄存器中的 CC2S = 01,將 TI2FP2 映射到 TI2。
1
配置 TIMx_CCER 寄存器中的 CC2P = 0,檢測(cè) TI2FP2 的上升沿。
3
配置 TIMx_SMCR 寄存器中的 TS = 110, TI2FP2 作為從模式控制器的觸發(fā)(TRGI)。
4
配置 TIMx_SMCR 寄存器中的 SMS = 110,選擇觸發(fā)模式, TI2FP2 使能計(jì)數(shù)器工作。
OPM 的波形由 TIMx_ARR 和 TIMx_CCR1 決定(要考慮時(shí)鐘頻率和計(jì)數(shù)器預(yù)分頻器):由 TIMx_CCR1寄存器的值和 CNT 初始值決定觸發(fā)信號(hào)與單脈沖開(kāi)始之間的延遲 tDELAY, TIMx_ARR - TIMx_CCR1 的值為脈沖的寬度 tPULSE。
下面是一個(gè)產(chǎn)生負(fù)脈沖的例子,即發(fā)生比較匹配時(shí)產(chǎn)生從 1 到 0 的波形,計(jì)數(shù)器達(dá)到預(yù)裝載值時(shí)產(chǎn)生一個(gè)從 0 到 1 的波形:
1
配置 TIMx_CCMR1 寄存器 OC1M = 111,選擇 PWM 模式 2。
2
配置 TIMx_CCER 寄存器 CC1P = 1,輸出低電平有效。
1
配置 TIMx_CCMR1 中 OC1PE = 1 和 TIMx_CR1 寄存器中 ARPE=1,使能預(yù)裝載寄存器。
4
配置 TIMx_CCR1 寄存器和 TIMx_ARR 寄存器。
1
配置 TIMx_EGR 寄存器 UG=1 產(chǎn)生一個(gè)更新事件。
6
等待在 TI2 上的一個(gè)外部觸發(fā)事件。
此例中, TIMx_CR1 寄存器中的 DIR=0、 CMS=0、 OPM= 1,在下一個(gè)更新事件(當(dāng)計(jì)數(shù)器從自動(dòng)裝載值返回到 0)時(shí)停止計(jì)數(shù)。
2
實(shí)驗(yàn)
2.1 實(shí)驗(yàn)說(shuō)明
配置TIM1_CH1單脈沖輸出,TIM1_CH2輸入捕獲,TIM1從模式選擇觸發(fā)模式,TIM3_CH1輸出PWM,觸發(fā)TIM1計(jì)數(shù)器開(kāi)始計(jì)數(shù)。當(dāng)TIM1_CH2捕捉到有效信號(hào)時(shí),TIM1計(jì)數(shù)器開(kāi)始計(jì)數(shù),按照配置好的脈寬,TIM1_CH1輸出一個(gè)脈沖信號(hào)。
2.2 程序編寫
程序部分參考MM32提供的例程,相關(guān)代碼在此基礎(chǔ)上更改。
2.21 GPIO初始化
配置PA8作為TIM1_CH1、PA9作為TIM1_CH2
voidTIM1_GPIO_Init(void) { GPIO_InitTypeDefGPIO_InitStruct; RCC_GPIO_ClockCmd(GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); }
同樣的,配置PB4作為TIM3_CH1,代碼略。
2.22 TIM1初始化
程序中調(diào)用TIM1_Monopulse_Init()函數(shù)配置TIM1的自動(dòng)預(yù)裝載值為(10000-1),預(yù)分頻器的值為(SystemCoreClock / 1000000 - 1),即TIM1定時(shí)器發(fā)生更新事件的周期為10ms。
TIM1_Monopulse_Init(10000-1,SystemCoreClock/1000000-1);
在該函數(shù)中配置了TIM1_CH1輸出PWM,輸出信號(hào)極性為高電平有效,脈沖寬度為50%,使能TIM1單脈沖輸出模式。配置TIM1_CH2輸入捕獲,從模式觸發(fā)源選擇TI2FP2作為計(jì)數(shù)器的觸發(fā)輸入,在信號(hào)的上升沿啟動(dòng)。詳見(jiàn)函數(shù)定義如下:
voidTIM1_Monopulse_Init(u16arr,u16psc) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStruct; TIM_OCInitTypeDefTIM_OCInitStruct; TIM_ICInitTypeDefTIM_ICInitStruct; RCC_APB2PeriphClockCmd(RCC_APB2ENR_TIM1,ENABLE); TIM_DeInit(TIM1); TIM_TimeBaseStructInit(&TIM_TimeBaseStruct); TIM_TimeBaseStruct.TIM_Period=arr; TIM_TimeBaseStruct.TIM_Prescaler=psc; TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_RepetitionCounter=0; TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStruct); TIM_OCStructInit(&TIM_OCInitStruct); TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2; TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse=arr/2; TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Reset; TIM_OC1Init(TIM1,&TIM_OCInitStruct); TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); TIM_ICStructInit(&TIM_ICInitStruct); TIM_ICInitStruct.TIM_Channel=TIM_Channel_2; TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising; TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI; TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1; TIM_ICInitStruct.TIM_ICFilter=0x0; TIM_ICInit(TIM1,&TIM_ICInitStruct); TIM_ARRPreloadConfig(TIM1,ENABLE); TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single); TIM_SelectInputTrigger(TIM1,TIM_TS_TI2FP2); TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger); TIM_SetCounter(TIM1,0); TIM_CtrlPWMOutputs(TIM1,ENABLE); TIM_Cmd(TIM1,ENABLE); }
2.23 TIM3初始化
程序中調(diào)用TIM3_PWM_Init()函數(shù)配置TIM3的自動(dòng)預(yù)裝載值為(10000-1),預(yù)分頻器的值為(SystemCoreClock / 1000000 - 1),即TIM3定時(shí)器發(fā)生更新事件的周期為20ms。
TIM3_PWM_Init(10000-1,SystemCoreClock/1000000-1);
在該函數(shù)中配置了TIM3_CH1輸出PWM,輸出信號(hào)極性為高電平有效,脈沖寬度為25%。詳見(jiàn)函數(shù)定義如下:
voidTIM3_PWM_Init(u16arr,u16psc) { TIM_TimeBaseInitTypeDefTIM_TimeBaseStruct; TIM_OCInitTypeDefTIM_OCInitStruct; RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM3,ENABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStruct); TIM_TimeBaseStruct.TIM_Period=arr; TIM_TimeBaseStruct.TIM_Prescaler=psc; TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStruct.TIM_RepetitionCounter=0; TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct); TIM_OCStructInit(&TIM_OCInitStruct); TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2; TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse=(arr/4)*3; TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OC1Init(TIM3,&TIM_OCInitStruct); TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3,ENABLE); TIM_SetCounter(TIM3,0); TIM_Cmd(TIM3,ENABLE); }
按照上述配置,PB4(TIM3_CH1)作為PA9(TIM1_CH2)的輸入端,當(dāng)PA9捕捉到PB4輸出的PWM的上升沿時(shí),TIM1計(jì)數(shù)器啟動(dòng)計(jì)數(shù),控制延時(shí)為5ms,PA8輸出一個(gè)脈寬為5ms的脈沖。
2.3 下載驗(yàn)證
連接PA9(TIM1_CH2)和PB4(TIM3_CH1),使用邏輯分析儀連接PA8和PA9,運(yùn)行程序觀測(cè)波形如下:
其中,通道8連接PA8,通道9連接PA9:
測(cè)量?jī)啥伍g距均為5ms,運(yùn)行結(jié)果和上述配置一致。
關(guān)于靈動(dòng)
上海靈動(dòng)微電子股份有限公司成立于 2011 年,是中國(guó)本土領(lǐng)先的通用 32 位 MCU 產(chǎn)品及解決方案供應(yīng)商。公司基于 Arm Cortex-M 系列內(nèi)核開(kāi)發(fā)的 MM32 MCU 產(chǎn)品擁有 F/L/A/SPIN/W 五大系列,目前已量產(chǎn) 200多款型號(hào),累計(jì)交付超3億顆,每年都有近億臺(tái)配備了靈動(dòng) MM32MCU 的優(yōu)秀產(chǎn)品交付到客戶手中,在本土通用 32 位 MCU 公司中位居前列。
靈動(dòng)客戶涵蓋智能工業(yè)、汽車電子、通信基建、醫(yī)療健康、智慧家電、物聯(lián)網(wǎng)、個(gè)人設(shè)備、手機(jī)和電腦等應(yīng)用領(lǐng)域。靈動(dòng)是中國(guó)為數(shù)不多的同時(shí)獲得了 Arm-KEIL、IAR、SEGGER 官方支持的本土 MCU 公司,并建立了獨(dú)立、完整的通用 MCU 生態(tài)體系。靈動(dòng)始終秉承著“誠(chéng)信、承諾、創(chuàng)新、合作”的精神,為客戶提供從硬件芯片到軟件算法、從參考方案到系統(tǒng)設(shè)計(jì)的全方位支持。
-
mcu
+關(guān)注
關(guān)注
146文章
17877瀏覽量
361374 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3289瀏覽量
117398 -
單脈沖
+關(guān)注
關(guān)注
0文章
28瀏覽量
12871 -
靈動(dòng)微電子
+關(guān)注
關(guān)注
7文章
128瀏覽量
19996 -
靈動(dòng)微
+關(guān)注
關(guān)注
4文章
176瀏覽量
22933 -
MM32
+關(guān)注
關(guān)注
1文章
108瀏覽量
1045
原文標(biāo)題:靈動(dòng)微課堂 (第238講)|MM32F5270定時(shí)器單脈沖輸出
文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于MM32F5270開(kāi)發(fā)板獲取雨滴傳感器的數(shù)據(jù)相關(guān)資料介紹
介紹幾種MM32F5270定時(shí)器常用的精準(zhǔn)輸出脈沖數(shù)量的方法
MM32F5270總線架構(gòu)設(shè)計(jì)

基于MM32F5270控制器的I2S音頻播放
【MM32F5270】Keil開(kāi)發(fā)環(huán)境搭建

評(píng)論