久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8565|回復: 0
打印 上一主題 下一主題
收起左側(cè)

關(guān)于Stm32f1的輸入捕捉模式和PWM輸入模式

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:113276 發(fā)表于 2016-4-10 14:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
         輸入捕捉模式和PWM輸入模式的區(qū)別
       Stm32的通用定時器具備基本的輸入捕捉功能。所謂輸入捕捉功能,是指通用定時器可以通過檢測輸入信號的跳變沿,檢測到跳變沿的同時將計數(shù)器的當前值寫入相應(yīng)的寄存器。我們可以利用定制器的輸入捕捉模式可以測量輸入信號的高電平時間、占空比和頻率。

1、輸入捕捉模式
      Stm32的通用TIM2、3、4、5 都具有輸入捕捉的功能,每個定時器具有四個通道,并且每一個通道都可以單獨配置為輸入捕捉模式,主要用于測量輸入信號的高電平時間,也可測量信號的頻率(可能不太精確,尤其對于頻率很高的信號),如果用于測量信號的高電平時間,配置時需要注意定時器的時基頻率,下面的程序中有所說明。
     下面是具體的程序,配置TIM2的四個通道為基本輸入捕捉模式,定時器的時基頻率為1M,用于測量輸入信號的高電平時間。

void TIM_Configuration(void)
{

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period =0xFFFF;   
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision =0;
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2 ,&TIM_TimeBaseStructure);
TIM_PrescalerConfig(TIM2 , 71 ,TIM_PSCReloadMode_Immediate);   //即Ft=72M/72=1M

TIM2->CCMR1 &=(u16)0x0000;   //清零
TIM2->CCMR1 |=(u16)0x0101;   //TIM輸入2與IC2相連1與IC1相連
TIM2->CCMR2 &=(u16)0x0000;   //清零
TIM2->CCMR2 |=(u16)0x0101;   //TIM輸入3與IC3相連 4與IC4相連
TIM2->CCER = (u16)0x1111;   //上升沿捕捉 捕捉使能
   

//開啟 CC中斷
//使能 Time
TIM2->DIER =(u16)0x001E;    //TIM_IT_CC1 TIM_IT_CC2 TIM_IT_CC3 TIM_IT_CC4
//TIM2->DIER = (u16)0x0002;
TIM2->CR1  =((u16)0x0001);             //CR1_CEN_Set
u16 IC_Dat[9] = {0,0,0,0,0,0,0,0,0};
u16 CaptureNumber1 = 0,CaptureNumber2 = 0,CaptureNumber3 =0,CaptureNumber4 = 0;
vu32 Capture1 = 0,Capture2 = 0,Capture3 = 0,Capture4 = 0;

