fusion 发表于 2012-4-11 17:11:10

关于读取遥控器信号问题

我今天测试时发现读取遥控器信号竟然用了100ms左右,我是每100个程序周期输出一次,结果发现要10S左右才有一次输出,把读取遥控器的程序去掉后就快了很多,1s不到,这样一算的话读取遥控器信号岂不是用了100MS左右?太夸张了
附上代码,大家看看有没有问题 程序周期这么久控制四轴的话应该太慢了吧?感觉根本反应不过来

处理器用的是STM32,用PWM输入读取,通道1和其他3个读取有点不一样,我用注释的方法测试了下,发现每个读的都是25MS左右

        /*************************************************************************************************/       
//以下的代码是初始化TIM2读取接收机的PWM信号,得到PWM信号的周期与占空比
        RCC->APB1ENR|=1<<0;                        //TIM2时钟使能
        RCC->APB2ENR|=1<<2;                    //使能PORTA时钟                                //使用某个引脚时,一定要开启相应的时钟

        GPIOA->CRL&=0XFFFF0000;                //PA0,PA1,PA2,PA3输出
        GPIOA->CRL|=0X00004444;                //浮空输入!!!详见“STM32微控制器参考手册,第110页表20”,当使用定时器的捕获输入模式时,需要把GPIO配置成浮空输入
               
        TIM2->ARR=0xFFFF;                        //设定计数器自动重装值        
        TIM2->PSC=71;                                //预分频器72分频,每个数字的时间是1us。

        TIM2->CCMR1=0X2121;
        TIM2->CCMR2=0X2121;   
       
        TIM2->CR1&=~0x01;                        //暂时先不使能定时器2       
}



void ReadControler(s16 *ail,s16 *ele,s16 *thr,s16 *rud)
{
        s16 CH_TEMP;
/**********************************/       
//下面代码检测通道1上的PWM波的长度

        TIM2->SR &= ~(15<<9);
        TIM2->SR &= ~(15<<1);                //清除中断标志

        TIM2->CCER=0;
        TIM2->SMCR|=4<<0;                        //选择为SMS=100复位模式,当检测到上升沿时,复位;然后再检测到下降沿时,输出信号。
        TIM2->SMCR|=7<<4;                        //通道1可用高级方法实现捕获        ,从模式选择:复位模式, 选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存

        TIM2->CCER=0x0003;                        //使能通道1

        TIM2->CR1|=0x01;                    //使能定时器2
       
        while(!(TIM2->SR&0x0002));         //等待捕获完成,计数器值已被捕获(拷贝)至TIMx_CCR1( 在IC1 上检测到与所选极性相同的边沿)
        *ail =TIM2->CCR1;                        //输出读取的数据       
        TIM2->CR1&=~0x01;                        //禁止定时器2
       

//        ********************************
//下面代码检测通道2上的PWM波的长度
        TIM2->SR &= ~(15<<9);
        TIM2->SR &= ~(15<<1);                        //清除中断标志

        TIM2->CCER=0x0010;                                //使能通道2,捕获上升沿。

        TIM2->CR1|=0x01;                            //使能定时器2
        while(!(TIM2->SR&0x0004));                //等待捕获完成
        CH_TEMP = TIM2->CCR2;                        //记录上升沿时的值       
        TIM2->CCER=0x0030;                                //捕获下降沿。
        while(!(TIM2->SR&0x0004));                //等待捕获完成
        *ele = (TIM2->CCR2)-CH_TEMP;        //得到捕获的高电平的时间
       
        TIM2->CR1&=~0x01;                                //禁止定时器2

// ********************************
//下面代码检测通道3上的PWM波的长度
        TIM2->SR &= ~(15<<9);
        TIM2->SR &= ~(15<<1);                        //清除中断标志

        TIM2->CCER=0x0100;                                //使能通道2,捕获上升沿。

        TIM2->CR1|=0x01;                            //使能定时器2
        while(!(TIM2->SR&0x0008));                //等待捕获完成
        CH_TEMP = TIM2->CCR3;                        //记录上升沿时的值

        TIM2->CCER=0x0300;                                //捕获下降沿。
        while(!(TIM2->SR&0x0008));                //等待捕获完成/
        *thr = (TIM2->CCR3)-CH_TEMP;        //得到捕获的高电平的时间

        TIM2->CR1&=~0x01;                                //禁止定时器2

//********************************
//下面代码检测通道4上的PWM波的长度
        TIM2->SR &= ~(15<<9);
        TIM2->SR &= ~(15<<1);                        //清除中断标志

        TIM2->CCER=0x1000;                                //使能通道4,捕获上升沿。

        TIM2->CR1|=0x01;                            //使能定时器2
        while(!(TIM2->SR&0x0010));                //等待捕获完成
        CH_TEMP = TIM2->CCR4;                        //记录上升沿时的值
        TIM2->CCER=0x3000;                                //捕获下降沿。
        while(!(TIM2->SR&0x0010));                //等待捕获完成
        *rud= (TIM2->CCR4)-CH_TEMP;                //得到捕获的高电平的时间
        TIM2->CR1&=~0x01;                                //禁止定时器2        
}

dragon_hn 发表于 2012-4-11 17:17:53

老大,你读遥控器不能这样死等啊!
应该用个带中断的IO口读.在中断中处理接收到的数据位.在主循环中处理数据字.

fusion 发表于 2012-4-11 17:54:35

dragon_hn 发表于 2012-4-11 17:17 static/image/common/back.gif
老大,你读遥控器不能这样死等啊!
应该用个带中断的IO口读.在中断中处理接收到的数据位.在主循环中处理数据 ...

哦STM32有自带的PWM输入功能所以就这么用了

fusion 发表于 2012-4-11 18:13:36

大家用的都是中断读的吗?我看KK用的也是while,应该没什么问题吧?我的竟然要这么久
页: [1]
查看完整版本: 关于读取遥控器信号问题