金牌会员
 
- 积分
- 1289
- 金钱
- 1289
- 注册时间
- 2014-6-15
- 在线时间
- 143 小时
|
5金钱
//TIM2设置为输入捕获功能
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; //NVIC配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM2设置
//时基设置
TIM_BaseInitStructure.TIM_Prescaler = 0;// 设置预分配器
TIM_BaseInitStructure.TIM_ClockDivision = 0;//时钟分频值
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式
TIM_BaseInitStructure.TIM_RepetitionCounter = 0;//是重复计数,就是重复溢出多少次才给你来一个溢出中断
TIM_TimeBaseInit(TIM2,&TIM_BaseInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; // TIM_Channel_4; //通道选择
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //设 置 输 入 信 号 的 有效 捕获 极性 ====上升沿触发
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ; //管脚与寄存器对应关系 ---配置 IC1 直接映射在 TI1 上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入预分频。
TIM_ICInitStructure.TIM_ICFilter = 0x0; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure); //根据参数配置TIM外设信息
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1|TIM_TS_TI2FP2); //选择IC1,2为触发源 这里不大懂触发源是怎么分配到捕获单元的
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
TIM_Cmd(TIM2, ENABLE); //启动TIM2
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); //打开中断
}
TIM2对应的引脚已经设置成浮空输入。
//中断函数
void TIM2_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清楚TIM的中断待处理位
IC2Value = TIM_GetCapture2(TIM2); //读取IC2捕获寄存器的值,即为PWM周期的计数值
if(IC2Value != 0)
{/*
注意:TIM_GetCapture2(TIM2);和TIM_GetCapture1(TIM2);函数名的细微区别,这个很重要
*/
//需要分开保存两次测得的PWM频率和占空比
//
//
PWM.DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value; //读取IC1捕获寄存器的值,并计算占空比
PWM.Rightf = 72000000 / IC2Value; //计算PWM频率。
PWM.Period=IC2Value; //PWM周期
PWM.flag=1;
}
else
{
PWM.flag=0;
PWM.DutyCycle = 0;
PWM.Rightf = 0;
}
}
在中断函数里 我认为第一次捕获成功后IC2Value =0;
仿真也确实如此,第二次发生捕获中断就应该能读出PWM的周期数据
IC2Value = TIM_GetCapture2(TIM2);
TIM_GetCapture1(TIM2);但是仿真发现 第二次发生捕获中断后这两个读出的数据都是1 ,
求解
|
|