搜索
bottom↓
回复: 3

关于读取遥控器信号问题

[复制链接]

出0入0汤圆

发表于 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          
}

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

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

出0入0汤圆

发表于 2012-4-11 17:17:53 | 显示全部楼层
老大,你读遥控器不能这样死等啊!
应该用个带中断的IO口读.在中断中处理接收到的数据位.在主循环中处理数据字.

出0入0汤圆

 楼主| 发表于 2012-4-11 17:54:35 | 显示全部楼层
dragon_hn 发表于 2012-4-11 17:17
老大,你读遥控器不能这样死等啊!
应该用个带中断的IO口读.在中断中处理接收到的数据位.在主循环中处理数据 ...

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

出0入0汤圆

 楼主| 发表于 2012-4-11 18:13:36 | 显示全部楼层
大家用的都是中断读的吗?  我看KK用的也是while,应该没什么问题吧?我的竟然要这么久
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:17

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

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