高中生
最后登录1970-1-1
在线时间 小时
注册时间2017-2-28
|
程序目的:在定时器1捕获到PWM波之后,利用普通定时器输出PWM波;
解决方法:将普通定时器初始化函数写入中断函数。
存在问题:在输出较大平率的PWM波时,用定时器8捕获频率和占空比正常,当频率设置为100时占空比正常,频率不正常。
同时,如果将普通定时器初始化函数写在主函数,也就是中断函数外不存在上述问题。
为什么不写在主函数:因为想要调用中断函数捕获到的参数 IC1Value1和 IC2Value1 ,如果在中断函数中定义这两个变量然后利用exten关键字导出到主函数发现虽然编译器不报错,但是参数值异常,并不是中断函数所捕获到的值。
最终实现目标:捕获航模接收机的PWM波然后以相同的频率和占空比输出给飞控。如果有前辈做过,希望可以指点一下。一直调不出理想的效果。
中断函数源码:模仿高级定时器1对高级定时器8进行了宏定义
#define ADVANCE1_TIM TIM1
#define ADVANCE8_TIM TIM8
......
void ADVANCE1_TIM_IRQHandler(void)
{
TIM_ClearITPendingBit(ADVANCE1_TIM, TIM_IT_CC1);
IC1Value1 = TIM_GetCapture1(ADVANCE1_TIM);
IC2Value1 = TIM_GetCapture2(ADVANCE1_TIM);
if (IC1Value1 != 0)
{
DutyCycle1 = (float)((IC2Value1+1) * 100) / (IC1Value1+1);
Frequency1 = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value1+1);
}
else
{
DutyCycle1 = 0;
Frequency1 = 0;
}
GENERAL_TIM_Init((10000-1),5000);
//普通定时器初始化函数改为带参函数,参数为TIM_Period和TIM_Pulse的值。
}
void ADVANCE8_TIM_IRQHandler(void)
{
TIM_ClearITPendingBit(ADVANCE8_TIM, TIM_IT_CC1);
IC1Value8 = TIM_GetCapture1(ADVANCE8_TIM);
IC2Value8 = TIM_GetCapture2(ADVANCE8_TIM);
if (IC1Value8 != 0)
{
//TIM_Cmd(ADVANCE1_TIM, ENABLE);
DutyCycle8 = (float)((IC2Value8+1) * 100) / (IC1Value8+1);
Frequency8 = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value8+1);
}
else
{
DutyCycle8 = 0;
Frequency8 = 0;
}
}
|
|