void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET) //判斷CH1是否出現(xiàn)跳變沿
  {
   if(CaptureNumber1 ==0)         //出現(xiàn)上升沿
    {
     IC_Dat[1] =TIM_GetCapture1(TIM2);    //得到CH1捕捉值1
     CaptureNumber1 = 1;
   TIM2->CCER &=(u16)0xFFFD;      //改變跳變沿
     TIM2->CCER |= (u16)0x0002;
    }
    elseif(CaptureNumber1 ==1)      //出現(xiàn)下降沿
    {
     IC_Dat[2] = TIM_GetCapture1(TIM2);  //得到CH1捕捉值2
   TIM2->CCER &=(u16)0xFFFD;      //改變跳變沿
     TIM2->CCER |= (u16)0x0000;
     if (IC_Dat[2] > IC_Dat[1])
     {
       Capture1 = (IC_Dat[2] - IC_Dat[1]);
     }
     else
     {
       Capture1 = ((0xFFFF - IC_Dat[1]) + IC_Dat[2]);
     }
     CaptureNumber1 = 0;
   //printf("\r\n TheIC12  of input pulse is %d \r\n" ,IC_Dat[2]);
   //printf("\r\n TheIC11  of input pulse is %d \r\n" ,IC_Dat[1]);
   printf("\r\n TheCapture1  of input pulse is %d \r\n" ,Capture1);
    }
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
  }
  else if(TIM_GetITStatus(TIM2, TIM_IT_CC2) ==SET)  //判斷CH2是否出現(xiàn)跳變沿
  {
   if(CaptureNumber2 ==0)             //出現(xiàn)上升沿
    {
     IC_Dat[3] =TIM_GetCapture2(TIM2);            //得到CH2捕捉值1
     CaptureNumber2 = 1;
   TIM2->CCER &=(u16)0xFFDF;      //改變跳變沿
     TIM2->CCER |= (u16)0x0020;
    }
    elseif(CaptureNumber2 ==1)      //出現(xiàn)下降沿
    {
     IC_Dat[4] = TIM_GetCapture2(TIM2);         //得到CH2捕捉值2
   TIM2->CCER &=(u16)0xFFDF;      //改變跳變沿
     TIM2->CCER |= (u16)0x0000;
     if (IC_Dat[4] > IC_Dat[3])
     {
       Capture2 = (IC_Dat[4] - IC_Dat[3]);
     }
     else
     {
       Capture2 = ((0xFFFF - IC_Dat[3]) + IC_Dat[4]);
     }
     CaptureNumber2 = 0;
   //printf("\r\n TheIC22  of input pulse is %d \r\n" ,IC_Dat[4]);
  // printf("\r\n The IC21  ofinput pulse is %d \r\n" , IC_Dat[3]);
   printf("\r\n TheCapture2  of input pulse is %d \r\n" ,Capture2);
    }
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
  }
  else if(TIM_GetITStatus(TIM2, TIM_IT_CC3) ==SET)  //判斷CH3是否出現(xiàn)跳變沿
  {
   if(CaptureNumber3 ==0)             //出現(xiàn)上升沿
    {
     IC_Dat[5] =TIM_GetCapture3(TIM2);            //得到CH3捕捉值1
     CaptureNumber3 = 1;
   TIM2->CCER &=(u16)0xFDFF;      //改變跳變沿
     TIM2->CCER |= (u16)0x0200;
    }
    elseif(CaptureNumber3 ==1)      //出現(xiàn)下降沿
    {
     IC_Dat[6] = TIM_GetCapture3(TIM2);         //得到CH3捕捉值2
   TIM2->CCER &=(u16)0xFDFF;      //改變跳變沿
     TIM2->CCER |= (u16)0x0000;
     if (IC_Dat[6] > IC_Dat[5])
     {
       Capture3 = (IC_Dat[6] - IC_Dat[5]);
     }
     else
     {
       Capture3 = ((0xFFFF - IC_Dat[5]) + IC_Dat[6]);
     }
           CaptureNumber3 = 0;
   //printf("\r\n TheIC32  of input pulse is %d \r\n" ,IC_Dat[6]);
   //printf("\r\n TheIC31  of input pulse is %d \r\n" ,IC_Dat[5]);
   printf("\r\n TheCapture3  of input pulse is %d \r\n" ,Capture3);
    }
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
  }
  else if(TIM_GetITStatus(TIM2, TIM_IT_CC4) ==SET)  //判斷CH3是否出現(xiàn)跳變沿
  {
   if(CaptureNumber4 ==0)             //出現(xiàn)上升沿
    {
     IC_Dat[7] =TIM_GetCapture4(TIM2);            //得到CH3捕捉值1
     CaptureNumber4 = 1;
   TIM2->CCER &=(u16)0xDFFF;      //改變跳變沿
     TIM2->CCER |= (u16)0x2000;
    }
    elseif(CaptureNumber4 ==1)      //出現(xiàn)下降沿
    {
     IC_Dat[8] = TIM_GetCapture4(TIM2);         //得到CH3捕捉值2
   TIM2->CCER &=(u16)0xDFFF;      //改變跳變沿
     TIM2->CCER |= (u16)0x0000;
     if (IC_Dat[8] > IC_Dat[7])
     {
       Capture4 = (IC_Dat[8] - IC_Dat[7]);
     }
     else
     {
       Capture4 = ((0xFFFF - IC_Dat[7]) + IC_Dat[8]);
     }
         CaptureNumber4 = 0;
  // printf("\r\n The IC42  ofinput pulse is %d \r\n" , IC_Dat[8]);
  // printf("\r\n The IC41  ofinput pulse is %d \r\n" , IC_Dat[6]);
   printf("\r\n TheCapture4  of input pulse is %d \r\n" ,Capture4);
    }
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
  }
}
  需要注意的問題
