
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;
} } |
方波控制,光标这一段,相电流为啥上升了,之前怀疑是这个时候,同时开了三个MOS管,但实测波形,跟段波形有点滞后,而且时间也没那么长。
STM32MP135D的TIM2使用ETR作为外部时钟时,无法使用PE15作为输入
如何利用TIM1触发HRTIM TIMA生成频率为20Hz的100ns脉冲波?
STM32G473RC timer8的CCDS bit, Capture/Compare DMA selection.
STM32H7+SAI+DMA双缓冲配置失败.
利用stm32f412 的SPI 的DMA 模式读取外部ADC数据如何提高效率
FW_H7 V1.12.1-HAL库DMA双缓冲配置
STM32G431 数据手册上有个图有点不理解
请问大家有没有遇到过芯片内存的数据和下载的不一样的?
STM32G473RC多个定时器同步的问题