硬汉嵌入式论坛

 找回密码
 立即注册
查看: 765|回复: 4
收起左侧

[ADC] STM32H743 有关ADC实时采样的问题

[复制链接]

6

主题

24

回帖

42

积分

新手上路

积分
42
发表于 2025-3-9 21:45:42 | 显示全部楼层 |阅读模式
先简述一下我的情况:我是用TIM3来同步触发ADC1和ADC3,这个同步采样没啥问题。假如一开始ADC1采样正弦波,ADC3采样方波(波形由外部的信号发生器调整),按下一次按键后,在串口中打印出他们采样的数据波形。现在,上电,按下按键,串口正常打印出了ADC1的正弦波和ADC3的方波;改变ADC1采样的波形为方波,ADC3不变,按下按键,这时候问题来了,打印出来的ADC1采样的波形还是正弦波,ADC3是方波,再按下一次按键后,打印出的数据才是正常的。就是这个问题,搞了两三天没啥头脑,是DMA的问题吗?大佬帮忙看一下问题

以下是我的CubeMX中的配置和软件中的代码(ADC1和ADC3的配置是一样的):



#include "main.h"
#include "adc.h"
#include "dac.h"
#include "dma.h"
#include "memorymap.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "fmc.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
//----------- ADC -----------//
__attribute__((section (".RAM_SDRAM"))) ADC_DMASamplingConfig        ADC_Channels[2];        /* 定义包含 ADC1_CH3 和 ADC3_CH3 的数组 */

