|
我今天测试时发现读取遥控器信号竟然用了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, 杜汶泽)
|