打印
[STM32F1]

stm32f103ze通用定时器测频率和占空比。

[复制链接]
853|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TCsbx|  楼主 | 2015-11-26 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初始化配置如下
TIM_ICInitTypeDef  TIM5_ICInitStructure;

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

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);        //ʹÄÜTIM5ʱÖÓ
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //ʹÄÜGPIOAʱÖÓ
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 Çå³ý֮ǰÉèÖà 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 ÊäÈë  
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                 //PA0 ÏÂÀ­
       
        //³õʼ»¯¶¨Ê±Æ÷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(TIM5, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»
  
        //³õʼ»¯TIM5ÊäÈ벶»ñ²ÎÊý
        TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         Ñ¡ÔñÊäÈë¶Ë IC1Ó³Éäµ½TI1ÉÏ
          TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //ÉÏÉýÑز¶»ñ
          TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //Ó³Éäµ½TI1ÉÏ
          TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //ÅäÖÃÊäÈë·ÖƵ,²»·ÖƵ
          TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 ÅäÖÃÊäÈëÂ˲¨Æ÷ ²»Â˲¨
          TIM_ICInit(TIM5, &TIM5_ICInitStructure);
       
        //ÖжϷÖ×é³õʼ»¯
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3ÖжÏ
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //ÏÈÕ¼ÓÅÏȼ¶2¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //´ÓÓÅÏȼ¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ
        NVIC_Init(&NVIC_InitStructure);  //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
       
        TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE);//TIM_IT_Update|ÔÊÐí¸üÐÂÖÐ¶Ï ,ÔÊÐíCC1IE²¶»ñÖжϠ      
       
           TIM_Cmd(TIM5,ENABLE );         //ʹÄܶ¨Ê±Æ÷5
   


}
沙发
TCsbx|  楼主 | 2015-11-26 22:21 | 只看该作者
把中断贴出来,求大侠,测频率不准,占空比严重错误。

u8  TIM5CH1_CAPTURE_STA=0;        //ÊäÈ벶»ñ״̬                                                   
u16        TIM5CH1_CAPTURE_VAL1=0;        //ÊäÈ벶»ñÖµ
u16        TIM5CH1_CAPTURE_VAL2=0;        //ÊäÈ벶»ñÖµ
u8 duty=0;
u32 fre=0;

//¶¨Ê±Æ÷5ÖжϷþÎñ³ÌÐò         
void TIM5_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//²¶»ñ1·¢Éú²¶»ñʼþ
                {                               
                        if(TIM5CH1_CAPTURE_STA&0X40)                //²¶»ñµ½Ò»¸öϽµÑØ                
                        {                                 
                                TIM5CH1_CAPTURE_STA=0;                //±ê¼Ç³É¹¦²¶»ñµ½Ò»´ÎÉÏÉýÑØ
                                TIM5CH1_CAPTURE_VAL1=TIM_GetCapture1(TIM5);
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 ÉèÖÃΪÉÏÉýÑز¶»ñ
                        }else                                                                  //»¹Î´¿ªÊ¼,µÚÒ»´Î²¶»ñÉÏÉýÑØ
                        {        TIM5CH1_CAPTURE_VAL2=TIM_GetCapture1(TIM5);
                               
                                duty=TIM5CH1_CAPTURE_VAL1*100/TIM5CH1_CAPTURE_VAL2;
                                fre=1000000/TIM5CH1_CAPTURE_VAL2;
                                        LCD_ShowString(12,160,200,16,16,"T5 Fre:       Hz,Duty:   %");
                                LCD_ShowNum(68,160,fre,7,16);
                                LCD_ShowNum(188,160,duty,3,16);
                               
//                                TIM5CH1_CAPTURE_STA=0;                        //Çå¿Õ
                                TIM5CH1_CAPTURE_VAL1=0;
                                TIM5CH1_CAPTURE_VAL2=0;
                                 TIM_SetCounter(TIM5,0);
                                TIM5CH1_CAPTURE_STA|=0X40;                //±ê¼Ç²¶»ñµ½ÁËÉÏÉýÑØ
                                   TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 ÉèÖÃΪϽµÑز¶»ñ
                        }                    
        }                                                                                   
                        TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);//|TIM_IT_Update); //Çå³ýÖжϱê־λ
}

使用特权

评论回复
板凳
stalker张| | 2015-12-6 22:01 | 只看该作者
楼主需要吗?程序可以贴给你,pwm及测频

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
TCsbx + 3 很给力!
地板
07611128| | 2015-12-7 08:41 | 只看该作者
把你的lcd_show从中断拿出来试试

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
TCsbx + 3 赞一个!
5
airwill| | 2015-12-7 10:20 | 只看该作者
ShowString,LCD_ShowNum 这些函数应该会消耗很多时间, 影响了下面中断的响应.
其实可以包括上面的乘除计算都可以放到主循环里去跑

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
TCsbx + 3 很给力!
6
TCsbx|  楼主 | 2016-1-20 22:21 | 只看该作者
stalker张 发表于 2015-12-6 22:01
楼主需要吗?程序可以贴给你,pwm及测频

需要啊,堤堤

使用特权

评论回复
7
TCsbx|  楼主 | 2016-1-20 22:22 | 只看该作者
airwill 发表于 2015-12-7 10:20
ShowString,LCD_ShowNum 这些函数应该会消耗很多时间, 影响了下面中断的响应.
其实可以包括上面的乘除计算 ...

大师说的是,以后在中断里面少搞些语句,放到主函数去跑。

使用特权

评论回复
8
stalker张| | 2016-2-28 22:22 | 只看该作者
:D

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

353

帖子

10

粉丝