//----------- FFT -----------//
__attribute__((section (".RAM_SDRAM"))) SP_UnlimitedFFTData        infinite_fft_s[2];
SP_FFTPeakInfo fft_Peak_Data[2];

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void PeriphCommonClock_Config(void);
static void MPU_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
        if(hadc->Instance == ADC1){
//                HAL_ADC_Stop_DMA(&hadc1);                                                        /* 停止DMA以防止数据覆盖 */       
                ADC_Channels[0].ADC_ConvEnd_Flag = 1;                /* ADC采集DMA搬运结束标志位置一 */
        }
        if(hadc->Instance == ADC3){
//                HAL_ADC_Stop_DMA(&hadc3);                                                        /* 停止DMA以防止数据覆盖 */       
                ADC_Channels[1].ADC_ConvEnd_Flag = 1;                /* ADC采集DMA搬运结束标志位置一 */
        }
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* Enable the CPU Cache */

  /* Enable I-Cache---------------------------------------------------------*/
  SCB_EnableICache();

  /* Enable D-Cache---------------------------------------------------------*/
  SCB_EnableDCache();

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  delay_init(400);                /* 延时函数初始化 主频:400MHz */
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* Configure the peripherals common clocks */
  PeriphCommonClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM6_Init();
  MX_USART2_UART_Init();
  MX_DAC1_Init();
  MX_ADC1_Init();
  MX_TIM3_Init();
  MX_TIM7_Init();
  MX_SPI4_Init();
  MX_ADC3_Init();
  MX_FMC_Init();
  /* USER CODE BEGIN 2 */
        //------------
        // LED
        //------------
        LED0_TOGGLE();
        //------------------------------------------------------
        // TFTLCD
        //------------------------------------------------------
        lcd_init();
        #if PICTURE_USE_FLAG
        lcd_show_pieture(0,160,480,480,(uint16_t *)gImage_Test);
        lcd_show_pieture(45,64,64,64,(uint16_t *)gImage_tong);
        lcd_show_pieture(154,64,64,64,(uint16_t *)gImage_xin);
        lcd_show_pieture(263,64,64,64,(uint16_t *)gImage_dian);
        lcd_show_pieture(372,64,64,64,(uint16_t *)gImage_zi);
        #endif
        //---------------------------------------------------------------------------------------------
        // 设置采样率
        //---------------------------------------------------------------------------------------------
        ADC_Channels[0].SamplingRate = Set_SamplingRate(&htim3,200000000,163840);                                                                                /* 必须要在定时器启动前进行设置!*/
        ADC_Channels[1].SamplingRate = ADC_Channels[0].SamplingRate;
        //---------------------------------------------------------------------------------------------
        // ADC-DMA 启动
        //---------------------------------------------------------------------------------------------                                                                                                                                                                                                                                                                                       
  HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);                                                /* ADC 校准 */
        HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);                                                /* ADC 校准 */
  delay_ms(50);                                                                                                                                                                                                                                                                                                /* 给ADC时间校准 */
        HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Channels[0].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));        /* 启动DMA转换ADC_DMA_SAMPLE_LENGTH次,完成后回调callback */
        HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&ADC_Channels[1].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));        /* 启动DMA转换ADC_DMA_SAMPLE_LENGTH次,完成后回调callback */
  HAL_TIM_Base_Start(&htim3);                                                                                                                                                                                                                                        /* 启动定时器3 */
        //---------------------------------------------------------------------------------------------
        // 打印初始化信息
        //---------------------------------------------------------------------------------------------
  Set_Current_USART(USART1_IDX);
        printf("\r\n\r\n");
        printf("STM32H743ADC最高采样频率:1.8MHz\r\n");
        printf("采样100kHz及以上频率信号时,串口波特率以及采样保持时间也会影响采样到的波形完整性\r\n");
        printf("对实时采样来说,信号频率越高时采样频率也要越高,采样频率越高则采样保持时间也要越大(不一定)\r\n");
        printf("并且采样保持时间建议在1.5T/2.5T/8.5T之间选择,越大则也会影响采样精度\r\n");
  printf("ADC的转换过程包括采样阶段和转换阶段,接近极限采样率时,输入信号的电压在短时间内可能无法稳定下来,从而造成不准确的采样结果\r\n");
  printf("STM32的ADC具有较高的输入阻抗,但采样频率过高时,电容的充电时间可能无法跟上输入信号的变化,从而影响采样的准确性\r\n");
  printf("故当输入信号频率较高时,最好采用等效采样的方法或使用AD模块\r\n");
        printf("APB1 Timer时钟频率:%d Hz\r\n",HAL_RCC_GetPCLK1Freq()*2);
        printf("采样率:%d Hz\r\n\r\n",ADC_Channels[0].SamplingRate);
        printf("现在有两个FFT运算工程:1、DSP库实现FFT(myfft.c)        2、重新实现不限制点数FFT(fft.c)\r\n");
        printf("一、DSP库实现FFT(myfft.c):\r\n");
        printf("使用的是DSP库来实现FFT,所提供的运算点数有:256、512、1024、2048、4096,最低只能256个点,最高只能4096个点\r\n");
        printf("二、重新实现不限制点数FFT(myfft.c):\r\n");
        printf("由于DSP库限制最大只能4096点,对于高采样率来说,频率分辨率会较差。\r\n");
        printf("重新实现的FFT函数不限制点数,满足2^n即可,n最小值4,即16个点的FFT,而最大值不限。\r\n\r\n");
        printf("使用且需改变采样点数:1、使用且改变DSP库实现的FFT点数        2、使用且改变重新实现不限制点数的FFT点数\r\n");
        printf("一、使用且改变DSP库实现的FFT点数:\r\n");
        printf("修改位置:1. myfft.h 中 FFT_LENGTH 的值        2. adc.h 中 ADC_DMA_SAMPLE_LENGTH 的值        3. WindowingFunction.h 中 WINDOW_LENGTH 的值\r\n");
        printf("注意事项:FFT_LENGTH = ADC_DMA_SAMPLE_LENGTH = WINDOW_LENGTH\r\n\r\n");
        printf("二、使用且改变重新实现不限制点数的FFT点数:\r\n");
        printf("修改位置:1. FFTInc.h 中 MAX_FFT_N 的值        2. adc.h 中 ADC_DMA_SAMPLE_LENGTH 的值        3. WindowingFunction.h 中 WINDOW_LENGTH 的值\r\n");
        printf("注意事项:MAX_FFT_N = ADC_DMA_SAMPLE_LENGTH = WINDOW_LENGTH\r\n");
        //------------------------------------------------------------------
        // DAC
        //------------------------------------------------------------------
        uint32_t DAC_Freq = 5000;        /* DAC 输出信号频率 */
        DAC_Init(CHANNEL_1);                        /* DAC ch1 初始化 */
        DAC_Init(CHANNEL_2);                        /* DAC ch2 初始化 */
        DAC_GenerateWave(SINE, DAC_CHANNEL_1, DAC_Freq, 2, DAC_WAVE_LENGTH);        /* DAC 输出信号:波形 通道 频率 幅值 点数*/
        DAC_GenerateWave(SINE, DAC_CHANNEL_2, DAC_Freq, 2, DAC_WAVE_LENGTH);        /* DAC 输出信号:波形 通道 频率 幅值 点数 */
        Set_Current_USART(USART1_IDX);
        //------------------------------------------------
        // AD9833
        //------------------------------------------------
        delay_ms(200);                                                                                                                                                                /* 使 AD9833 先上电 */
        AD9833_A_Init();                                                                                                                                                        /* AD9833_A 初始化 */
        AD9833_B_Init();                                                                                                                                                        /* AD9833_B 初始化 */
        AD9833_A_SetFrequencyQuick(1000.0, AD9833_A_SINE);                /* AD9833_A 输出信号:频率 波形 */
        AD9833_B_SetFrequencyQuick(1000.0, AD9833_B_SINE);                /* AD9833_B 输出信号:频率 波形 */
        //------------------------------------------------
        // AD9959
        //------------------------------------------------
        delay_ms(200);                                                                                        /* 使 AD9959 先上电 */
        AD9959_Init();                                                                                        /* AD9959 初始化 */
        AD9959_enablechannel0();                                                 /* 使能通道0 */
        AD9959_Setwavefrequency(1000000);                /* AD9959 输出信号:频率 */
        AD9959_enablechannel1();                                                 /* 使能通道1 */
        AD9959_Setwavefrequency(2000000);                /* AD9959 输出信号:频率 */
        AD9959_enablechannel2();                                                 /* 使能通道2 */
        AD9959_Setwavefrequency(3000000);                /* AD9959 输出信号:频率 */
        AD9959_enablechannel3();                                                 /* 使能通道3 */
        AD9959_Setwavefrequency(4000000);                /* AD9959 输出信号:频率 */
       
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                uint8_t Key = KEY_Scan(0);

                if(ADC_Channels[0].ADC_ConvEnd_Flag == 1 && ADC_Channels[1].ADC_ConvEnd_Flag == 1 && Key == 4){
                        ADC_Channels[0].ADC_ConvEnd_Flag = 0;
                        ADC_Channels[1].ADC_ConvEnd_Flag = 0;
                        Key = 0;
                       
                        /* 将采集到的整形数据提前转换为浮点数据存储 */
                        for(int i=0; i<ADC_DMA_SAMPLE_LENGTH; i++)        ADC_Channels[0].DMA_floatData[i] = ADC_Channels[0].DMA_Buffer[i];
                        for(int i=0; i<ADC_DMA_SAMPLE_LENGTH; i++)        ADC_Channels[1].DMA_floatData[i] = ADC_Channels[1].DMA_Buffer[i];
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
//主程序区:
                       
                        // FFT测试
                        Infinite_FFT(ADC_Channels[0].DMA_floatData, infinite_fft_s[0].fft_Input, infinite_fft_s[0].fft_Output, MAX_FFT_N);
                        Infinite_FFT(ADC_Channels[1].DMA_floatData, infinite_fft_s[1].fft_Input, infinite_fft_s[1].fft_Output, MAX_FFT_N);
                        /* 串口打印 */
                        for(uint32_t i=0;i<ADC_DMA_SAMPLE_LENGTH/8;i++){
                                printf("%f,%f,%f,%f\r\n", ADC_Channels[0].DMA_floatData[i]*ZOOM, ADC_Channels[1].DMA_floatData[i]*ZOOM, infinite_fft_s[0].fft_Output[i], infinite_fft_s[1].fft_Output[i]);
                        }
                        /* LCD */
                        lcd_clear(BLACK);
                        lcd_draw_line(288, 0, 288, 800, RED);
                        lcd_draw_line(96 , 0, 96 , 800, RED);
                        for(uint32_t i=0;i<800;i++){
                                lcd_draw_line(ADC_Channels[0].DMA_floatData[i]*96.0/65535.0+384-48, i, ADC_Channels[0].DMA_floatData[i+1]*96.0/65535.0+384-48, i+1, YELLOW);
                                lcd_draw_line(ADC_Channels[1].DMA_floatData[i]*96.0/65535.0+192-48, i, ADC_Channels[1].DMA_floatData[i+1]*96.0/65535.0+192-48, i+1, LIGHTBLUE);
                               
                                lcd_draw_line(infinite_fft_s[0].fft_Output[i]*50.0+288, i+10, infinite_fft_s[0].fft_Output[i+1]*50.0+288, i+10+1, RED);
                                lcd_draw_line(infinite_fft_s[1].fft_Output[i]*50.0+96, i+10, infinite_fft_s[1].fft_Output[i+1]*50.0+96, i+10+1, RED);
                        }
                       
//                        arm_max_f32(&infinite_fft_s[0].fft_Output[1],MAX_FFT_N/2,&fft_Peak_Data[0].MaxAmp,&fft_Peak_Data[0].MaxAmp_Index);
//                        arm_max_f32(&infinite_fft_s[1].fft_Output[1],MAX_FFT_N/2,&fft_Peak_Data[1].MaxAmp,&fft_Peak_Data[1].MaxAmp_Index);
//                       
//                        lcd_draw_line(288, 50, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*0]*50.0+288, 50, RED);
//                        lcd_draw_line(288, 100, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*1]*500.0+288, 100, RED);
//                        lcd_draw_line(288, 150, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500.0+288, 150, RED);
//                        lcd_draw_line(288, 200, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500.0+288, 200, RED);
//                        lcd_draw_line(288, 250, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500.0+288, 250, RED);
//                        lcd_draw_line(288, 300, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500.0+288, 300, RED);
//                        lcd_draw_line(288, 350, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*6]*500.0+288, 350, RED);
//                        lcd_draw_line(288, 400, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*7]*500.0+288, 400, RED);
//                        lcd_draw_line(288, 450, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*8]*500.0+288, 450, RED);
//                        lcd_draw_line(288, 500, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*9]*500.0+288, 500, RED);
//                        lcd_draw_line(288, 550, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*10]*500.0+288, 550, RED);
//                        lcd_draw_line(288, 600, infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*11]*500.0+288, 600, RED);
//                       
//                        lcd_draw_line(96, 50, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*0]*50.0+96, 50, RED);
//                        lcd_draw_line(96, 100, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*1]*500.0+96, 100, RED);
//                        lcd_draw_line(96, 150, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500.0+96, 150, RED);
//                        lcd_draw_line(96, 200, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500.0+96, 200, RED);
//                        lcd_draw_line(96, 250, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500.0+96, 250, RED);
//                        lcd_draw_line(96, 300, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500.0+96, 300, RED);
//                        lcd_draw_line(96, 350, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*6]*500.0+96, 350, RED);
//                        lcd_draw_line(96, 400, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*7]*500.0+96, 400, RED);
//                        lcd_draw_line(96, 450, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*8]*500.0+96, 450, RED);
//                        lcd_draw_line(96, 500, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*9]*500.0+96, 500, RED);
//                        lcd_draw_line(96, 550, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*10]*500.0+96, 550, RED);
//                        lcd_draw_line(96, 600, infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*11]*500.0+96, 600, RED);



                        printf("信号1    直流:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*0]*500, fft_Peak_Data[0].MaxAmp_Index*0);
                        printf("信号1    基波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*1]*500, fft_Peak_Data[0].MaxAmp_Index*1);
                        printf("信号1二次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
                        printf("信号1三次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);
                        printf("信号1四次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500,fft_Peak_Data[0].MaxAmp_Index*4);
                        printf("信号1五次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500,fft_Peak_Data[0].MaxAmp_Index*5);
                        printf("信号1六次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
                        printf("信号1七次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);
                        printf("信号1八次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*4]*500,fft_Peak_Data[0].MaxAmp_Index*4);
                        printf("信号1九次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*5]*500,fft_Peak_Data[0].MaxAmp_Index*5);
                        printf("信号1十次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*2]*500,fft_Peak_Data[0].MaxAmp_Index*2);
                        printf("信号1十一次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[0].MaxAmp_Index*3]*500,fft_Peak_Data[0].MaxAmp_Index*3);

                        printf("\r\n");
                        printf("信号2    直流:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*0]*500, fft_Peak_Data[1].MaxAmp_Index*0);
                        printf("信号2    基波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*1]*500, fft_Peak_Data[1].MaxAmp_Index*1);
                        printf("信号2二次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
                        printf("信号2三次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
                        printf("信号2四次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500,fft_Peak_Data[1].MaxAmp_Index*4);
                        printf("信号2五次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500,fft_Peak_Data[1].MaxAmp_Index*5);
                        printf("信号2六次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
                        printf("信号2七次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
                        printf("信号2八次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*4]*500,fft_Peak_Data[1].MaxAmp_Index*4);
                        printf("信号2九次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*5]*500,fft_Peak_Data[1].MaxAmp_Index*5);
                        printf("信号2十次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[1].fft_Output[fft_Peak_Data[1].MaxAmp_Index*2]*500,fft_Peak_Data[1].MaxAmp_Index*2);
                        printf("信号2十一次谐波:\r\n峰值:%f 索引%d\r\n",infinite_fft_s[0].fft_Output[fft_Peak_Data[1].MaxAmp_Index*3]*500,fft_Peak_Data[1].MaxAmp_Index*3);
                        printf("\r\n");
                        printf("\r\n");
                       

                       
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
                        HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Channels[0].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));
                        HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&ADC_Channels[1].DMA_Buffer, ADC_DMA_SAMPLE_LENGTH * sizeof(uint16_t));                       
                       
                       
                }
  }
}

ADC配置

ADC配置

DMA配置

DMA配置
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2025-3-9 21:48:56 | 显示全部楼层
DMA半字和一字的宽度以及DMA的循环和普通模式都试过了,就是不行
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2025-3-10 09:14:04 | 显示全部楼层
将这个函数SCB_EnableDCache();设置为SCB_DisableDCache(); 看看效果好点不
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2025-3-10 12:07:53 | 显示全部楼层
eric2013 发表于 2025-3-10 09:14
将这个函数SCB_EnableDCache();设置为SCB_DisableDCache(); 看看效果好点不

还是不行,我把MPU中的缓存关了也不行
回复

使用道具 举报

6

主题

24

回帖

42

积分

新手上路

积分
42
 楼主| 发表于 2025-3-10 16:04:04 | 显示全部楼层
eric2013 发表于 2025-3-10 09:14
将这个函数SCB_EnableDCache();设置为SCB_DisableDCache(); 看看效果好点不

问题解决了,使用DMA循环模式再改一下采样逻辑就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 06:14 , Processed in 0.050507 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表