硬汉嵌入式论坛

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

[有问必答] 关于stm32f4用AD7606采集交流信号的问题

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2025-7-12 17:29:11 | 显示全部楼层 |阅读模式
求助各位兄弟帮忙看看,最近在使用安富莱的AD7606采集电压时出了问题,采集一个直流电压数据是没有问题的,采集交流电压的话数据输出都是正数,如果采集一个0轴以上的交流信号数据也是不正确,会乱跳动,这是我的代码,求助各位帮忙看看出了什么问题。我的pwm频率是50k,采集的信号是1k的。


/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "string.h"
#include "AD9833.h"
#include "AD9833_Setup.h"

volatile uint16_t SAMPLING_POINTS = 55;
volatile uint8_t nums = 0;
volatile uint8_t ad7606SamplingDoneFlag = 0;
volatile float data[8][55];
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* 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);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void AD7606_STM32F407VET6(uint8_t RANGE, uint8_t OS)
{
        volatile uint16_t ii = 0;
  volatile uint8_t MODE = 0;
  volatile uint8_t M[3] = {0x00, 0x00, 0x00};
       
        /*Initialize CS pin*/
//        HAL_GPIO_WritePin(GPIOA, AD_CS_PIN_Pin, GPIO_PIN_RESET);
       
        /*Reset AD7606*/
        HAL_GPIO_WritePin(GPIOA, AD_RESET_PIN_Pin, GPIO_PIN_RESET);
        HAL_Delay(1);
        HAL_GPIO_WritePin(GPIOA, AD_RESET_PIN_Pin, GPIO_PIN_SET);
        HAL_Delay(1);
        HAL_GPIO_WritePin(GPIOA, AD_RESET_PIN_Pin, GPIO_PIN_RESET);
       
//        /*PWM*/
//        HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);      //CA通道转换
       
        /*Define OS pin*/
        MODE = OS;
        for(ii=0;ii<3;ii++)
  {
                M[ii] = MODE % 2;
    MODE = MODE / 2;
  }
         if(M[0] == 1)
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS0_PIN_Pin, GPIO_PIN_SET);
         }
         else
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS0_PIN_Pin, GPIO_PIN_RESET);
         }
         if(M[1] == 1)
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS1_PIN_Pin, GPIO_PIN_SET);
         }
         else
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS1_PIN_Pin, GPIO_PIN_RESET);
         }
         if(M[2] == 1)
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS2_PIN_Pin, GPIO_PIN_SET);
         }
         else
         {
                 HAL_GPIO_WritePin(GPIOB, AD_OS2_PIN_Pin, GPIO_PIN_RESET);
         }
         if(RANGE == 1)
         {
                 HAL_GPIO_WritePin(GPIOA, AD_RANGE_PIN_Pin, GPIO_PIN_SET);
         }
         else
         {
                 HAL_GPIO_WritePin(GPIOA, AD_RANGE_PIN_Pin, GPIO_PIN_RESET);
         }
         /*PWM*/
         HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);      //CA通道转换
}
/* USER CODE END 0 */

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

  /* USER CODE BEGIN 1 */
        char buffer[8];
        volatile int32_t i=0;
  /* USER CODE END 1 */

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

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

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

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

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_TIM2_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
       
        AD9833_Typedef AD9833_1;
  AD9833_Init(&AD9833_1);
        float Frequency,Phase;
        Frequency=1000;
        Phase=0;
        AD9833_SetWave(SIN, *(&AD9833_1));      
        AD9833_SetWaveData(Frequency,Phase,*(&AD9833_1));
       
        char msg[30];
        sprintf(msg, "ad7606\n");
        HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 10);
       
        HAL_NVIC_DisableIRQ(EXTI4_IRQn);
        AD7606_STM32F407VET6(0, 0);
        HAL_NVIC_EnableIRQ(EXTI4_IRQn);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                if(ad7606SamplingDoneFlag == 1)
                {
//                        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 105);
                        HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2);        //停止转换
                        // 计算均值和RMS
                        float mean = 0.0f, sum_squares = 0.0f;
                        for(int n = 5; n < SAMPLING_POINTS; n++) {
                                        mean += data[0][n];
                                        sum_squares += data[0][n] * data[0][n];
                        }
                        mean /= (SAMPLING_POINTS-5);
                        float rms = sqrtf(sum_squares / (SAMPLING_POINTS-5));
                       
                        for (uint16_t n = 5; n < SAMPLING_POINTS; n++)  // 注意: n < 100, 不是<=100
                        {
                                sprintf(buffer, "%1.4f\r\n", data[0][n]);       // 发送通道1数据
                                HAL_UART_Transmit(&huart3, (uint8_t*)buffer, strlen(buffer), 10);
                        }
                  sprintf(buffer, "Mean:%+1.4fV, RMS:%+1.4fV\r\n", mean, rms);
                        HAL_UART_Transmit(&huart3, (uint8_t*)buffer, strlen(buffer), 10);
                       
                        nums = 0;
                        ad7606SamplingDoneFlag = 0;
                        AD7606_STM32F407VET6(0, 0);
                        HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
                        __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 103);
                }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
        volatile uint8_t i = 0;
        volatile uint8_t first_bit = 0;
        uint8_t byte[2];
  volatile uint16_t receive;
  volatile uint8_t chari = 0;
        char buffer[8];
  if(GPIO_Pin == AD_BUSY_PIN_Pin)
        {
                if(ad7606SamplingDoneFlag == 0 && nums < SAMPLING_POINTS)
                {
                        for(i = 0; i < 8; i++)
                        {
                                HAL_GPIO_WritePin(GPIOA, AD_CS_PIN_Pin, GPIO_PIN_RESET);    //使能数据帧传输
                                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
                                HAL_SPI_Receive(&hspi1, byte, 2, 100);                      //提取V1通道数据
                                __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
                                uint16_t receive = (byte[0] << 8) | byte[1];                //将两个8位数据整合成一个16位数据
//                                first_bit = (byte[0] >> 7) & 1;                             //提取接收数据的符号位,1-,0+
                                int16_t raw_value = (int16_t)receive;                       // 正确处理二进制补码
                                data[i][nums] = (raw_value+21) * 5.0f / 32768.0f;                // ±5V范围
//                                data[i][nums] = raw_value;
                                HAL_GPIO_WritePin(GPIOA, AD_CS_PIN_Pin, GPIO_PIN_SET);
                        }
                        nums++;
                        if(nums >= SAMPLING_POINTS)
                        {
                                ad7606SamplingDoneFlag = 1;      //nums=100时,停止读数据
                        }
                }
        }
}
//void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
//    if (GPIO_Pin == AD_BUSY_PIN_Pin) {
//        HAL_UART_Transmit(&huart3, (uint8_t*)"BUSY IRQ!\n", 10, 100);
//    }
//}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-14 09:04:48 | 显示全部楼层
采集的波形效果发图看下。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-14 10:31:17 | 显示全部楼层
这几张图都是采集出来的波形,采集的是一个0轴以上的有效值为0.4v的正弦信号
96af6e1a96ab7c849333b930b5fea48a.png
4a9f1408019324a7fa616f5d5ccc13f5.png
2537bf4f21aff0de11b172601df2f54e.png
f2dbe8708152c52c5e5fb324fadb58c5.png
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-14 10:32:31 | 显示全部楼层
eric2013 发表于 2025-7-14 09:04
采集的波形效果发图看下。

