PWM输入模式问题??呼叫原子哥!!!!

2019-07-20 20:03发布

采用TIM14产生1KHZ、50%占空比的信号,然后采用TIM2使用PWM模式采集,计算出对应的频率与占空比,然后通过串口输出。结果频率是对的,占空比却一直不对。我的板子是F407。请各位大神帮忙看看。
[mw_shl_code=c,true]主函数
u32 freq;
u32 pwm;
u8 capFlag = 1;

int main(void)
{  
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
        delay_init(168);  //3õê¼»ˉÑóê±oˉêy
        uart_init(115200);//3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
       
        TIM14_PWM_Init(1000-1,84-1);               //84M/84=1MhzμļÆêyÆμÂê¼Æêyμ½500,PWMÆμÂêÎa1M/1000=1Khz  
        TIM_SetCompare1(TIM14,500);       
        TIM5_CH1_Cap_Init(); //òÔ1MhzμÄÆμÂê¼Æêy
       
        while(1)
        {
                delay_ms(100);
                if(!capFlag)
                {
                        printf("ÆμÂê£o%d KHZ ",1000/freq);
                        printf("Õ¼¿Õ±è£o%d ",pwm*100/freq);
                        capFlag = 1;
                }
               
//                printf("ÆμÂê£o%d KHZ ",1000/freq);
//                printf("Õ¼¿Õ±è£o%d ",pwm*100/freq);

        }

}[/mw_shl_code]
[mw_shl_code=c,true]定时器
#include "timer.h"
#include "led.h"
#include "usart.h"
#include "stm32f4xx_usart.h"
//////////////////////////////////////////////////////////////////////////////////         
//±¾3ìDòÖ»1©Ñ§Ï°ê1óã¬Î′¾-×÷ÕßDí¿é£¬2»μÃóÃóúÆäËüèÎoÎóÃí¾
//ALIENTEK STM32F407¿a·¢°å
//¶¨ê±Æ÷ Çy¶ˉ′úÂë          
//ÕyμãÔ-×ó@ALIENTEK
//¼¼êõÂÛì3:www.openedv.com
//′′½¨èÕÆú:2014/5/4
//°æ±¾£oV1.0
//°æè¨ËùóD£¬μá°æ±Ø¾¿¡£
//Copyright(C) 1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾ 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////          

extern u32 freq;
extern u32 pwm;
extern u8 capFlag;

//TIM14 PWM2¿·Ö3õê¼»ˉ
//PWMêä3ö3õê¼»ˉ
//arr£o×Ô¶ˉÖØ×°Öμ
//psc£oê±ÖóÔ¤·ÖÆμêy
void TIM14_PWM_Init(u32 arr,u32 psc)
{                                                          
        //′Ë2¿·ÖDèêÖ¶ˉDT¸ÄIO¿úéèÖÃ
       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);          //TIM14ê±Öóê1Äü   
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);         //ê1ÄüPORTFê±Öó       
       
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9¸′óÃ붨ê±Æ÷14
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOA9
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸′óÃ1|Äü
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //Ëù¶è100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //íÆíì¸′óÃêä3ö
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //éÏà-
        GPIO_Init(GPIOF,&GPIO_InitStructure); //3õê¼»ˉPF9
       
        TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨ê±Æ÷·ÖÆμ
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
        TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶ˉÖØ×°ÔØÖμ
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
       
        TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);
       
        //3õê¼»ˉTIM14 Channel1 PWMģ꽠        
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨ê±Æ÷Ä£ê½:TIMÂö3å¿í¶èμ÷ÖÆÄ£ê½2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è½Ïêä3öê1Äü
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //êä3ö¼«DÔ:TIMêä3ö±è½Ï¼«DÔ¸ß
        TIM_OCInitStructure.TIM_Pulse=0;
        TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //¸ù¾YTÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèTIM3 OC2

        TIM_OC2PreloadConfig(TIM14, TIM_OCPreload_Enable);  //ê1ÄüTIM3ÔúCCR2éÏμÄԤװÔؼÄ′æÆ÷

  TIM_ARRPreloadConfig(TIM14,ENABLE);
       
        TIM_Cmd(TIM14, ENABLE);  //ê1ÄüTIM14               

}  

//TIM7->100ms
//TIM2_CH2->PB3
void TIM5_CH1_Cap_Init(void)
{
                GPIO_InitTypeDef GPIO_InitStructure;
                TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
                TIM_ICInitTypeDef TIM_ICInitTypeStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
                 
                TIM_DeInit(TIM2);
                 
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);          //TIM2????   
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         //??PORTA??        
//IO        
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//????
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;        //??100MHz
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //??????
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //??
                GPIO_Init(GPIOA,&GPIO_InitStructure); //???PA0
                 
                GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);
//TIM2
                TIM_TimeBaseStructure.TIM_Prescaler=84-1;  //¶¨ê±Æ÷ê±ÖóÔ′·ÖÆμ
                TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
                TIM_TimeBaseStructure.TIM_Period=0xFFFFFFFF;   //×Ô¶ˉÖØ×°ÔØÖμ
                TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
                TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
               
//TIM2 IC
                TIM_ICInitTypeStructure.TIM_Channel = TIM_Channel_1;
                TIM_ICInitTypeStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
                TIM_ICInitTypeStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
                TIM_ICInitTypeStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
                TIM_ICInitTypeStructure.TIM_ICFilter = 0X00;
                 
//NVIC
                NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//?????3
                NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //????3
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ????
                NVIC_Init(&NVIC_InitStructure);  

                TIM_PWMIConfig(TIM2,&TIM_ICInitTypeStructure);
                TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);
                TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);
                TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);
                TIM_ITConfig(TIM2,TIM_IT_CC1|TIM_IT_Update,ENABLE);//?????? ,??CC1IE????        
                TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);       
                TIM_Cmd(TIM2,ENABLE);         //?????5  
}


void TIM2_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM2,TIM_IT_CC1) != RESET)
        {
                if(capFlag)
                {
                                pwm = TIM_GetCapture1(TIM2);                                 //2é¼ˉÕ¼¿Õ±è               
                                freq        =        TIM_GetCapture2(TIM2);                        //2é¼ˉÆμÂê
                }
                capFlag = 0;
               
//                pwm = TIM_GetCapture1(TIM2);                                 //2é¼ˉÕ¼¿Õ±è               
//                freq        =        TIM_GetCapture2(TIM2);                        //2é¼ˉÆμÂê
        }
        TIM_ClearITPendingBit(TIM2,TIM_IT_CC1|TIM_IT_Update);
}
[/mw_shl_code]


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。