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下载

相关推荐
2301_795741793 小时前
计算机网络学习笔记】初始网络之网络发展和OSI七层模型
笔记·学习·计算机网络
Cathy Bryant3 小时前
薛定谔方程
笔记·数学建模·高等数学·物理
白云偷星子3 小时前
云原生笔记7
linux·运维·redis·笔记·云原生
Heartache boy3 小时前
野火STM32_HAL库版课程笔记-TIM高级定时器基础中断应用
笔记·stm32·单片机
随风,奔跑3 小时前
Spring Boot笔记
java·spring boot·笔记·后端
楼田莉子3 小时前
CMake学习:CMake在静态库工程场景上应用
开发语言·c++·后端·学习·软件构建
辰哥单片机设计3 小时前
STM32智能晾衣架(机智云)
stm32·单片机·嵌入式硬件
远游客07133 小时前
深入解析FaaS架构:云函数运行时的设计与实现
笔记
coderlin_3 小时前
Django 基础 初识
笔记·python·django