芜湖网站建设,网站怎样做超链接,西安优化网站公司,福州市市政建设开发有限公司网站我的使用环境#xff1a; 硬件#xff1a;STM32F767ZGT6、串口1、ADC1、16MHz晶振、216MHz主频 软件#xff1a;STM32 CUBE IDE 优点#xff1a;不用定时触发采样#xff0c;ADC数据是不停的实时更新#xff0c;ADC数据的更新频率根据采样时钟和采样周期决定#xff0c;…我的使用环境 硬件STM32F767ZGT6、串口1、ADC1、16MHz晶振、216MHz主频 软件STM32 CUBE IDE 优点不用定时触发采样ADC数据是不停的实时更新ADC数据的更新频率根据采样时钟和采样周期决定后期只需要定时取用数据即可。 串口1用 printf 的打印ADC采集到的数据。或者用仿真查看数据变化也行。
一、基础知识 ADC的时钟是APB2与时钟树的配置有关同时规格书中ADC的时钟最大频率又跟电源电压有关3.3V下最大时钟频率为36MHz。所以预分频后的频率肯定是在这个规定最大时钟频率之内的。 二、STM32Cube IDE 具体配置 串口配置使能后更改合适波特率。 ADC和DMA 配置 预分频之后的时钟应该是在ADC时钟范围之内的用APB2频率除以分频数。DMA要开启扫描模式、连续转换模式、DMA连续请求每个ADC通道的采样时间一定要高于分辨率要求的采样时钟周期否则会导致初始化失败或者数据没有更新。4、配置详细解释 长的采样时间可以减少 ADC 读数的噪声从而提高精度。在更长的采样时间内模拟信号的值可以平稳地积累使得读数更加准确。虽然长的采样时间可以提高 ADC 的精度但是会影响采样频率。因此在不同的应用场景中需要选择合适的采样时间以达到较高的精度和采样频率的平衡。 5、ADC Injected Conversion Mode 它允许在特定序列中执行多次ADC转换每次转换有单独的触发。注入转换通常用于高级任务例如过采样或偏移校正并且在ADC的触发输入或软件命令触发的常规转换之外执行。 在注入转换模式下ADC执行一系列转换每次转换由单独的触发输入触发。注入转换的ADC结果寄存器与常规转换的结果寄存器分开结束转换中断可以为每种类型的转换单独生成。这允许CPU监视ADC的状态并确定注入转换何时完成。 是否使用注入转换模式取决于ADC应用程序的具体要求在使用注入转换模式之前了解注入转换模式的功能和限制是非常重要的。
三、验证程序 生成程序后main.c中开始使用下面的函数打开DMA传输每当ADC完成一次数据采样DMA就会将ADC数据更新至 *pData指定的数组。在任意时刻取用数组中的数据即可。
HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) 串口用 printf 打印 主体部分 四、测试结果 main.c 代码如下
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include main.h/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* 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 ---------------------------------------------------------*/
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, HAL_MAX_DELAY);return ch;
}
#endifuint16_t ADC_Value_buffer[2];
/* USER CODE END 0 *//*** brief The application entry point.* retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 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_DMA_Init();MX_ADC1_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf(**************************\r\n);HAL_ADC_Start_DMA(hadc1, (uint32_t *)ADC_Value_buffer, 2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf(ADC_Value_buffer: %d %d\r\n, ADC_Value_buffer[0], ADC_Value_buffer[1]);HAL_Delay(500);}/* USER CODE END 3 */
} 测试结果如下