嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > STM32--ADC

STM32--ADC

亲们,没有关注我的还请关注一下哟,在这里会不定期更新单片机类,电路类的原创文章。


好啦,距离上次更新已经有几天了,上一次我们介绍了stm32驱动1602,以及如何根据时序写程序,如何看数据手册配置自己想要的功能,今天我们来说一下STM32--ADC


ADC: 就是把模拟量转换成单片机可以识别的数字量,在日常生活中应用也极其广泛,比如万用表上,测电压,电流、音乐频谱等ADC都是必不可少的一部分


下面我们来说说stm32的ADC,



STM32每款芯片的ADC通道就不一一赘述,不同芯片其引脚通道等都有所不同,如ZET6和VET6就不一样,具体用那个可以查一下芯片的数据手册


我每次写的时候也都是看数据手册(不然那么多,实在记不住


我们来看一下F103系列的ADC初始化结构体,以及如何配置


这是固件库里的内容,我们在使用的时候只需要把每一位按照我们的需要配置一下就ok,那么问题来了,结构体里的每一个成员分别代表啥呢,我们一个一个的来看看


ADC_Mode:这个应该很好理解,就是配置ADC的模式,独立模式/双重模式

ADC_ScanConvMode:扫描,如果是多通道的ADC采集,使能这一位,如果是单通道则不需要使能,直接DISABLE;

ADC_ContinuousConvMode:连续转换;使能时ADC连续不断的转换,失能时只转换一次,按照一般的思路来呢,一般都是连续转换

ADC_ExternalTrigConv:触发方式;分为软件触发和外部触发

ADC_DataAlign:数据对齐方式,因为stm32的ADC是12位的,而转换的值是存在寄存器的低16位,故存在数据对齐方式,有左对齐和右对齐,小编一般喜欢用右对齐

ADC_NbrOfChannel:这一位就比较简单了,就是需要转换的通道数,比如说如果是一路的ADC那此值设为1即可


结构体的每个成员都了解到了,下一步就是初始化了


调用ADC_Init()固件库函数


你不会以为就这样就结束了把


小伙子,年轻啊,


下一步还要配置ADC的时钟,这个时钟跟转换速度息息相关,通过数据手册可以知道,ADC的时钟最大14M,所以需要将系统时钟72M进行分频,这里呢可以使用6分频,也可以8分频,小编一般使用6分频,转换速度快一些

调用一下库函数即可完成ADC时钟的配置

RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC的时钟,6分频,72M/6 = 12M


结束了,,,,,,,,,不存在的


下面就要来配置规则通道/注入通道,

//ADC规则通道配置 1:转换顺序 ADC_SampleTime_7Cycles5:采样时间为7.5个周期

ADC_RegularChannelConfig(ADC_x, ADC_Channel, 1, ADC_SampleTime_7Cycles5);




这个完成以后,就可以结束了吧,不好意思,还有



//使能ADC转换完成中断 ADC_IT_EOC:规则通道

ADC_ITConfig(ADC_x, ADC_IT_EOC, ENABLE);



中断也配置完了,ok

使能ADC吧

ADC_Cmd(ADC_x, ENABLE); //ADC使能


终于快结束了


下一步就是校准ADC并等待校准完成

ADC_StartCalibration(ADC_x); //开始校准

while(ADC_GetCalibrationStatus(ADC_x));//等待校准完毕



最后一步了,这次真的是最后一步了


软件触发

ADC_SoftwareStartConvCmd(ADC_x, ENABLE); //软件触发


ojbk


然后在中断里读取转换的值就好啦



在这里呢,为了简便,我就把转换的值放在串口上显示出来,就没用再去搞液晶显示了(效果一样)


来看看串口显示的值吧



这里呢,只能测0-3.3v的电,


如果测超过3.3V怎么办呢,


串联电阻分压即可


好啦,今天就说到这里啦,有任何问题可以私信我哟