|
有没有老哥告诉我一下哪里出问题了,研究了好久,都是发现16bit的时候采样率最高1MHz,12bit的时候才有2MHz,不应该呀。下面就是主要代码:
#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 *******/
uint32_t ADC_SamplingRate; /* 期望采样率,单位:Hz */
uint32_t ADC_DMA_Buffer_A[ADC_DMA_SAMPLE_LENGTH]; /* DMA缓冲A */
uint32_t ADC_DMA_Buffer_B[ADC_DMA_SAMPLE_LENGTH]; /* DMA缓冲B */
uint32_t ADC_DMA_intData[ADC_DMA_SAMPLE_LENGTH]; /* 定义ADC整形数据存储数组 */
float32_t ADC_DMA_floatData[ADC_DMA_SAMPLE_LENGTH]; /* 定义ADC浮点数据存储数组 */
float32_t ADC_DMA_Windowed_Data[ADC_DMA_SAMPLE_LENGTH]; /* 定义ADC加窗后数据存储数组 */
uint8_t ADC_Active_Buffer_Flag; /* 当前活动缓冲区标志 */
uint8_t Last_Completed_Buffer_Flag; /* 上一次完成的DMA缓冲区 */
unsigned char ADC_ConvEnd_Flag; /* ADC采集结束标志位 */
//struct compx s[MAX_FFT_N];
/* 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 */
/* TIMER3时钟频率为200MHz
* PSC:2 ARR:10
* 分频后时钟为:10MHz
*
* 调整采样率:增大则可扩大频谱谱长
* 调整FFT运算点数:增大则可提高运算精度
*
* 最好就是通过按键去调节采样率,以及采样的点数,可以根据实际需要去设置
* 常用的采样率:{500000、200000、100000、50000、20000、10000、5000、2000、1000、500、200},可以通过数组索引来使用
* 要想使用以上方法得到以上采样率,那么PSC必须使得时钟频率位1MHz
*
*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1){
HAL_ADC_Stop_DMA(&hadc1); // 停止DMA以防止数据覆盖
Last_Completed_Buffer_Flag = ADC_Active_Buffer_Flag; // 保存当前完成的缓冲区
ADC_Active_Buffer_Flag ^= 1; // 切换缓冲区
ADC_ConvEnd_Flag = 1; /* ADC采集DMA搬运结束标志位置一*/
if (ADC_Active_Buffer_Flag == 0){
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_DMA_Buffer_A, ADC_DMA_SAMPLE_LENGTH);
}else{
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_DMA_Buffer_B, ADC_DMA_SAMPLE_LENGTH);
}
if(Last_Completed_Buffer_Flag == 1){
for(int i=0;i<ADC_DMA_SAMPLE_LENGTH;i++)
ADC_DMA_intData[i] = ADC_DMA_Buffer_B[i];
}else{
for(int i=0;i<ADC_DMA_SAMPLE_LENGTH;i++)
ADC_DMA_intData[i] = ADC_DMA_Buffer_A[i];
}
}
}
/* 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_FMC_Init();
MX_SPI4_Init();
/* USER CODE BEGIN 2 */
/***** ADC *****/
ADC_SamplingRate = Set_SamplingRate(&htim3,200000000,1000000); /* 必须要在定时器启动前进行设置!*/
delay_ms(20); /* 给ADC时间校准 */
HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED); /* ADC 校准 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_DMA_Buffer_A, ADC_DMA_SAMPLE_LENGTH); /* 启动DMA转换ADC_DMA_SAMPLE_LENGTH次,完成后回调callback */
HAL_TIM_Base_Start(&htim3); /* 启动定时器3 */
Set_Current_USART(USART1_IDX);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
哪里出问题了呀
|
|