我的波形都放下面的回复了,直接回复你放不了图片
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-14 12:44:05 | 显示全部楼层
xiaoyangw 发表于 2025-7-14 10:31
这几张图都是采集出来的波形,采集的是一个0轴以上的有效值为0.4v的正弦信号

这个采集的效果有点差,完整的代码配置我看下
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-14 15:30:13 | 显示全部楼层
eric2013 发表于 2025-7-14 12:44
这个采集的效果有点差,完整的代码配置我看下

gpio.c文件
void MX_GPIO_Init(void)
{

&#160; GPIO_InitTypeDef GPIO_InitStruct = {0};

&#160; /* GPIO Ports Clock Enable */
&#160; __HAL_RCC_GPIOC_CLK_ENABLE();
&#160; __HAL_RCC_GPIOH_CLK_ENABLE();
&#160; __HAL_RCC_GPIOA_CLK_ENABLE();
&#160; __HAL_RCC_GPIOB_CLK_ENABLE();

&#160; /*Configure GPIO pin Output Level */
&#160; HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);

&#160; /*Configure GPIO pin Output Level */
&#160; HAL_GPIO_WritePin(GPIOA, AD_CS_PIN_Pin|AD_RESET_PIN_Pin|AD_RANGE_PIN_Pin, GPIO_PIN_RESET);

&#160; /*Configure GPIO pin Output Level */
&#160; HAL_GPIO_WritePin(GPIOB, AD_OS0_PIN_Pin|AD_OS1_PIN_Pin|AD_OS2_PIN_Pin, GPIO_PIN_RESET);

&#160; /*Configure GPIO pins : PC0 PC1 PC2 */
&#160; GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
&#160; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
&#160; GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
&#160; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

&#160; /*Configure GPIO pins : PAPin PAPin PAPin */
&#160; GPIO_InitStruct.Pin = AD_CS_PIN_Pin|AD_RESET_PIN_Pin|AD_RANGE_PIN_Pin;
&#160; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
&#160; GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
&#160; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

&#160; /*Configure GPIO pin : PtPin */
&#160; GPIO_InitStruct.Pin = AD_BUSY_PIN_Pin;
&#160; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
&#160; GPIO_InitStruct.Pull = GPIO_PULLUP;
&#160; HAL_GPIO_Init(AD_BUSY_PIN_GPIO_Port, &GPIO_InitStruct);

&#160; /*Configure GPIO pins : PBPin PBPin PBPin */
&#160; GPIO_InitStruct.Pin = AD_OS0_PIN_Pin|AD_OS1_PIN_Pin|AD_OS2_PIN_Pin;
&#160; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
&#160; GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
&#160; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

&#160; /* EXTI interrupt init*/
&#160; HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
&#160; HAL_NVIC_EnableIRQ(EXTI4_IRQn);

}


