120ADC转换啦

本文详细介绍了STM32微控制器中模数转换器(ADC)的工作原理及配置方法,包括如何设置多通道轮询采集、数据对齐方式、连续转换模式等,并给出了具体的初始化代码示例。

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

ADC——模数转换(模拟转数字)

STM32提供了精度为12bit的ADC

AD按键,一个IO口可以对应多个按键,因为每个按键对应不同的电压值,用IOAD功能去识别不同电压值就知道是对应哪个按键(F1最多能识别16个,但最好是12个,因为是12位采样,不过16是可除得的最小分辨度)


ADC的转换以参考值为基准去换算为数字量

规则组,类似相应优先级,不进行抢占,且多个通道并按照先后顺序依次转换循环
注入组,类似抢占优先级,一个通道能临时中断并抢占另一个通道去转换

44.ADC-----模数转换
(1)模拟量:通常的外部世界是模拟量的世界。
(2)数字量:计算机是数字量的世界。
(3)作用:通常通过传感器的方式采集到因环境变化而导致传感器的电压等变化的原因,采集电压值。
(4)传感器的特性:通常的传感器会感知环境的变化,而导致其传感器本身的某一个量进行变化。
通常的传感器因为工艺的加工,会使得其某一个部分的电压进行变化。

**************************************************************

光敏电阻会根据其接受到的光强二导致其电阻值会变化。通常光强度越大,阻值越小。反之阻值越大。


思路:(针对于两个通道的ADC,采集不同对象)
ADC多通道采集数据时,其采集的数据是轮流采集的,先采集一个通道的数据,再采集下一个通道,循环一圈之后继续采集第一个,所以如果需要一段空间来存储采集的数据时,第一个数据对应第一个通道,第二个数据对应第二个通道,直到循环一圈再按以上规则继续。所以如果要用内存存储时用二维数组,最低维对应有多少个通道,按规则依次存入,高维决定要采集多少个当样本
0.定义个二维数组内存来存储采到的数据
   时钟配置
1.GPIO配置
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);

/* Configure PC.0  as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
2.ADC配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;  /扫描模式,扫描模式用于多通道
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续扫描模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不用外部触发方式转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  //数据采集右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; //要转换通道数目为2
ADC_Init(ADC1, &ADC_InitStructure);
/配置ADC时钟,为PCLK2的8分频,即9Mhz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8); 
/*配置ADC1的通道10,11为239.5个采样周期,还有序列设置 */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5);
/* ADC的DMA使能*/(有使用DMA的功能下使用)
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*复位校准寄存器 */   
ADC_ResetCalibration(ADC1);
/等待校准寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ADC校准*/
ADC_StartCalibration(ADC1);
/* 等待校准完成*/
while(ADC_GetCalibrationStatus(ADC1));
/* 由于没有采用外部触发,所以使用软件触发ADC转换*/ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
2.ADC采样的数值的读取和处理
 如果没有用DMA,则从ADC的函数读取
有则在DMA函数读取

一般要多次采样,再取平均值才准确
采样采到的是数字量,还要根据校准值去计算实际模拟量
转换公式:
模拟量值 = 校准值电压/(0xFFF + 1) * 采样到的数字量
0XFFF是因为是12位的采集ADC,+1是因为其每个值都代表采样的一个刻度,所以零也算,所以要加1





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值