定時器的時基頻率不能太高,如果定時器工作于36M,采集50Hz的信號就會出現(xiàn)偏差(實測),所以程序中將定時器的時基頻率配置為了1M;
如果存在兩個以上中斷,需要設(shè)置中斷優(yōu)先級,否則容易出問題。
            
2、PWM輸入模式
       PWM輸入模式是輸入捕捉模式的高級應(yīng)用,對于測量頻率較高的輸入信號的頻率特別精確,當然,為了實現(xiàn)這個模式,也得做出一點犧牲。相比于基本輸入捕捉功能的實現(xiàn)來說,PWM輸入模式中,一路輸入信號同時映射到兩個引腳,而且只有第一和第二通道可以配置為這種模式,換句話說,每個通用定時器只能測量一路輸入信號,具體配置過程,詳見程序說明。
     下面是TIM2的第二通道工作于PWM輸入捕捉模式時的模塊配置程序:
void TIM_Configuration(void)
{

TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;


TIM_ICInitStructure.TIM_Channel =TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter =0x00;
TIM_PWMIConfig(TIM2,&TIM_ICInitStructure);


TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2);

TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);

TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
TIM_Cmd(TIM2, ENABLE);

voidTIM2_IRQHandler(void)
{

static float IC2Value =0;   
static float DutyCycle =0;   
static float Frequency =0;   
static float Paulse = 0;


IC2Value = TIM_GetCapture2(TIM2);

Paulse = TIM_GetCapture1(TIM2);

DutyCycle = Paulse /IC2Value;  

Frequency = 72000000 / IC2Value;

printf("\r\n The DutyCycle  ofinput pulse is %%%d \r\n" , (u32)(DutyCycle * 100));
printf("\r\n The Frequency  ofinput pulse is %.2fKHz\r\n" , (Frequency / 1000));

TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
}
      關(guān)于PWM輸入模式工作過程的詳細說明:(打字麻煩,所以直接截圖過來)
   


               

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久九九九九九九 | 亚洲综合婷婷 | 日韩精品在线观看视频 | 日韩有码一区 | 国产成人一区二区三区 | 亚洲国产精品一区 | 免费成人在线网 | 国产二区在线播放 | 精品乱码一区二区 | 日韩精品一区二区三区老鸭窝 | 综合色婷婷 | 久久久久久成人 | 午夜精品久久久久久久星辰影院 | 国产一区二区在线免费观看 | 久久精品视频91 | 日本在线一二 | 色播99| 欧美另类视频 | 人人草人人干 | 在线欧美视频 | 国产精品乱码一区二区三区 | av毛片在线播放 | 国内精品免费久久久久软件老师 | 中国一级特黄真人毛片免费观看 | 久久久久久久一区二区 | 日韩伦理一区二区 | 日韩精品一区二区三区中文在线 | 国产成人99久久亚洲综合精品 | 国产欧美日韩一区二区三区在线观看 | 在线不卡视频 | 亚洲夜射 | a免费视频| 五月激情婷婷六月 | av网站免费在线观看 | 手机在线观看av | 久久久久久一区 | 日本不卡一区二区三区 | 国产精品综合色区在线观看 | 99精品国产一区二区三区 | 精品久久久久一区二区国产 | 亚洲精品91 |