论坛元老
 
- 积分
- 3071
- 金钱
- 3071
- 注册时间
- 2018-2-7
- 在线时间
- 285 小时
|
发表于 2019-9-9 13:53:29
|
显示全部楼层
- // TIM3_CH1 PA6 做为捕获通道
- // 输入捕获能捕获到的最小的频率为 72M/{ (ARR+1)*(PSC+1) }
- void Capture_Init(u16 arr, u16 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
- TIM_ICInitTypeDef TIM_ICInitSturcture;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- TIM_TimeBaseInitSturcture.TIM_Period = arr;
- TIM_TimeBaseInitSturcture.TIM_Prescaler = psc;
- TIM_TimeBaseInitSturcture.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitSturcture);
- TIM_ICInitSturcture.TIM_Channel = TIM_Channel_1;
- TIM_ICInitSturcture.TIM_ICFilter = 0x00;
- TIM_ICInitSturcture.TIM_ICPolarity = TIM_ICPolarity_Rising;
- TIM_ICInitSturcture.TIM_ICPrescaler = TIM_ICPSC_DIV1;
- TIM_ICInitSturcture.TIM_ICSelection = TIM_ICSelection_DirectTI;
- //TIM_ICInit(TIM3, &TIM_ICInitSturcture);
- TIM_PWMIConfig(TIM3, &TIM_ICInitSturcture); //初始化PWM输入模式
- // 当工作做PWM输入模式时,只需要设置触发信号的那一路即可(用于测量周期)
- // 另外一路(用于测量占空比)会由硬件自带设置,不需要再配置
- TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); //选择输入捕获触发信号
- TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT会被复位
- TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); // 使能捕获中断,这个中断针对的是主捕获通道(测量周期那个)
- TIM_Cmd(TIM3, ENABLE);
- }
- float DutyCycle = 0;
- float Frequency = 0;
- u32 IC1Value = 0;
- u32 IC2Value = 0;
- // 如果是第一个上升沿中断,计数器会被复位,锁存到CCR1寄存器的值是0,CCR2寄存器的值也是0,
- // 无法计算频率和占空比。当第二次上升沿到来的时候,CCR1和CCR2捕获到的才是有效的值。其中
- // CCR1对应的是周期,CCR2对应的是占空比。
- void TIM3_IRQHandler(void)
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
- IC1Value = TIM_GetCapture1(TIM3); //总长度
- IC2Value = TIM_GetCapture2(TIM3); //占空比
- if(IC1Value != 0)
- {
- DutyCycle = (float)(IC2Value * 100) / IC1Value ;
- Frequency = 1000000 / (float)IC1Value ;
- printf("频率:%0.2f,占空比:%0.2f \r\n", Frequency, DutyCycle);
- }
- else
- {
- DutyCycle = 0;
- Frequency = 0;
- }
- }
- int main(void)
- {
- u32 j = 0;
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- uart_init(115200);
- Capture_Init(59999,71); // 可捕获最小频率 72M/(72*60000)= 17Hz
- while(1)
- {
- }
- }
复制代码
|
|