找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 3262|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

利用STM32 TIM2_CH2進(jìn)行PWM輸入捕獲時(shí),不斷進(jìn)入TIM2_IRQHandler中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:396694 發(fā)表于 2019-10-16 09:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
利用TIM2_CH2(端口PA1,stm32f407開(kāi)發(fā)板)進(jìn)行PWM輸入捕獲時(shí),不斷進(jìn)入TIM2_IRQHandler中斷,請(qǐng)各位專家?guī)兔Ψ治龇治?/font>
1、TIM2_CH2的有個(gè)設(shè)置如下:

void TIM2_Configuration(void)
{
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //TIM2時(shí)鐘使能   
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);  //使能PORTA時(shí)鐘  

GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2); //PA1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //復(fù)用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽復(fù)用輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//GPIO_PuPd_UP;        //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1

TIM_TimeBaseStruct.TIM_Period=0xFFFFFFFF;
TIM_TimeBaseStruct.TIM_Prescaler=0;
TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);

TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;//選擇TIM2_CH2,選擇輸入端IC2映射到TI2上
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//上升沿捕獲
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI2上(TIM2映射至IC2--tuhongmao)
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//在捕獲輸入上每探測(cè)到一個(gè)邊沿就執(zhí)行一次捕獲
TIM_ICInitStructure.TIM_ICFilter=0;//濾波設(shè)置,經(jīng)歷幾個(gè)周期跳變認(rèn)定波形穩(wěn)定
//(采樣高電平,只有連續(xù)采集到N個(gè)電平是高電平才認(rèn)為是有效的,否則低于N個(gè)時(shí)認(rèn)為是無(wú)效的N取0x0-0xF)
TIM_PWMIConfig(TIM2,&TIM_ICInitStructure);//以上是輸入捕獲設(shè)置
TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);//選擇濾波后的TI2FP2輸入作為觸發(fā)源,觸發(fā)下面程序的復(fù)位
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//從模式控制器被設(shè)置為復(fù)位模式-選中的觸發(fā)信號(hào)上升沿重新
//初始化計(jì)數(shù)器并產(chǎn)生一個(gè)更新信號(hào)(上升沿一到,TIM2->CNT被清零,每次上升沿來(lái)到,CNT都會(huì)被清零)
//從控制器默認(rèn)的通道是否為TIM2_CH1   tuhongmao 20191015
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//啟動(dòng)定時(shí)器的被動(dòng)觸發(fā)
TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//捕獲中斷打開(kāi)
TIM_ClearFlag(TIM2,TIM_IT_CC2);//清除標(biāo)志位
TIM_Cmd(TIM2,ENABLE);//使能定時(shí)器2
}


2、中斷設(shè)置與處理函數(shù)如下:
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

//中斷處理程序
void TIM2_IRQHandler(void)
{
static u16 count=0;
if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!= RESET)
{
  float IC2Value=0;
  float DutyCycle=0;
  float Frequency=0;
  float pulse=0;
  TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
  IC2Value=(float)TIM_GetCapture2(TIM2);//獲取CCR2的值
  pulse=(float)TIM_GetCapture1(TIM2);//獲得CCR1的值
  if(IC2Value !=0)
  {
   DutyCycle=pulse/IC2Value;
   Frequency=(float)84000000/IC2Value;
   duty=(u32)(DutyCycle*(u32)100);
   freq=Frequency/((float)1000);
   count++;
   if(count>=10000)
   {
    count=0;
    printf("IC2Value is %f \r\n",IC2Value);
    printf("pulse is %f \r\n",pulse);
   }
  }
  else
  {
   duty=0;
   freq=0;
  }

}
}

3、主程序Main.c如下:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2
delay_init(168);  //初始化延時(shí)函數(shù)
uart_init(115200);//初始化串口波特率為115200
TIM2_Configuration();
NVIC_Configuration();
while(1)
{
}
}
4、串口打印結(jié)果如下:
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 0.000000
IC2Value is 2.000000
pulse is 0.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
pulse is 1.000000
IC2Value is 2.000000
...

(每進(jìn)入10000次中斷,再串口打印消息)

其他未做任何設(shè)置,端口也沒(méi)有輸入PWM信號(hào),但是不斷進(jìn)入
TIM2_IRQHandler中斷,請(qǐng)幫忙分析分析。



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表