STM32 F103C8T6学习笔记20:cubemx 配置 ADC采样 电位器

突然想起自己接触ADC采样比较之少,这里记录一下怎么配置使用AD采样

用的stm32cubemx 加HAL库

文章提供测试代码、截图、工程下载

目录

RCC时钟配置:

ADC配置:

测试应用程序:

测试结果:

测试工程下载:


RCC时钟配置:

一般c8t6最小系统板都有一个8Mhz的外部晶振,这里就给他把频率拉满:

ADC配置:

这里配置ADC1 通道IN1 对应引脚PA1

测试应用程序:

ADC中断最好不要写什么函数,就基础的数据搬运就行了:

复制代码
#include "adc.h"
#include "stdio.h"

ADC_HandleTypeDef hadc1;

// 配置
#define ADC_SAMPLE_COUNT_MAX 200   // 最大缓存
#define SEND_INTERVAL        100   // 00ms 发一次

// 全局变量
uint32_t adc_buf[ADC_SAMPLE_COUNT_MAX];
uint32_t  adc_cnt = 0;              // 实际采了多少个(重点!)
uint32_t adc_avg_val = 0;
uint32_t last_time = 0;

// ========================= ADC 中断回调 =========================
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if(hadc->Instance == ADC1)
    {
        // 只在【没满】的时候存数据
        if(adc_cnt < ADC_SAMPLE_COUNT_MAX)
        {
            adc_buf[adc_cnt] = HAL_ADC_GetValue(&hadc1);
            adc_cnt++;  // 实际采样数 +1
        }

        HAL_ADC_Start_IT(&hadc1);
    }
}


void ADC_Task_(void)
{
    if(HAL_GetTick() - last_time >= SEND_INTERVAL)
    {
        last_time = HAL_GetTick();
        if(adc_cnt > 0)  // 必须有数据才计算,防止除0
        {
            uint32_t sum = 0;
            for(uint8_t i=0; i<adc_cnt; i++)
            {
                sum += adc_buf[i];
            }
            adc_avg_val = sum / adc_cnt;
        }

        // 打印
        printf_uart1("100ms 采样数量:%d,平均值:%d\r\n", adc_cnt, adc_avg_val);

        // 清空计数,准备下一轮采集
        adc_cnt = 0;
    }
}

测试结果:

转动电位器可以提供串口1 打印每100ms采样最大200点的平均值

测试工程下载:

STM32F103C8T6学习笔记20:cubemx配置ADC采样电位器资源-CSDN下载

相关推荐
leoFY123几秒前
STM32H750配置LAN PHY芯片LAN8742
网络·stm32·嵌入式硬件
NagatoYukee1 分钟前
Spring Security基础部分学习
java·学习·spring
米小葱10 分钟前
【学习笔记】cmake
笔记·学习
m0_377108141 小时前
stm32平衡车
stm32·单片机·嵌入式硬件
辰海Coding1 小时前
MiniSpring框架学习-分解 Dispatcher
java·学习·spring·架构
初夏睡觉1 小时前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
z200509302 小时前
【Linux学习】Linux中的进程程序替换
linux·服务器·学习
小+不通文墨2 小时前
把树莓派外接的DHT11接收的温湿度发送到emqx上
经验分享·笔记·嵌入式硬件·学习·树莓派
bush42 小时前
嵌入式linux学习记录四
linux·运维·学习