spi.c文件
#include "spi.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

SPI_HandleTypeDef hspi1;

/* SPI1 init function */
void MX_SPI1_Init(void)
{

&#160; /* USER CODE BEGIN SPI1_Init 0 */

&#160; /* USER CODE END SPI1_Init 0 */

&#160; /* USER CODE BEGIN SPI1_Init 1 */

&#160; /* USER CODE END SPI1_Init 1 */
&#160; hspi1.Instance = SPI1;
&#160; hspi1.Init.Mode = SPI_MODE_MASTER;
&#160; hspi1.Init.Direction = SPI_DIRECTION_2LINES;
&#160; hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
&#160; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
&#160; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
&#160; hspi1.Init.NSS = SPI_NSS_SOFT;
&#160; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
&#160; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
&#160; hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
&#160; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
&#160; hspi1.Init.CRCPolynomial = 10;
&#160; if (HAL_SPI_Init(&hspi1) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; /* USER CODE BEGIN SPI1_Init 2 */

&#160; /* USER CODE END SPI1_Init 2 */

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

&#160; GPIO_InitTypeDef GPIO_InitStruct = {0};
&#160; if(spiHandle->Instance==SPI1)
&#160; {
&#160; /* USER CODE BEGIN SPI1_MspInit 0 */

&#160; /* USER CODE END SPI1_MspInit 0 */
&#160;   /* SPI1 clock enable */
&#160;   __HAL_RCC_SPI1_CLK_ENABLE();

&#160;   __HAL_RCC_GPIOA_CLK_ENABLE();
&#160;   /**SPI1 GPIO Configuration
&#160;   PA5     ------> SPI1_SCK
&#160;   PA6     ------> SPI1_MISO
&#160;   PA7     ------> SPI1_MOSI
&#160;   */
&#160;   GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
&#160;   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
&#160;   GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160;   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
&#160;   GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
&#160;   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

&#160; /* USER CODE BEGIN SPI1_MspInit 1 */

&#160; /* USER CODE END SPI1_MspInit 1 */
&#160; }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{

&#160; if(spiHandle->Instance==SPI1)
&#160; {
&#160; /* USER CODE BEGIN SPI1_MspDeInit 0 */

&#160; /* USER CODE END SPI1_MspDeInit 0 */
&#160;   /* Peripheral clock disable */
&#160;   __HAL_RCC_SPI1_CLK_DISABLE();

&#160;   /**SPI1 GPIO Configuration
&#160;   PA5     ------> SPI1_SCK
&#160;   PA6     ------> SPI1_MISO
&#160;   PA7     ------> SPI1_MOSI
&#160;   */
&#160;   HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);

&#160; /* USER CODE BEGIN SPI1_MspDeInit 1 */

&#160; /* USER CODE END SPI1_MspDeInit 1 */
&#160; }
}

