亲们,没有关注我的还请关注一下哟,在这里会不定期更新单片机类,电路类的原创文章。
好啦,距离上次更新已经有几天了,上一次我们介绍了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怎么办呢,
串联电阻分压即可
好啦,今天就说到这里啦,有任何问题可以私信我哟