Byron.njit 发表于 2012-11-5 20:32:28

求助啊!!!!!!!!!!

各位帮帮忙啊!!!做四轴有一段时间了,但是最近在调试无线的时候却发现了一个比较棘手的问题。我在调试无线的时候发现,当STM32的定时器1发出四路占空比比较大的PWM波时,无线只在上电的一瞬间能收到数据后来就接受不到数据了(注:无线为24L01),但是如果我只发一路PWM波或者发四路但占空比很小的时候无线是能正常工作的。下面是部分的程序代码:

STM32,通过24L01遥控控制四路PWM波的占空比:

//24L01遥控接收寄存器配置:
void RX_Mode(void)
{       
        nrf_baud=0;                                                        //默认速率2Mbps       
        MODE_CE(0);               

        SPI_Write_Buf(WRITE_REG1 + RX_ADDR_P0, TX_ADDRESS0, TX_ADR_WIDTH); ///数据通道0接收地址,最大5个字节, 此处接收地址和发送地址相同        
        SPI_RW_Reg(WRITE_REG1 + EN_AA, 0x01);
        SPI_RW_Reg(WRITE_REG1 + EN_RXADDR, 0x01);           
        SPI_RW_Reg(WRITE_REG1 + RF_CH, 40);//40);         // 选择射频工作频道0   范围0-127       
        SPI_RW_Reg(WRITE_REG1 + RF_SETUP, 0x07);///0x0f);
        SPI_RW_Reg(WRITE_REG1 + RX_PW_P0, TX_PLOAD_WIDTH);       //        接受通道有效字节数
    SPI_RW_Reg(WRITE_REG1 + CONFIG, 0x0f);///3);   

        MODE_CE(1);               
        delay_ms(10);                                               
}

//遥控中断处理程序:
void EXTI0_IRQHandler(void)
{       
        //GPIOB->BSRR = GPIO_Pin_8;
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)                  //判断是否产生了EXTI0中断
        {
                     EXTI_ClearITPendingBit(EXTI_Line0);                          //清除EXTI0上的中断标志                   
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0)        //判断是否是PA0线变低
                {
                        nrf_status=SPI_Read(READ_REG1+STATUS);               
                       if(nrf_status&0x40)
                       {       
                                //GPIOB->BSRR = GPIO_Pin_8;
                               SPI_Read_Buf(RD_RX_PLOAD,NRF_RX_Buff,TX_PLOAD_WIDTH);               
                               nrf_status=SPI_Read(READ_REG1+FIFO_STATUS);
                               SPI_RW_Reg(FLUSH_RX,0);
                                flag_irq=1;
                       }
                       else if((nrf_status&0x20)>0)//发送完成中断
                       {        //GPIOB->BSRR = GPIO_Pin_8;
                               nrf_status=SPI_Read(READ_REG1+FIFO_STATUS);
                               SPI_RW_Reg(FLUSH_TX,0);
                                RX_Mode();       
                       }                               
                        SPI_RW_Reg(WRITE_REG1+STATUS, 0xff);             //清除07寄存器标志                      
               }
        }
//        EXTI_ClearITPendingBit(EXTI_Line0);       
       
}

//遥控中断配置:(//PA0配置为上拉输入模式)
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;
        //设置中断向量表的存放位置和地址
        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                                //NRF24L01 中断响应
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                //抢占优先级 0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                //子优先级为1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能
        NVIC_Init(&NVIC_InitStructure);                                                                                          
       
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);           //NRF24L01 IRQPA0
       
        EXTI_InitStructure.EXTI_Line = EXTI_Line0;                                           //NRF24L01 IRQ PA0
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                           //EXTI中断
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                   //下降沿触发
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                   //使能
        EXTI_Init(&EXTI_InitStructure);       

}

//PWM配置:
void TIM_Configuration()
{       
        TIM_TimeBaseInitTypeDefTIM1_TimeBaseStructure;
        TIM_OCInitTypeDefTIM1_OCInitStructure;

        TIM_DeInit(TIM1);

        /* Time Base configuration */
        TIM1_TimeBaseStructure.TIM_Period = 3200-1;
        TIM1_TimeBaseStructure.TIM_Prescaler = 0;                               
        TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式       
        TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0;                                                                                                                                               
        TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
        TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);

        /* Channel 1, 2,3 and 4 Configuration in PWM mode */
        TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                                 //PWM1模式在TIM_Pluse时间内,且Polarity为低电平的时候输出为低电平
        TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                         //正常通道打开
        TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;              //互补通道关断            
        TIM1_OCInitStructure.TIM_Pulse = 0;        ///20;                                                                 //占空值
        TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        ///Low;         //输出极性
        TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;         

        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);                 //相应通道初始化,OC2Init是通道二初始化
        TIM_OC2Init(TIM1,&TIM1_OCInitStructure);
        TIM_OC3Init(TIM1,&TIM1_OCInitStructure);
        TIM_OC4Init(TIM1,&TIM1_OCInitStructure);
       
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能预装载寄存器
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能预装载寄存器
        TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能预装载寄存器
        TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能预装载寄存器
       
        TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能ARR的预装载寄存器

        /* TIM1 counter enable */
        TIM_Cmd(TIM1,ENABLE);                                                //定时器使能

        /* Main Output Enable */
        TIM_CtrlPWMOutputs(TIM1,ENABLE);                                //PWM输出使能
}

问题:PWM配置(0~3200)为100以下时一切正常,但占空比一升高24L01的中断就基本进不去,PWM失去控制,已经排除了硬件原因,是不是中断这里出问题了啊?各位谢谢啦!!!

xaper 发表于 2012-11-5 20:47:07

将优先级调高点试试

Byron.njit 发表于 2012-11-5 21:03:54

xaper 发表于 2012-11-5 20:47 static/image/common/back.gif
将优先级调高点试试

优先级已经最高了啊!!不过谢谢啊!!
页: [1]
查看完整版本: 求助啊!!!!!!!!!!