毕设求救,大佬们帮帮忙

2019-07-21 02:07发布

本帖最后由 『GENT』 于 2019-4-26 16:10 编辑

小弟要通过两个ADC数据,来控制PWM的频率;通过两个中断,来控制PWM的停止。
主函数
[mw_shl_code=c,true] int main(void)
{
         double PRE1;  
         double PRE2;        
         double PRE;
         delay_init();                    
         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
         uart_init(115200);         
         Adc_Init();
   EXTIX_Init();                 
         TIM3->CCR2=0;
          while(1)
         {
    PRE1= Get_Adc_Average(0,4);
                PRE2= Get_Adc_Average(1,4);
                PRE= PRE2- PRE1;
    control(PRE);
         }
         }         [/mw_shl_code]
函数control
[mw_shl_code=c,true]void control(double PRE)
{
         u8 PSC=71;
         if(0.72<=PRE<1.35)
                {
                         switch(TIM3->CCR2)
                         {
                                 case 0:
                                 {
                                         GPIO_SetBits(GPIOE, GPIO_Pin_5);
                                         TIM3_PWM_Init(3999,PSC);
                                         TIM_SetCompare2(TIM3,10);
           while(TIM3->ARR> 599)
                                         {
                                                 TIM3->ARR-=10;
                                         }                                                
                                 }break;
                                 case 10:
                                 {
                               u8 DIR= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
                               if(DIR==0)
                               {
                                                         TIM3->ARR+=10;
                               }
                               if(DIR==1)
                               {
                                                         TIM3->ARR-=10;
                               }
                     }break;
                         }
                 }
         if(-1.35<PRE<0.72)
                {
                         switch(TIM3->CCR2)
                         {
                                 case 0:
                                 {
                                         GPIO_ResetBits(GPIOE, GPIO_Pin_5);
                                         TIM3_PWM_Init(3999,PSC);
                                         TIM_SetCompare2(TIM3,10);
           while(TIM3->ARR> 599)
                                         {
                                                 TIM3->ARR-=10;
                                         }
                                 }break;
                                 case 10:
                                 {
                               u8 DIR= GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
                               if(DIR==0)
                               {
                                                         TIM3->ARR-=10;
                               }
                               if(DIR==1)
                               {
                                                         TIM3->ARR+=10;
                               }
                           }break;
                   }
                }
}[/mw_shl_code]
其中一个中断服务函数
[mw_shl_code=c,true]void EXTI1_IRQHandler(void)
{
        delay_ms(10);
        if(PEin(1)==0)
        {
                while(TIM3->ARR< 3999)
                {
                        TIM3->ARR=TIM3->ARR+10;
                }

  TIM_SetCompare2(TIM3,0);
        GPIO_SetBits(GPIOE, GPIO_Pin_5);
        }
        EXTI_ClearITPendingBit(EXTI_Line1);
}[/mw_shl_code]
ADC的配置
[mw_shl_code=c,true]        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );        


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        
        GPIO_Init(GPIOA, &GPIO_InitStructure);        

        ADC_DeInit(ADC1);

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        
        ADC_InitStructure.ADC_NbrOfChannel = 2;        
        ADC_Init(ADC1, &ADC_InitStructure);        

        ADC_Cmd(ADC1, ENABLE);        
        
        ADC_ResetCalibration(ADC1);
         
        while(ADC_GetResetCalibrationStatus(ADC1));        
        
        ADC_StartCalibration(ADC1);

        while(ADC_GetCalibrationStatus(ADC1));        [/mw_shl_code]

未操作时,PRE的值大概为0.6,也就是在control函数条件范围外,但PB5对应的灯还是亮了,也就是PWM开启了,而且中断也没有反应(PE5对应的灯没反应)。中断配置应该没有问题,在其他project里试过了。改变ADC输入也没有反应。。求各位大佬帮忙看一下哪里出问题了?用的是stm32f103zet6


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