我在楼主的基础上 想再添加一些代码用TIM2的CH1来捕获TIM3的CH1,代码如下:
void TIM2_PWMINPUT_INIT(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM2_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //Open TIM4 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO??
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM2_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM2, &TIM2_ICInitStructure); //PWM输入配置
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //选择有效输入端
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); //配置为主从复位模式
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);
TIM_ITConfig(TIM2, TIM_IT_CC1|TIM_IT_Update, ENABLE); //中断配置
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
TIM_Cmd(TIM2, ENABLE);
}
void TIM2_IRQHandler(void)
{
if(CollectFlag1)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
duty1 = TIM_GetCapture1(TIM2); //采集占空比
period1 = TIM_GetCapture2(TIM2); //采集周期
}
CollectFlag1 = 0;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
主函数:
extern void TIM3_PWM_Init(u16 arr,u16 psc);
extern void TIM4_PWMINPUT_INIT(u16 arr,u16 psc);
extern void TIM2_PWMINPUT_INIT(u16 arr,u16 psc);
extern u16 period;
extern u16 duty ;
extern u8 CollectFlag ;
extern u16 period1;
extern u16 duty1 ;
extern u8 CollectFlag1 ;
//Mini STM32开发板范例代码8
//技术论坛:www.openedv.com
int main(void)
{
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration(); //中断配置
uart_init(9600); //串口初始化
TIM3_PWM_Init(1000,7200-1); //1KHZ周期
TIM_SetCompare1(TIM3,200); //设置占空比
TIM_SetCompare2(TIM3,401); //设置占空比
TIM_SetCompare3(TIM3,600); //设置占空比
TIM_SetCompare4(TIM3,800); //设置占空比
TIM4_PWMINPUT_INIT(0xffff,7200-1); //pwm输入初始化以1M的频率捕捉
TIM2_PWMINPUT_INIT(0xffff,7200-1);
// PWM_Init(900,0); //不分频。PWM频率=72000/900=8Khz
while(1)
{
delay_ms(100);
if(!CollectFlag)
{
printf("duty = %d%% \r\n",duty*100/period); //打印占空比
printf("cycle = %dKHz\r\n",1000/period);//打印周期另一种叫法
printf("period = %dus\r\n",period); //打印周期
CollectFlag = 1;
}
delay_ms(10);
if(!CollectFlag1)
{
printf("duty1 = %d%% \r\n",duty1*100/period1); //打印占空比
printf("cycle1 = %dKHz\r\n",1000/period1);//打印周期另一种叫法
printf("period1 = %dus\r\n",period1); //打印周期
CollectFlag1 = 1;
}
}
}
得出下面的结果:
只有原先楼主的那个测量是准确的 ,能问一下哪错了吗?
|