stm32 adc输入电压范围_STM32学习日志——ADC实验(20.07.28)

本文介绍了STM32微控制器中ADC模块的基本概念及其使用方法。详细讲解了STM32F103ZET6型号芯片所配备的3个12位ADC的功能特性,包括工作模式、通道配置及软件配置步骤。并通过一个简单的实例演示如何进行单次转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、ADC简介:

STM32有1~3个ADC,我使用的STM32F103ZET6有3个ADC,是12位逼近的数字模拟转换器,它有18个通道,包括16个外部通道和2个内部信号源。每个ADC有4种模式:单次、连续、扫描、间断。存储方式分为左对齐或右对齐,一般选择右对齐。ADC将转换分为两个通道组:规则通道与注入通道,规则通道相当于正常执行的程序,注入通道相当于中断。规则通道最多包含16个,注入通道最多位4个。

本次介绍仅介绍规则通道的单次转换,

二、软件配置:

1)开启PA口的时钟和ADC1的时钟,设置PA1为模拟输入;

49a045f1a138f09809b345e23eeef9f0.png

2)复位ADC1,同时设置分频因子;要保证ADC的时钟不超过14MHZ,否则可能不准,而APB2的时钟为72MHZ,所以分频因子选6,ADC的时钟就为12MHZ;

54de66b740e6ca92e8b29aa6353820ff.png

3)初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息;

7a74e786b0c657c18f85b78a7a6949d7.png

4)使能ADC并校准;

156f800ebf4c036653c458d81c4c0fe5.png
ADC_CR2寄存器

d0014d159c26c081946c8de0081d0dff.png

5)读取ADC值;转换完成EOC结束标志位会置1;

9ae954c3966a0e138c00e42c32f3924c.png

d86ab657d74e6e65af30c0860ce754c4.png

三、功能测试:

程序烧写到板子后,PA1接0~3.3V的电压则会被转换成12位的数字信号,切记不能超过3.3V,否则可能会导致ADC烧掉。接着可从OLED上观测到此时的电压。

810172cbe8900b926afb4a73dc361904.png

b6e55df72d7ab784670a795d1dbd3d84.png
#include "measure.h" #include "adc.h" #include "main.h" #include "math.h" #include "arm_math.h" /* ADC1 CH2 PA3 采集boost直流电压 ADC2 CH3 PA5 采集boost直流电流 ADC1 CH4 PA4 采集inverter交流输出电压 ADC2 CH6 PA6 采集inverter交流输出电流 ADC1 CH14 PC4 采集整流输入前的交流输入电压 ADC1 CH15 PC5 */ #define COLS 6 //6个通道数,在单数组中用来计算 #define ROWS 10 //每个通道10个数据处理,在单数组中用来计算 #define SAMPLE_LEN 200 //采样的点数,经计算得知 rms_type AC_rms={0, 0, 0, 0, 0, 0};//存放rms_type的六个变量 float AC_sample_mat[6][SAMPLE_LEN]={0};//用来暂时保存各点采样值并最终将结果送入有效值中 void calculate_rms(void) //计算采样函数 { static u32 count=0; u32 temp=count %SAMPLE_LEN; count++; AC_sample_mat[0][temp]= get_dcv_in(); //PA3 AC_sample_mat[1][temp]= get_dci_in(); //PA5 AC_sample_mat[2][temp]= get_acv_out(); //PA4 AC_sample_mat[3][temp]= get_aci_out(); //PA6 AC_sample_mat[4][temp]= get_acv_in();//PC4 AC_sample_mat[5][temp]= get_aci_in(); //PC5 if(SAMPLE_LEN-1==temp)//如果检测到检测周期内的最后一个采样点 { count=0; arm_rms_f32(AC_sample_mat[0], SAMPLE_LEN, &AC_rms.VDC_rms); arm_rms_f32(AC_sample_mat[1], SAMPLE_LEN, &AC_rms.IDC_rms); arm_rms_f32(AC_sample_mat[2], SAMPLE_LEN, &AC_rms.Vout_rms); arm_rms_f32(AC_sample_mat[3], SAMPLE_LEN, &AC_rms.Iout_rms); arm_rms_f32(AC_sample_mat[4], SAMPLE_LEN, &AC_rms.Vin_rms); arm_rms_f32(AC_sample_mat[5], SAMPLE_LEN, &AC_rms.Iin_rms); } } //采集输入直流电压 float get_dcv_in(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +0];//采集第一个通道,也就是第一个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp*DC_Vin_ratio);//返回直流电压大小,倍数乘以20.07倍(可测试得出) } //采集输入直流电流 float get_dci_in(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +1];//采集第二个通道,也就是第二个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp*DC_Iin_ratio);//返回直流电流大小 } //采集输出交流电压 float get_acv_out(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +2];//采集第三个通道,也就是第三个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp-AC_Vout_vref)*AC_Vout_ratio;//返回交流输出电压大小 } //采集输出交流电流 float get_aci_out(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +3];//采集第四个通道,也就是第四个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp-AC_Iout_vref)*AC_Iout_ratio;//返回交流输出电流大小 } //采集输入交流电压 float get_acv_in(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +4];//采集第五个通道,也就是第一个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp-AC_Vin_verf)*AC_Vin_ratio;//返回直流电压大小,倍数乘以20.07倍(可测试得出) } float get_aci_in(void) { float temp=0; u32 sum=0; int i; for(i=0;i<ROWS;i++) { sum+=adc_result[i*COLS +5];//采集第五个通道,也就是第一个数据 } temp =(double)sum/ROWS/4095*3.3;//将总值变成平均值 return (temp-AC_Vin_verf)*AC_Vin_ratio;//返回直流电压大小,倍数乘以20.07倍(可测试得出) } float measure_rms(uint8_t i,uint8_t size)//均方根算法 { float sum=0,result; int j; for(j=0;j<i;j++) { sum+=(float)(AC_sample_mat[size][j]*AC_sample_mat[size][j]); } sum=(double)(sum/i); result=(float)(1.0*sqrt(sum)); return result; } 如果要将这个文件改成只对PA4引脚进行计算,应该怎么改
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值