打印
[应用相关]

STM32单片机程序ADC采集代码

[复制链接]
624|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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或进行其他处理;


#include "stm32f1xx_hal.h"  
ADC_HandleTypeDef hadc1;  
void SystemClock_Config(void);  
static void MX_GPIO_Init(void);  
static void MX_ADC1_Init(void);  

int main(void)  
{  
    HAL_Init();  
    SystemClock_Config();  
    MX_GPIO_Init();  
    MX_ADC1_Init();  
    uint32_t adcValue[16]; // 存储16个通道的值  

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

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

使用特权

评论回复
沙发
实际测量不符| | 2024-8-29 14:07 | 只看该作者
转换完成后,程序读取ADC值,并通过串口将数据发送出去。

使用特权

评论回复
板凳
星辰大海不退缩| | 2024-8-29 23:52 | 只看该作者
处理数据,可以选择将数据发送到串口、显示到LCD

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

1668

帖子

2

粉丝