完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
记录下输入捕获初始化代码
#define TIM2_ARR 5000 #define TIM2_PSC 72 #define TIM_PSC_CLK (72000000/TIM2_PSC) //定时器计数时钟 void TIM_CaptureInit(u16 arr, u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_ICInitTypeDef TIM2_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能PB,PE端口时钟 GPIO_Config(); 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_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化TIM2通道3為输入捕获PWM TIM2_ICInitStructure.TIM_Channel = TIM_Channel_3; // 通道3輸入捕獲PWM选择输入端 IC3映射到TI3上 TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI3上 TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波 TIM_ICInit(TIM2, &TIM2_ICInitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_ClearFlag(TIM2, TIM_IT_Update | TIM_IT_CC3); //清除中斷標誌位 TIM_ITConfig(TIM2, TIM_IT_Update | TIM_IT_CC3, ENABLE); //允许更新中断 ,允许CC3IE捕获中断 TIM_Cmd(TIM2,ENABLE); //使能定时器2 } //初始化调用 TIM_CaptureInit(TIM2_ARR, TIM2_PSC-1) 相应的定时器输入捕获的引脚初始化: void GPIO_Config() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2为TIM2_CH3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入浮空模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_2); } 在定时器中断中进行捕获: void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //更新中断 { g_ldCaptureStructure.captureUpatePeriod++; / TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位 } if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET) //通道3发生捕获中断 { if(g_ldCaptureStructure.captureStartFlag == 0) //还未开始,第一次捕获上升沿 { g_ldCaptureStructure.captureFinishFlag = 0; g_ldCaptureStructure.captureRegVal = 0; g_ldCaptureStructure.captureUpatePeriod = 0; g_ldCaptureStructure.captureStartFlag = 1; //标志捕获开始 TIM_SetCounter(TIM2, 0); //清零TIM2的计数器 TIM_OC3PolarityConfig(TIM2, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } else { TIM_Cmd(TIM2, DISABLE); //使能定时器2 g_ldCaptureStructure.captureRegVal = TIM_GetCapture3(TIM2); g_ldCaptureStructure.captureStartFlag = 0; g_ldCaptureStructure.captureFinishFlag = 1; //標誌捕獲完成 CalcPulseWidth(&g_ldCaptureStructure); TIM_OC3PolarityConfig(TIM2, TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 TIM_Cmd(TIM2, ENABLE); } TIM_ClearITPendingBit(TIM2, TIM_IT_CC3); //清除中断标志位 } } 使用到更新中断捕获是因为当输入信号脉宽很大时,捕获寄存器的值可能会溢出,使用更新中断记录溢出次数后就可以计算多大脉宽都没问题。 void CalcPulseWidth(stUserTimCaptureStructure *userCaptureStru) { u32 pulseWidthValue = 0; u16 ledDutyVal; u16 laserDutyVal; double signalDuty; if(userCaptureStru-》captureFinishFlag) //捕獲完成 { pulseWidthValue = ((userCaptureStru-》captureRegVal+1) + userCaptureStru-》captureUpatePeriod * (TIM2_ARR+1)); //计算出占空比 1.0/TIM_PSC_CLK 是定时器时钟周期 //10000是外部信号的频率 signalDuty = (double)pulseWidthValue*(1.0/TIM_PSC_CLK) * 10000; printf(“signalDuty = %2.2frn”, signalDuty); ledDutyVal = signalDuty * 3600; TIM_SetCompare1(TIM1, ledDutyVal ); //以同样的占空比控制其他LED laserDutyVal = signalDuty * TIM2_ARR; TIM_SetCompare4(TIM2, laserDutyVal); //以同样的占空比控制其他LED } } 问题记录 原来自己计算的脉宽值: pulseWidthValue = (userCaptureStru-》captureRegVal + userCaptureStru-》captureUpatePeriod * TIM2_ARR); 昨儿计算脉宽时很挺正常的。今天将输入捕获的PWM频率改成10KHZ,一旦占空比调大到70以上后就会出现计算的占空比不准的问题。 将计算脉宽值的式子改成: pulseWidthValue = ((userCaptureStru-》captureRegVal+1) + userCaptureStru-》captureUpatePeriod * (TIM2_ARR+1)); 此后,调大信号发生器PWM信号的占空比,通过查看计算出来的占空比和信号发生器产生的PWM信号的占空比对比也是一致的。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1784 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1088 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
729 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
734浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
559浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:12 , Processed in 0.743714 second(s), Total 48, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号