include "freq_meter.h"include "ws2812b.h"uint16_t Capture_Raise[IC_BufSize] = {0x0000}; //CH1的DMA缓冲区,用于存放上升沿捕获数据 uint16_t Capture_Fall[IC_BufSize] = {0x0000}; //CH2的DMA缓冲区,用于存放下降沿捕获数据 uint16_t Avg_Raise = 0x0000; uint16_t Avg_Fall = 0x0000; float Freq_Capture_Freq = 0.0; //所测信号频率 float Freq_Capture_Duty = 0.0; //所测信号占空比 extern WS2812B_OBJ_T ESHL_StateLed; uint8_t i=0; void Freq_Meter_Init(void) { //开始TIM2CH1的DMA传输 HAL_TIM_IC_Start_DMA(&PWM_In_Timer, TIM_CHANNEL_1, (uint32_t)Capture_Fall, IC_BufSize); //还原TIM2状态,然后开始TIM2CH2的DMA传输 PWM_In_Timer.State = HAL_TIM_STATE_READY; HAL_TIM_IC_Start_DMA(&PWM_In_Timer, TIM_CHANNEL_2, (uint32_t)Capture_Raise, IC_BufSize); } void Freq_Meter_DeInit(void) { HAL_TIM_IC_Stop_DMA(&PWM_In_Timer, TIM_CHANNEL_1); HAL_TIM_IC_Stop_DMA(&PWM_In_Timer, TIM_CHANNEL_2); } void Freq_Calc(void) { Avg_Raise = 0; Avg_Fall = 0; //取平均值 for(uint16_t i = 0; i < IC_BufSize; i++) { Avg_Raise += Capture_Raise[i]; Avg_Fall += Capture_Fall[i]; } Avg_Raise /= IC_BufSize; Avg_Fall /= IC_BufSize; //计算频率及占空比 if(Avg_Raise != 0) { Freq_Capture_Freq = (float)TIM_Clock / (float)((TIM_PSC + 1) * Avg_Raise); Freq_Capture_Duty = (float)Avg_Fall / (float)Avg_Raise; } } // 添加全局变量跟踪DMA传输状态 uint8_t dma_ch1_complete = 0; uint8_t dma_ch2_complete = 0; // DMA传输完成回调 void HAL_TIM_IC_CaptureCpltCallback(TIM_HandleTypeDef *htim) { i = (i + 1) % 255; if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { dma_ch1_complete = 1; } else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { dma_ch2_complete = 1; } // 两个通道都完成时才计算 if (dma_ch1_complete && dma_ch2_complete) { Freq_Calc(); dma_ch1_complete = 0; dma_ch2_complete = 0;
} } |
stm32 定时器外部时钟1的TI1FP1及TI2FP2的设置问题
STM32F1定时器中触发信号TRC的来源及选择配置是怎么样的
STM32H7A3VGTA QSPI读W25Q128J DMA模式不能工作
STM32G474VET6如何配置HRTIM的中心对齐模式
使用CubeMx第二次生成的代码编译时报错
无刷电机PWM输出配置
//STM32H7A3VGT6 QSPI的DMA方式无法正常工作
STM32G474 HRTIM 推挽模式下 关闭死区 在比较寄存器较小的情况下,存在输出脉宽直接到100%
stm32电源部分
ST MotorControl Workbench 生成代码过程中报错Java的非法反射警告
微信公众号
手机版
如果你启用了Timer通道的捕获中断,并使用库提供中断服务函数,
当发生捕获中断后,在库的中断服务程序里会调用HAL_TIM_IC_CaptureCpltCallback。
而且该函数的具体内容由用户重写完成。