usart.c文件
#include "usart.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

UART_HandleTypeDef huart3;

/* USART3 init function */

void MX_USART3_UART_Init(void)
{

&#160; /* USER CODE BEGIN USART3_Init 0 */

&#160; /* USER CODE END USART3_Init 0 */

&#160; /* USER CODE BEGIN USART3_Init 1 */

&#160; /* USER CODE END USART3_Init 1 */
&#160; huart3.Instance = USART3;
&#160; huart3.Init.BaudRate = 115200;
&#160; huart3.Init.WordLength = UART_WORDLENGTH_8B;
&#160; huart3.Init.StopBits = UART_STOPBITS_1;
&#160; huart3.Init.Parity = UART_PARITY_NONE;
&#160; huart3.Init.Mode = UART_MODE_TX_RX;
&#160; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
&#160; huart3.Init.OverSampling = UART_OVERSAMPLING_16;
&#160; if (HAL_UART_Init(&huart3) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; /* USER CODE BEGIN USART3_Init 2 */

&#160; /* USER CODE END USART3_Init 2 */

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

&#160; GPIO_InitTypeDef GPIO_InitStruct = {0};
&#160; if(uartHandle->Instance==USART3)
&#160; {
&#160; /* USER CODE BEGIN USART3_MspInit 0 */

&#160; /* USER CODE END USART3_MspInit 0 */
&#160;   /* USART3 clock enable */
&#160;   __HAL_RCC_USART3_CLK_ENABLE();

&#160;   __HAL_RCC_GPIOB_CLK_ENABLE();
&#160;   /**USART3 GPIO Configuration
&#160;   PB10     ------> USART3_TX
&#160;   PB11     ------> USART3_RX
&#160;   */
&#160;   GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;
&#160;   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
&#160;   GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160;   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
&#160;   GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
&#160;   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

&#160; /* USER CODE BEGIN USART3_MspInit 1 */

&#160; /* USER CODE END USART3_MspInit 1 */
&#160; }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

&#160; if(uartHandle->Instance==USART3)
&#160; {
&#160; /* USER CODE BEGIN USART3_MspDeInit 0 */

&#160; /* USER CODE END USART3_MspDeInit 0 */
&#160;   /* Peripheral clock disable */
&#160;   __HAL_RCC_USART3_CLK_DISABLE();

&#160;   /**USART3 GPIO Configuration
&#160;   PB10     ------> USART3_TX
&#160;   PB11     ------> USART3_RX
&#160;   */
&#160;   HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11);

&#160; /* USER CODE BEGIN USART3_MspDeInit 1 */

&#160; /* USER CODE END USART3_MspDeInit 1 */
&#160; }
}

