
在利用“通用定时器”捕获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; } |
串口DMA + 空闲中断收发 ?
F103RCT6芯片对AFIO->MAPR寄存器写入时出错
使用STM32捕获PWM时同时捕获2个通道时会出现捕获的频率值不准确的问题
WS2812B怎么显示任意字符 / 图案?
STM32F103RCT6 定位孔 镂空,会影响使用吗?
HAL库1.8.4在做破坏性测试的时候出现g_state永远为busy的情况导致串口通信发送卡死
L9663驱动开发
用rt_thread 环境编写,DAP-LINK 下载烧录,每一次空芯片下载之后就无法二次下载。求解
stm32cubemx F103芯片tim3 encoder模式pc6和pc7引脚,自动生成代码缺少gpio映射。
stm32的同一个定时器,不同的通道,可以不同时的输出pwm波形吗
第一种模式基于一个通道,中途要做捕获边沿的切换。特点是只需要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