stm32-ADC

发布时间:2026/11/9 8:29:38

stm32-ADC 关于stm32的ADC12位就是ADC的分辨率分辨率越高转换越精细1us是开始AD转换到取得结果的时间对应转换频率1MHZ。输入电压的范围是负极到正极的范围转换范围即0~2^12-1这两个范围每个数是一一对应的线性关系0对应03.3对应4095中间的数也一一对应。stm32的型号中最多有18个通道外部信号源即模拟电压输入GPIO口几个外部信号源就是几个GPIO口可以直接测电压2个内部信号源分别是内部的温度传感器和参考电压。温度传感器可以测CPU的温度参考电压一般在1.2v左右不受外部供电影响在一些情况下比如电机驱动或者大功率负载时单片机供电电压3.3v会被拉低参考电压的作用就是依靠它算出准确的供电电压。普通的AD转换流程是启动-转换来一个就启动转换一次但stm32可以将信号分成组一次性转换一个组其中规则组是用于平时转换注入组是用于突发情况下转换。AD转换时可以设置转换值的上下阈值模拟看门狗可以在指定通道监测值的变化一旦超出阈值范围就会申请中断。关于DACstm32有一些型号是没有DAC的比如F103C8T6这时候可以用PWM代替同样都是数字信号转换成模拟信号输出实际上PWM使用时没有功率损耗在这方面比DAC更加常用DAC主要用于波形生成这是PWM不能代替的。ADC内部结构先来看一个8位的ADC芯片可以连接8个输入通道因为AD转换时间是微秒级别的所以可以一个ADC接多个输入通道提高效率。把想选择的通道地址放在ADDA/B/C这三个引脚上并给一个ALE锁存的信号这个通道就选择了输入的是模拟电压怎么能知道对应的数字呢需要使用DAC逐次逼近寄存器SAR给DAC一个值DAC会将其转换成相应的模拟电压拿去和输入电压比较借助电压比较器看输出的高低电平就知道谁大谁小然后相应改变DAC的值不断逼近输入电压使用了类似于数学上的二分法最后得到相似的值作为结果这个DAC的值就会被输出。8位的转换范围就是0~255最终输出的数据就是8位的逼近也需要逼近8次START就是开始ADC转换的信号EOC是转换结束的信号由于逼近是一次一次的这需要时钟来驱动CLOCK就是时钟VREF是DAC的参考电压它也会影响ADC所以同时也是ADC转换的电压范围VCC,GND是芯片供电一般和参考电压相同所以这四个引脚是相连接的正接正负接负。stm32中的ADC和这个差不多先来看看信号转换部分的结构16个外部信号源加上两个内部信号源的输入经过多路开关选择一路通道规则组是最常用的可以同时选择16路通道进行ADC转换转换过程和上面ADC芯片差不多然后结果传到寄存器中但规则组的数据寄存器只能保持一个结果旧结果会被新结果覆盖所以需要搭配DMA使用将前一个数据转移防止被覆盖注册组可以选择4路通道并且寄存器也可以存四个结果。ADCCLK就是驱动逐次逼近的时钟来源于APB2总线的RCC时钟经过分频再给ADC。VREF,VDDA,VSSA就是参考电压和供电。什么时候开始AD转换呢再来看看触发源软件触发方面可以通过代码触发硬件触发方面ADC的触发源一般都来自定时器其中TRGO就是定时器通过主模式控制ADC自动转换也可以来自于EXTI外部中断触发。最后来看看AD转换完成后不管是规则组还是注入组AD转换完成后都会发出完成信号并挂起标志位规则组是EOC,注入组是JEOC通过读取这些标志位就能知道转换是否完成。前面提到过模拟看门狗电压超出阈值时它也会挂起标志位它们都可以连接NVIC申请中断。基本流程其他相关点输入通道和GPIO口复用关系ADC规则组四种转换模式单次转换触发一次就转换一次转换结束之后还想转换就要先再次触发非扫描模式不管选择了多少通道都只会转换排在第一个的通道相当于普通的AD转换了连续转换触发一次之后就会连续转换每次转换完成置EOC标志位后会自动再次转换上一次的通道不用再触发。扫描模式需要设置通道数目x触发后就会转换次序前x个通道。注意在扫描模式下所有通道全部转换完毕后才会置一次EOC标志位所以你不知道前面的通道是什么时候转换完成的这些模式需要自己配置。数据对齐分辨率是12位的转换结果就是12位的数据但是数据寄存器是16位的空出来四位这时候就需要数据对齐。一般常用数据右对齐这样读出来的数据就直接是转换结果而数据左对齐相当于将数据左移了四位扩大了16倍。左对齐可以用于改变分辨率比如不需要2^12这么高的分辨率那就读取前八位就行了相当于将分辨率变成了2^8就像数字13557只需要知道是一万多就行了。转换时间量化编码就是ADC中逐次逼近的过程这段时间里如果输入电压还在不停变化无法定位结果会错乱采样保持就是输入电压时闭合开关给电容充电充好之后断开开关电容没有放电的回路所以电压不变就能进行转换了。采样需要时间12位的ADC逐次逼近也要12次所以是12个周期还有半个周期做一些别的事这就是总转换时间。ADCCLK最高频率是14MHZ如果高于这个频率时间会短一些但是超频不能保持稳定。校准了解即可ADC外围电路为了输入可变电压可以搭建一下电路AD单通道代码使用AD单通道先开启AD和GPIO的时钟再预分频得到ADCCLKADCLK最高14MHZ所以只能选择对72MHZ6分频或8分频然后初始化GPIO再选择通道然后配置ADC最后开启ADC,后面还需要校准void AD_init(void) { //开启时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //预分频 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//将72MHZ 6分频了,因为ADCCLK最高频率是14MHZ //初始化GPIO GPIO_InitTypeDef GPIO_InitSturcture; GPIO_InitSturcture.GPIO_ModeGPIO_Mode_AIN;//需要模拟输入模式 GPIO_InitSturcture.GPIO_PinGPIO_Pin_0; GPIO_InitSturcture.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitSturcture); GPIO_SetBits(GPIOA,GPIO_Pin_0); //选择通道 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_1Cycles5);//哪个ADC哪个通道让它排在第几个转换采样时间多久 //配置ADC ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_ContinuousConvModeDISABLE;//是否开启连续转换模式不开就是单次转换 ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;//数据右对齐 ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//不用外部触发源也就是使用软件触发 ADC_InitStructure.ADC_ModeADC_Mode_Independent;//ADC独立模式不使用双模式 ADC_InitStructure.ADC_NbrOfChannel1;//转换通道总数非扫描模式下其实没用 ADC_InitStructure.ADC_ScanConvModeDISABLE;//是否开启扫描模式 ADC_Init(ADC1,ADC_InitStructure); //开启ADC ADC_Cmd(ADC1,ENABLE); //校准 ADC_ResetCalibration(ADC1);//复位校准 while (ADC_GetResetCalibrationStatus(ADC1)SET);//等待复位完成当是SET的时候说明复位没结束结束了会自动RESET ADC_StartCalibration(ADC1);//开始校准 while(ADC_GetCalibrationStatus(ADC1)SET);//等待校准完成完成会自动RESET }初始化完成之后ADC准备就绪接下来需要触发以及读取结果uint16_t ADC_get(void) { //ADC准备好了接下来就触发转换这里使用软件触发 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //ADC开始转换了需要通过读取标志位来确定是否转换完成 if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)SET) { return ADC_GetConversionValue(ADC1);//读取结果之后应该清除标志位但是这个函数里已经清除了就不用手动清除了 } }AD多通道代码不使用DMA不使用DMA时转换多通道考虑到数据覆盖的问题可以借助单次转换、非扫描模式在每次转换完成置EOC标志位后手动换成下一个通道继续转换void AD_init(void) { //开启时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //预分频 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//将72MHZ 6分频了,因为ADCCLK最高频率是14MHZ //初始化GPIO GPIO_InitTypeDef GPIO_InitSturcture; GPIO_InitSturcture.GPIO_ModeGPIO_Mode_AIN;//需要模拟输入模式 GPIO_InitSturcture.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitSturcture.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitSturcture); //配置ADC ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_ContinuousConvModeDISABLE;//是否开启连续转换模式不开就是单次转换 ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;//数据右对齐 ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//不用外部触发源也就是使用软件触发 ADC_InitStructure.ADC_ModeADC_Mode_Independent;//ADC独立模式不使用双模式 ADC_InitStructure.ADC_NbrOfChannel4;//转换通道总数 ADC_InitStructure.ADC_ScanConvModeDISABLE;//是否开启扫描模式 ADC_Init(ADC1,ADC_InitStructure); //开启ADC ADC_Cmd(ADC1,ENABLE); //校准 ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)SET); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)SET); } uint16_t ADC_get(uint8_t ADC_Channel) { //选择通道 ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_1Cycles5);//哪个ADC哪个通道让它排在第几个转换采样时间多久在这里选择通道主函数中调用这个函数并给通道值就能在单次转换完成后换成下一个通道了 //ADC准备好了接下来就触发转换这里使用软件触发 ADC_SoftwareStartConvCmd(ADC1,ENABLE); //ADC开始转换了需要通过读取标志位来确定是否转换完成 if(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)SET) { return ADC_GetConversionValue(ADC1);//读取结果之后应该清除标志位但是这个函数里已经清除了就不用手动清除了 } }主函数中uint16_t AD0,AD1,AD2,AD3; int main() { OLED_Init(); AD_init(); OLED_ShowString(1,1,AD0:); OLED_ShowString(2,1,AD1:); OLED_ShowString(3,1,AD2:); OLED_ShowString(4,1,AD3:); while(1) { AD0ADC_get(ADC_Channel_0); AD1ADC_get(ADC_Channel_1); AD2ADC_get(ADC_Channel_2); AD3ADC_get(ADC_Channel_3); OLED_ShowNum(1,5,AD0,4); OLED_ShowNum(2,5,AD1,4); OLED_ShowNum(3,5,AD2,4); OLED_ShowNum(4,5,AD3,4); Delay_ms(500); } }
延伸阅读

更多相关文章

2026/11/1 1:34:25

知网研学高效文献管理与学习工具使用指南

做科研最耗人的,从来不是难题本身,而是检索、整理、写作、分析里的重复劳动——2026年,一批更精准、更贴合科研全流程的AI工具已成熟,能帮你把时间还给思考。本文实测7款全新工具,覆盖文献检索、阅读、写作、数据分析、…

2026/11/9 7:15:10

Python自动化QQ邮箱:SMTP/IMAP协议实战与邮件处理脚本详解

1. 项目缘起:为什么需要自动化处理QQ邮箱?在日常工作中,我们经常会遇到一些重复性的邮件处理任务。比如,我最近就接手了一个小项目,需要定期从某个服务拉取数据,生成报告,然后通过邮件自动发送给…

2026/11/8 19:36:09

一站式解决各类需求痛点 高效便捷适配多元场景的实用方案指南

做科研最耗人的,从来不是难题本身,而是检索、整理、写作、分析里的重复劳动——2026年,一批更精准、更贴合科研全流程的AI工具已成熟,能帮你把时间还给思考。本文实测7款全新工具,覆盖文献检索、阅读、写作、数据分析、…

2026/11/9 8:28:52

售楼部电工作业指导书怎么考 内部消息告诉你怎么拿下证书

售楼部电工作业指导书怎么考 内部消息告诉你怎么拿下证书 你是不是也遇到过这种情况,手里有电工技能,但就是找不到合适的工作? 急需特种作业证才能上岗找工作 ,这几乎是每个想进工地、售楼部、工程类岗位的电工都面临的难题。其实, 内部消息…

2026/11/9 8:28:52

特种工如何注销证书 别踩坑!实操考试心里没底怕挂科

特种工如何注销证书 别踩坑!实操考试心里没底怕挂科 实操考试心里没底怕挂科?你不是一个人。很多特种工在报考过程中,都会遇到这样那样的难题,尤其是证书注销这个环节,流程复杂、信息不透明,稍有不慎就可能耽误了职业发展,甚至影响到工作。…

2026/11/9 8:28:52

航运吊车工是特种工吗?上岗必备证书怎么考不被坑

航运吊车工是特种工吗?上岗必备证书怎么考不被坑 不知道去哪报名怕被中介坑?航运吊车工是特种工吗?这是很多准备进入特种作业领域的人最关心的问题之一。尤其是像漯河市的市政公用工程从业者,对岗位职责、证书办理、考试内容等信息都特别敏感。今天咱们就…

2026/11/9 8:28:51

特种工如何注销证书别跑错地方了官方报名入口全在这里

特种工如何注销证书别跑错地方了官方报名入口全在这里 工地太忙根本没时间复习考试,特种工证书的注销流程你也别耽误了。很多兄弟在换工作或者转行时,发现证书已经不适用了,但又不知道怎么操作,更怕走错流程影响以后的就业。今天就从安阳应届工程类毕业生…

2026/11/9 8:23:51

电工证补证多久?保姆级教程教你如何快速补办和跨省转移

电工证补证多久?保姆级教程教你如何快速补办和跨省转移 之前考的证在外省能不能转过来?你不是一个人。不管是从河南焦作转岗到其他城市,还是从其他省份过来务工,很多人都遇到过“电工证补证多久”的问题。今天我们就从 真实案例、官方流程、避坑指南…

2026/11/9 0:37:55

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/9 0:03:09

建设厅的特种工有哪些含金量高?别交完钱考不过

建设厅的特种工有哪些含金量高?别交完钱考不过 怕考不过白交培训费?别急,先搞清楚建设厅的特种工有哪些含金量高的证,再决定是不是值得投入时间和金钱。 建设厅的特种工证是建筑行业里最基础、也最实用的证书之一,涉及多个作业类别,每种证的 含金量…

2026/11/9 0:03:09

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱

荆门市电工证报名怎么考才靠谱 全国通用证别交冤枉钱 怕考不过白交培训费?荆门市电工证报名前必须知道这些避坑指南。别看网上一堆培训机构广告,真要报个电工证,很多人被坑得一塌糊涂。特别是那些打着“包过”旗号的,最后不是考试不过,就是证不是全国通…

2026/11/9 0:03:09

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑

高空电工作业过程通过率揭秘:怎么选靠谱机构不被坑 不知道去哪报名怕被中介坑?你不是一个人。现在特种作业证报名渠道五花八门,从线下培训机构到线上代理,真假难辨。尤其是像高空电工作业这类高风险、高门槛的作业类型,证书含金量和考试通过率直接影响你…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