tim.c文件
#include "tim.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

TIM_HandleTypeDef htim2;

/* TIM2 init function */
void MX_TIM2_Init(void)
{

&#160; /* USER CODE BEGIN TIM2_Init 0 */

&#160; /* USER CODE END TIM2_Init 0 */

&#160; TIM_ClockConfigTypeDef sClockSourceConfig = {0};
&#160; TIM_MasterConfigTypeDef sMasterConfig = {0};
&#160; TIM_OC_InitTypeDef sConfigOC = {0};

&#160; /* USER CODE BEGIN TIM2_Init 1 */

&#160; /* USER CODE END TIM2_Init 1 */
&#160; htim2.Instance = TIM2;
&#160; htim2.Init.Prescaler = 16-1;
&#160; htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
&#160; htim2.Init.Period = 105-1;
&#160; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
&#160; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
&#160; if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
&#160; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
&#160; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
&#160; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; sConfigOC.OCMode = TIM_OCMODE_PWM1;
&#160; sConfigOC.Pulse = 103;
&#160; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
&#160; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
&#160; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
&#160; {
&#160;   Error_Handler();
&#160; }
&#160; /* USER CODE BEGIN TIM2_Init 2 */

&#160; /* USER CODE END TIM2_Init 2 */
&#160; HAL_TIM_MspPostInit(&htim2);

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

&#160; if(tim_baseHandle->Instance==TIM2)
&#160; {
&#160; /* USER CODE BEGIN TIM2_MspInit 0 */

&#160; /* USER CODE END TIM2_MspInit 0 */
&#160;   /* TIM2 clock enable */
&#160;   __HAL_RCC_TIM2_CLK_ENABLE();
&#160; /* USER CODE BEGIN TIM2_MspInit 1 */

&#160; /* USER CODE END TIM2_MspInit 1 */
&#160; }
}
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
{

&#160; GPIO_InitTypeDef GPIO_InitStruct = {0};
&#160; if(timHandle->Instance==TIM2)
&#160; {
&#160; /* USER CODE BEGIN TIM2_MspPostInit 0 */

&#160; /* USER CODE END TIM2_MspPostInit 0 */

&#160;   __HAL_RCC_GPIOA_CLK_ENABLE();
&#160;   /**TIM2 GPIO Configuration
&#160;   PA1     ------> TIM2_CH2
&#160;   */
&#160;   GPIO_InitStruct.Pin = GPIO_PIN_1;
&#160;   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
&#160;   GPIO_InitStruct.Pull = GPIO_NOPULL;
&#160;   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
&#160;   GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
&#160;   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

&#160; /* USER CODE BEGIN TIM2_MspPostInit 1 */

&#160; /* USER CODE END TIM2_MspPostInit 1 */
&#160; }

}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

&#160; if(tim_baseHandle->Instance==TIM2)
&#160; {
&#160; /* USER CODE BEGIN TIM2_MspDeInit 0 */

&#160; /* USER CODE END TIM2_MspDeInit 0 */
&#160;   /* Peripheral clock disable */
&#160;   __HAL_RCC_TIM2_CLK_DISABLE();
&#160; /* USER CODE BEGIN TIM2_MspDeInit 1 */

&#160; /* USER CODE END TIM2_MspDeInit 1 */
&#160; }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-15 09:53:22 | 显示全部楼层
xiaoyangw 发表于 2025-7-14 15:30
gpio.c文件
void MX_GPIO_Init(void)
{

如果你的是50K,且SPI采集,你这个中断里面的处理,时间很长
HAL_GPIO_EXTI_Callback

做到50K很困难
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-7-15 20:44:50 | 显示全部楼层
eric2013 发表于 2025-7-15 09:53
如果你的是50K,且SPI采集,你这个中断里面的处理,时间很长
HAL_GPIO_EXTI_Callback

我把pwm频率调到2k,检测100hz的波数据也是不对
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 20:53 , Processed in 0.049562 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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