在利用“通用定时器”捕获PWM信号的过程中,我们的中断服务函数是设置为如下的哪一种模式呢?模式1和模式2: 模式1: if ( TIM_GetITStatus ( GENERAL_TIM, TIM_IT_Update) != RESET ) { TIM_ICUserValueStructure.Capture_Period ++; TIM_ClearITPendingBit ( GENERAL_TIM, TIM_FLAG_Update ); } // 上升沿捕获中断 if ( TIM_GetITStatus (GENERAL_TIM, GENERAL_TIM_IT_CCx ) != RESET) { // 第一次捕获 if ( TIM_ICUserValueStructure.Capture_StartFlag == 0 ) { // 计数器清0 TIM_SetCounter ( GENERAL_TIM, 0 ); // 自动重装载寄存器更新标志清0 TIM_ICUserValueStructure.Capture_Period = 0; // 存捕获比较寄存器的值的变量的值清0 TIM_ICUserValueStructure.Capture_CcrValue = 0; // 当第一次捕获到上升沿之后,就把捕获边沿配置为下降沿 GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Falling); // 开始捕获标准置1 TIM_ICUserValueStructure.Capture_StartFlag = 1; } // 下降沿捕获中断 else // 第二次捕获 { // 获取捕获比较寄存器的值,这个值就是捕获到的高电平的时间的值 TIM_ICUserValueStructure.Capture_CcrValue = GENERAL_TIM_GetCapturex_FUN (GENERAL_TIM); // 当第二次捕获到下降沿之后,就把捕获边沿配置为上升沿,好开启新的一轮捕获 GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Rising); // 开始捕获标志清0 TIM_ICUserValueStructure.Capture_StartFlag = 0; // 捕获完成标志置1 TIM_ICUserValueStructure.Capture_FinishFlag = 1; } TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx); } 模式2: /* 清除中断标志位 */ TIM_ClearITPendingBit(GENERAL_TIM, TIM_IT_CC1); /* 获取输入捕获值 */ IC1Value = TIM_GetCapture1(GENERAL_TIM); IC2Value = TIM_GetCapture2(GENERAL_TIM); // 注意:捕获寄存器CCR1和CCR2的值在计算占空比和频率的时候必须加1 if (IC1Value != 0) { /* 占空比计算 */ DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1); /* 频率计算 */ Frequency = (72000000/(ADVANCE_TIM_PSC+1))/(float)(IC1Value+1); printf("占空比:%0.2f%% 频率:%0.2fHz\n",DutyCycle,Frequency); } else { DutyCycle = 0; Frequency = 0; } |
STM32 CAN通讯收发异常
STM32IDE工程内如何访问、计算得到当前程序flash已经使用的情况?
数据丢失
STM32F107RBT6 页擦除函数返回值成功但目标扇区数据并未擦除
L6235Q驱动MAXON三相无刷直流电机,FWD引脚接入PWM波,占空比50%的时候电机不转动,其他占空比电机转动,数据手册并没提及,请问有什么依据吗?
板子肯定没问题,用cubeprogrammer烧录报错
STM32F103ZET6 CS信号无法拉高
在FreeRTOS中串口重定向使用HAL库函数中断出现异常
STM32F103C8T6 有没有过UL认证?
小白求助,结束while循环后会跳转至循环前继续执行的问题?
第一种模式基于一个通道,中途要做捕获边沿的切换。特点是只需要1个捕获通道,但需做捕获边沿切换 。第二种模式是基于定时器复位从模式,要使用2个捕获通道,分别捕捉上沿和下沿,无须中途做捕获沿的切换。在捕获过程中没有发生计数器溢出的话,捕获值获得简单。
从你给出的代码来看,似乎待测信号宽度不会长于计数周期,即无须统计溢出次数,否则得考虑溢出次数。
另外,若使用模式2的话,在发生通道1捕获事件后就进行频率及占空比计算的话,应该保证通道2已经做过捕获并获得捕获值。
关于PWM的测量,官方有现成的例程呀,可以参考。
另外中断里最好不要用printf 函数,占用时间有点长。
STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input