用输入捕获来来检测两次上升沿来开始和结束AD测量

2019-08-14 05:19发布

输入捕获测方波信号的上升沿,输入捕获脚测到第一个上升沿的时候AD开始采集,测到第二个上升沿的时候AD停止采集,AD的采样频率为200KHz,AD的输入的正弦信号的频率为610Hz,理论上一个周期可以采集327个点,但是现在每一周期(输入捕获的两个上升沿之间)采集的点数都不够定,例如90多,100多,200多。程序如下!不知道是什么原因用的是Mini开发板,之后自己搭的电路

不知道是自己的逻辑有问题,还是输入捕获的问题,请大家帮忙
这是主函数
int main(void)
{
         u16 AData1,AD_temp,AData,AD_temp1,AD_temp2;
         u16 AData2;
         u16 led0pwmval=0,i=0;
         uint16_t AD_Buf[ADSampNumMax]={0};
         u16 Demo[ADSampNumMax]={0};
   u16  a,m=0,k=0,ii=0;
         u16 AD_SUM,AD_SUM1=0;
   u16  ADSampNowNum=0;         
        float v;
        //unsigned int ADbuffer[8];
        // EXTIX_Init();       
        delay_init();                     //          
  TIM2_Cap_Init(0xffff,2-1);
        TIM1_PWM_Init(359,0);                         //
        uart_init(9600);                 //
  AD_Init();

                       
                delay_ms(10);         
          led0pwmval=288;        //DUTY  20%                                            

               
                        if(TIM1CH1_CAPTURE_FLAG1)              //这里是判断是检测到一个上升沿开始AD读数,又检测到一个上升沿停止读数的一个逻辑
                                TIM1CH1_CAPTURE_FLAG1=0;
                        while(!TIM1CH1_CAPTURE_FLAG1)
                        {
                                while(!BUSY);
                                        AData1=GPIO_ReadInputData(GPIOB)&0xFFFF;
                      AD_Buf[ADSampNowNum]=AData1;
                ADSampNowNum++;
                                        while(BUSY);       
                        }                       
                                        a++;
                       
                                        for(ii=0;ii<327;ii++)
                        {
                                AData2=AD_Buf[ii];
                                        printf("%d, ",AData2 );
               
                        }
     printf("%d, ",ADSampNowNum );
        }


输入捕获中断服务函数
void TIM2_IRQHandler(void)
{
        TIM1CH1_CAPTURE_FLAG1=0;
                        if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)                 //
                {

                                ICP4_T1 = TIM_GetCapture1(TIM2);                //
                                TIM1CH1_CAPTURE_STA |= 0X40;                //
                                TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising);//
                                TIM1CH1_CAPTURE_FLAG1=1;  //检测到上升沿将这个变量赋值
                }
                 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //
        }


TIM_ICInitTypeDef TIM2_ICInitStructure;

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

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //ê1&#196;üTIM4ê±&#214;ó
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //ê1&#196;üGPIOBê±&#214;ó

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  //PB8 &#199;&#229;3y&#214;&#174;&#199;°éè&#214;&#195;  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB8
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA, GPIO_Pin_0 );//PB7  &#207;&#194;à-

        //3&#245;ê&#188;&#187;ˉ&#182;¨ê±&#198;÷4 TIM4         
        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#182;¨&#188;&#198;êy&#198;÷×&#212;&#182;ˉ&#214;&#216;×°&#214;μ
        TIM_TimeBaseStructure.TIM_Prescaler = psc;         //&#212;¤·&#214;&#198;μ&#198;÷
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;

        //3&#245;ê&#188;&#187;ˉTIM4ê&#228;è&#235;2&#182;&#187;&#241;2&#206;êy í¨μà1
        TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         &#209;&#161;&#212;&#241;ê&#228;è&#235;&#182;&#203; IC1ó3é&#228;μ&#189;TI1é&#207;
        TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //é&#207;éy&#209;&#216;2&#182;&#187;&#241;
        TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3é&#228;μ&#189;TI1é&#207;
        TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;          //&#197;&#228;&#214;&#195;ê&#228;è&#235;·&#214;&#198;μ,2&#187;·&#214;&#198;μ
        TIM2_ICInitStructure.TIM_ICFilter = 0x00;          //IC1F=0000 &#197;&#228;&#214;&#195;ê&#228;è&#235;&#194;&#203;2¨&#198;÷ 2&#187;&#194;&#203;2¨
        TIM_ICInit(TIM2, &TIM2_ICInitStructure);

        //&#214;D&#182;&#207;·&#214;×é3&#245;ê&#188;&#187;ˉ
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM4&#214;D&#182;&#207;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //&#207;è&#213;&#188;ó&#197;&#207;è&#188;&#182;2&#188;&#182;
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //′óó&#197;&#207;è&#188;&#182;0&#188;&#182;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±&#187;ê1&#196;ü
        NVIC_Init(&NVIC_InitStructure);   //&#184;ù&#190;YNVIC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèNVIC&#188;&#196;′&#230;&#198;÷

        TIM_ITConfig(TIM2, TIM_IT_CC1,ENABLE);   //2&#187;&#212;êDí&#184;üD&#194;&#214;D&#182;&#207;£&#172;&#212;êDíCC1IE2&#182;&#187;&#241;&#214;D&#182;&#207;       

        TIM_Cmd(TIM2, ENABLE);                 //ê1&#196;ü&#182;¨ê±&#198;÷4


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