[应用相关] STM32单片机程序ADC采集代码

[复制链接]
1406|2
 楼主| 小夏天的大西瓜 发表于 2024-7-30 11:30 | 显示全部楼层 |阅读模式
STM, ST, dc, ADC, AD

输出一个STM32 ADC采集所有通道的程序,我们需要考虑以下几点:
01、初始化ADC:首先,我们需要初始化ADC模块,包括时钟、分辨率、扫描模式等设置;
02、配置ADC通道:配置要采集的ADC通道。STM32通常有多达16个ADC通道,但并非所有通道都可用,这取决于具体的STM32型号;
03、启动ADC转换:启动ADC转换并等待转换完成;
04、读取ADC值:读取转换后的ADC值;
05、处理数据:可以选择将数据发送到串口、显示到LCD或进行其他处理;


  1. #include "stm32f1xx_hal.h"  
  2. ADC_HandleTypeDef hadc1;  
  3. void SystemClock_Config(void);  
  4. static void MX_GPIO_Init(void);  
  5. static void MX_ADC1_Init(void);  

  6. int main(void)  
  7. {  
  8.     HAL_Init();  
  9.     SystemClock_Config();  
  10.     MX_GPIO_Init();  
  11.     MX_ADC1_Init();  
  12.     uint32_t adcValue[16]; // 存储16个通道的值  

  13.     while (1)  
  14.     {  
  15.         for (int i = 0; i < 16; i++)  
  16.         {  
  17.             hadc1.Instance->SQR3 = (i << ADC_SQR3_SQ6_Pos) | ADC_SQR3_SQ5_0; // 选择当前通道  
  18.             HAL_ADC_Start(&hadc1); // 开始转换   
  19.             while(!HAL_ADC_PollForConversion(&hadc1, 100000)); // 等待转换完成  
  20.             adcValue[i] = HAL_ADC_GetValue(&hadc1); // 读取ADC值  
  21.             // 这里可以添加代码将adcValue[i]发送到串口或其他处理  
  22.         }  
  23.         HAL_Delay(1000); // 延时1秒,然后再次采集  
  24.     }  
  25. }  

  26. static void MX_ADC1_Init(void)  // 初始化ADC  
  27. {  
  28.     hadc1.Instance = ADC1;  
  29.     hadc1.Init.ScanConvMode = ENABLE; // 启用扫描模式  
  30.     hadc1.Init.ContinuousConvMode = ENABLE; // 启用连续转换模式  
  31.     hadc1.Init.DiscontinuousConvMode = DISABLE; // 禁用不连续模式  
  32.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件启动  
  33.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 右对齐  
  34.     hadc1.Init.NbrOfConversion = 1; // 转换序列中的转换数  
  35.     hadc1.Init.DMAContinuousRequests = DISABLE; // 禁用DMA连续请求  
  36.     hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV; // EOC设置为序列转换结束  
  37.     if (HAL_ADC_Init(&hadc1) != HAL_OK)    // 初始化错误处理  
  38.     {  
  39.     }  
  40.     // 配置ADC通道,这里仅配置了一个通道作为示例,实际上需要为每个通道进行配置  
  41.     ADC_ChannelConfTypeDef sConfig = {0};  
  42.     sConfig.Channel = ADC_CHANNEL_0; // 例如,配置通道0  
  43.     sConfig.Rank = 1;  
  44.     sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;  
  45.     sConfig.SingleDiff = ADC_SINGLE_ENDED;  
  46.     sConfig.OffsetNumber = ADC_OFFSET_NONE;  
  47.     sConfig.Offset = 0;   
  48.     if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  
  49.     {    // 通道配置错误处理   
  50.     }  
  51. }  

实际测量不符 发表于 2024-8-29 14:07 | 显示全部楼层
转换完成后,程序读取ADC值,并通过串口将数据发送出去。
星辰大海不退缩 发表于 2024-8-29 23:52 | 显示全部楼层
处理数据,可以选择将数据发送到串口、显示到LCD
您需要登录后才可以回帖 登录 | 注册

本版积分规则

273

主题

2368

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部