首页 > Python资料 博客日记
单片机——ADC采样
2024-10-13 18:00:09Python资料围观30次
1、什么是ADC采样?
ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压,通过数值的方式表现出来。以STM32F103系列为例,它可以反应0~4095,换句话说,它采集的电压数值上表现为0~4095,也就是12位ADC(2^12)。
2、如何理解采集的数值?
以STM32F103芯片为例,供电电压是3.3V,它能检测的电压也是0~3.3V。这就好理解了,0~3.3V电压对应的是0~4095数值。通俗理解为把3.3V分成了4096份,采集上来多少份占3.3V的比例。
采集电压=(采集数值/4095)*3.3V
3、ADC采样具体知识和步骤
3.1、步骤
(1)使能用于ADC检测的引脚对应的GPIO口,使能ADC2通道时钟(ADC1也可以,这款芯片有俩个ADC外设)
(2)时钟分频
(3)初始化GPIO引脚并配置成输入模式
(4)配置ADC的工作模式
(5)使能指定的ADC
(6)开启复位校准
注:ADC的输入时钟不得超过14MHZ,它是由PCLK2经分频产生。
3.2、 ADC知识讲解
3.2.1、通道选择
每个 ADC有 18 个通道,其中有16个外部通道(不同引脚数的STM32外部通道数可能有所差异),其余两个是内部通道。
ADC通道和引脚对应关系如下(STM32F103C8T6为例):
3.2.2、单次转换和连续转换
3.2.3、独立模式和多重模式
独立模式即所有ADC转换器(ADC1、ADC2和ADC3)均独立地工作,互不影响。
多重模式即多个ADC(如果存在)根据通用寄存器中的设置,按照指定的方式协同工作。
3.2.4、数据对齐
比如说AD转换后数字量保存在ADCH,ADCL两个寄存器中
左对齐就是AD值的最高位就是ADCH的最高位了,ADCL的低位就会有的用不到,读出来为0
右对齐就是AD值的最低位是ADCL的最低位,而ADCH的高位就会有的用不到,读出来也为0
左对齐:11111111 11110000
MSB LSB
右对齐:00001111 11111111
MSB LSB
3.2.5、注入组和规则组
注:
3.2.6、 ADC校准
3.3、代码示例
3.3.1、初始化
void Adc_Init(void)
{
u8 i;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC2, ENABLE ); //使能 ADC2 通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div4); //设置 ADC 分频因子 6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA
ADC_DeInit(ADC2);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC 独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //连续多通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换模式关
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC2, &ADC_InitStructure); //根据指定的参数初始化外设 ADCx
ADC_Cmd(ADC2, ENABLE); //使能指定的 ADC2
for(i=0;i<100;i++);
ADC_ResetCalibration(ADC2); //开启复位校准
while(ADC_GetResetCalibrationStatus(ADC2)); //等待复位校准结束
ADC_StartCalibration(ADC2); //开启 AD 校准
while(ADC_GetCalibrationStatus(ADC2)); //等待校准结束
}
3.3.2、获取ADC数值
u16 Get_Adc1(void)
{
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); //通道1
ADC_SoftwareStartConvCmd(ADC2, ENABLE); //使能指定的 ADC2 的软件转换功能
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换结束
return ADC_GetConversionValue(ADC2); //返回最近一次 ADC2 规则组的转换结果
}
u16 Get_Adc2(void)
{
ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_239Cycles5); //通道2
ADC_SoftwareStartConvCmd(ADC2, ENABLE); //使能指定的 ADC2 的软件转换功能
while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC )); //等待转换结束
return ADC_GetConversionValue(ADC2); //返回最近一次 ADC2 规则组的转换结果
}
3.3.3、主函数
u8 Val;
u8 ADC;
int main(void)
{
Adc_Init(); //ADC初始化
while (1)
{
ADC = Get_Adc1(); //将1通道检测的数值传给ADC变量
Val = (ADC*3.3)/4095 //计算得到1通道检测的电压
}
}
注:上述配置下, 多通道采集时,俩个通道采集之间要有一定的间隔。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj