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

QQ登錄

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

搜索
查看: 2561|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

STM32F103頻率采集誤差問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:584195 發(fā)表于 2021-8-23 07:49 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我用stm32F103RC定時(shí)器3通道2來(lái)采集頻率,輸入頻率為1.8KHZ,測(cè)得為2KHZ。用示波器實(shí)測(cè)也是1.8KHz。程序如下.請(qǐng)問(wèn)我這程序要怎么改才能采集到正確的數(shù)據(jù)。需要用運(yùn)算放大器嗎?

/***********************************************************************************************
  //上升沿捕獲
************************************************************************************************/
TIM_ICInitTypeDef  TIM3_ICInitStructure;

void TIM3_counter_Init(u16 arr,u16 psc)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
           NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,  ENABLE);          //使能TIM5時(shí)鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA時(shí)鐘
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;              //PA7 清除之前設(shè)置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //PA7 浮空輸入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);                                                              //PA7 下拉
       
        //初始化定時(shí)器5 TIM5         
        TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)定計(jì)數(shù)器自動(dòng)重裝值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //預(yù)分頻器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位

        //初始化TIM5輸入捕獲參數(shù)
        TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2;                   //         選擇輸入端 IC1映射到TI1上
          TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;           //上升沿捕獲
          TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
          TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;                             //配置輸入分頻,不分頻
          TIM3_ICInitStructure.TIM_ICFilter = 0x00;                                                            //IC1F=0000 配置輸入濾波器 不濾波
          TIM_ICInit(TIM3, &TIM3_ICInitStructure);

        TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); //選擇IC2為始終觸發(fā)源
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM從模式:觸發(fā)信號(hào)的上升沿重新初始化計(jì)數(shù)器和觸發(fā)寄存器的更新事件
    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //啟動(dòng)定時(shí)器的被動(dòng)觸發(fā)
       
        //中斷分組初始化
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優(yōu)先級(jí)2級(jí)
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //從優(yōu)先級(jí)0級(jí)
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器
       
        TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);//不能允許更新中斷 ,允許CC2IE捕獲中斷       
       
           TIM_Cmd(TIM3,ENABLE);         //使能定時(shí)器3

}
/***********************************************************************************************

************************************************************************************************/
u32  counter=0;                                                                           // 每秒計(jì)數(shù)
int  Frequency=0;

void TIM3_IRQHandler(void)
{
        static int  i =0;
        if (TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)  
    {
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);             //清楚TIM的中斷待處理位
                        counter = (u32)TIM_GetCapture2(TIM3);               
      Frequency =72000000/counter;
                  printf("當(dāng)前頻率為:%d Hz\r\n",Frequency/7200);       //打印數(shù)據(jù)                       
                        for(i=0;i<2000000;i++)
                        {         
                                ;
                        }
                       
    }
}


[07:49:19.112]收←◆當(dāng)前頻率為:2000 Hz

[07:49:20.189]收←◆當(dāng)前頻率為:2000 Hz

[07:49:21.266]收←◆當(dāng)前頻率為:2000 Hz

[07:49:22.343]收←◆當(dāng)前頻率為:2000 Hz

[07:49:23.420]收←◆當(dāng)前頻率為:2000 Hz

[07:49:24.497]收←◆當(dāng)前頻率為:2000 Hz

[07:49:25.574]收←◆當(dāng)前頻率為:2000 Hz


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

使用道具 舉報(bào)

沙發(fā)
ID:265988 發(fā)表于 2021-8-23 09:14 | 只看該作者
是不是小數(shù)點(diǎn)沒(méi)有分離啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:584195 發(fā)表于 2021-8-23 10:22 | 只看該作者
oyyp 發(fā)表于 2021-8-23 09:14
是不是小數(shù)點(diǎn)沒(méi)有分離啊

這是整數(shù),沒(méi)有精確到Khz,單位是Hz按理來(lái)講不會(huì)出問(wèn)題的
回復(fù)

使用道具 舉報(bào)

地板
ID:313048 發(fā)表于 2021-8-23 17:05 | 只看該作者
首先是不需要用到運(yùn)放的,首先確定你的定時(shí)器中斷所取時(shí)間是否合理,其次是你在定時(shí)器中斷里面放那個(gè)for循環(huán)是完全沒(méi)有必要的。
回復(fù)

使用道具 舉報(bào)

5#
ID:584195 發(fā)表于 2021-8-24 00:34 | 只看該作者
AUG 發(fā)表于 2021-8-23 17:05
首先是不需要用到運(yùn)放的,首先確定你的定時(shí)器中斷所取時(shí)間是否合理,其次是你在定時(shí)器中斷里面放那個(gè)for循 ...

謝謝,感謝提示,我更改一下看看。
回復(fù)

使用道具 舉報(bào)

6#
ID:419909 發(fā)表于 2021-8-24 08:46 | 只看該作者
不要在中斷里執(zhí)行太多命令。一般只在中斷里賦值給某個(gè)變量。再在主循環(huán)打印。
回復(fù)

使用道具 舉報(bào)

7#
ID:584195 發(fā)表于 2021-8-24 20:27 | 只看該作者
wfqxgw 發(fā)表于 2021-8-24 08:46
不要在中斷里執(zhí)行太多命令。一般只在中斷里賦值給某個(gè)變量。再在主循環(huán)打印。

能幫我看看嗎,我今天把for去掉了,但是還是采集到2000Hz
回復(fù)

使用道具 舉報(bào)

8#
ID:584195 發(fā)表于 2021-8-24 21:04 | 只看該作者
我后面看了其他的貼子,抄了一下程序,現(xiàn)在可以采集正確了。
/***********************************************************************************************
* TIM2配置捕獲模式
************************************************************************************************/
void TIM2_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  NVIC_InitTypeDef NVIC_InitStructure;
  
  TIM_ICInitTypeDef TIM_ICInitStructure;
  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA時(shí)鐘
        
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//TIM2_CH2
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA,&GPIO_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);

  
  
  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上
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //在捕獲輸入上每控測(cè)到一個(gè)邊沿執(zhí)行一次捕獲
  TIM_ICInitStructure.TIM_ICFilter = 0; //濾波設(shè)置,經(jīng)歷幾個(gè)周期跳變定波形穩(wěn)定。(采樣高電平,只有連續(xù)采集到N個(gè)電平是高電平時(shí)才認(rèn)為是有效的,否則低于N個(gè)時(shí)認(rèn)為是無(wú)效的,N取0x0-0xF)
  TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);//以上是輸入捕獲配置
  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ì)被清零)
  TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//啟動(dòng)定時(shí)器的被動(dòng)觸發(fā)
  TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//捕獲中斷打開(kāi)
  TIM_Cmd(TIM2,ENABLE);//使能定時(shí)器2
}


float Frequency1=0;
float pulse=0;
u32 duty=0;
u16 freq=0;
u8 flag = 0;


void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2,TIM_IT_CC2) == Bit_SET)
  {
    IC2Value=TIM_GetCapture2(TIM2);//獲得CCR2的值
    pulse=TIM_GetCapture1(TIM2);//獲得CCR1的值
    DutyCycle=pulse/IC2Value;
    Frequency=72000000/IC2Value;
    duty=(u32)(DutyCycle*100);
    freq=(Frequency);

    flag=1;

    TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);

  }
}

當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz
當(dāng)前頻率為:1799 Hz

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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