搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 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 IRQ  PA0
       
        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_TimeBaseInitTypeDef  TIM1_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM1_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失去控制,已经排除了硬件原因,是不是中断这里出问题了啊?各位谢谢啦!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-5 20:47:07 | 显示全部楼层
将优先级调高点试试

出0入0汤圆

 楼主| 发表于 2012-11-5 21:03:54 | 显示全部楼层
xaper 发表于 2012-11-5 20:47
将优先级调高点试试

优先级已经最高了啊!!不过谢谢啊!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 08:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表