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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2522|回復: 7
打印 上一主題 下一主題
收起左側

STM32F103頻率采集誤差問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:584195 發表于 2021-8-23 07:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用stm32F103RC定時器3通道2來采集頻率,輸入頻率為1.8KHZ,測得為2KHZ。用示波器實測也是1.8KHz。程序如下.請問我這程序要怎么改才能采集到正確的數據。需要用運算放大器嗎?

/***********************************************************************************************
  //上升沿捕獲
************************************************************************************************/
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時鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //使能GPIOA時鐘
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;              //PA7 清除之前設置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //PA7 浮空輸入  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);                                                              //PA7 下拉
       
        //初始化定時器5 TIM5         
        TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重裝值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //預分頻器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位

        //初始化TIM5輸入捕獲參數
        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為始終觸發源
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM從模式:觸發信號的上升沿重新初始化計數器和觸發寄存器的更新事件
    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //啟動定時器的被動觸發
       
        //中斷分組初始化
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中斷
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占優先級2級
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //從優先級0級
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根據NVIC_InitStruct中指定的參數初始化外設NVIC寄存器
       
        TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE);//不能允許更新中斷 ,允許CC2IE捕獲中斷       
       
           TIM_Cmd(TIM3,ENABLE);         //使能定時器3

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

************************************************************************************************/
u32  counter=0;                                                                           // 每秒計數
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 Hz\r\n",Frequency/7200);       //打印數據                       
                        for(i=0;i<2000000;i++)
                        {         
                                ;
                        }
                       
    }
}


[07:49:19.112]收←◆當前頻率為:2000 Hz

[07:49:20.189]收←◆當前頻率為:2000 Hz

[07:49:21.266]收←◆當前頻率為:2000 Hz

[07:49:22.343]收←◆當前頻率為:2000 Hz

[07:49:23.420]收←◆當前頻率為:2000 Hz

[07:49:24.497]收←◆當前頻率為:2000 Hz

[07:49:25.574]收←◆當前頻率為:2000 Hz


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

使用道具 舉報

沙發
ID:265988 發表于 2021-8-23 09:14 | 只看該作者
是不是小數點沒有分離啊
回復

使用道具 舉報

板凳
ID:584195 發表于 2021-8-23 10:22 | 只看該作者
oyyp 發表于 2021-8-23 09:14
是不是小數點沒有分離啊

這是整數,沒有精確到Khz,單位是Hz按理來講不會出問題的
回復

使用道具 舉報

地板
ID:313048 發表于 2021-8-23 17:05 | 只看該作者
首先是不需要用到運放的,首先確定你的定時器中斷所取時間是否合理,其次是你在定時器中斷里面放那個for循環是完全沒有必要的。
回復

使用道具 舉報

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

謝謝,感謝提示,我更改一下看看。
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

8#
ID:584195 發表于 2021-8-24 21:04 | 只看該作者
我后面看了其他的貼子,抄了一下程序,現在可以采集正確了。
/***********************************************************************************************
* 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時鐘
        
  
  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; //在捕獲輸入上每控測到一個邊沿執行一次捕獲
  TIM_ICInitStructure.TIM_ICFilter = 0; //濾波設置,經歷幾個周期跳變定波形穩定。(采樣高電平,只有連續采集到N個電平是高電平時才認為是有效的,否則低于N個時認為是無效的,N取0x0-0xF)
  TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);//以上是輸入捕獲配置
  TIM_SelectInputTrigger(TIM2,TIM_TS_TI2FP2); //選擇濾波后的TI2FP2輸入作為觸發源,觸發下面程序的復位
  TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//從模式控制器被設置為復位模式-選中的觸發信號上升沿重新初始化計數器并產生一個更新信號(上升沿一到,TIM2->CNT被清零,每次上升沿來到,CNT都會被清零)
  TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發
  TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//捕獲中斷打開
  TIM_Cmd(TIM2,ENABLE);//使能定時器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);

  }
}

當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz
當前頻率為:1799 Hz

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区www | 国产成人一区二区三区精 | 色www精品视频在线观看 | 国产精品高潮呻吟久久aⅴ码 | 精彩视频一区二区三区 | 亚洲成人激情在线观看 | 国产日韩欧美综合 | 欧美毛片免费观看 | 免费观看黄色片视频 | 中文字幕一区二区三区精彩视频 | 亚洲精品一 | 日韩一及片| 国产精品欧美一区二区 | 久久精品a | 99riav国产一区二区三区 | 久久av网站 | 欧美5区| 欧美一区二区大片 | 国产在线精品一区二区三区 | 欧美一级毛片在线播放 | 91毛片在线观看 | 国产一区二区三区视频免费观看 | 色综网 | 亚洲精品一区二区三区中文字幕 | 在线观看视频h | 国产一区二区在线免费观看 | 亚洲一区二区av在线 | 中文字幕av在线播放 | 91精品国产综合久久久动漫日韩 | 男女免费观看在线爽爽爽视频 | 天天影视网天天综合色在线播放 | 亚洲成人网在线观看 | 一区二区av| 免费1区2区3区 | 五月天国产视频 | 国产精品不卡一区 | 国产免费又色又爽又黄在线观看 | 久久久久久久亚洲精品 | 91在线观看免费视频 | 91天堂网 | 国产精品久久久久久久久久妇女 |