我的毕设用的是外部的AD,型号是ADC0806,发现大部分大家都使用的是ARM的内部AD,没有搜到可植入代码的我,只能自己摸索,下面给大家分享一下外部AD的驱动方法
首先,我们需要研究一下AD的数据手册(时序图部分):
根据时序图,我们可以看出来,控制ADC0806的只有一个CLK,在CLK的低电平数据稳定,在CLK的高电平变换数据 。因此,我们只需要编写CLK的时序,数据就会自动读取。但是这里要注意一点,就是相对于上升沿来说,下降沿时刻的数据更加稳定。我们可以将下降沿作为数据读取的时刻,将上升沿作为数据变换的时刻。
编写AD的CLK的频率时,应该和需要做AD转换的数据速度一致
比如我的AD是要读取光谱仪输出的光谱,我的光谱仪输出数据的速度是1M,那么我的AD的CLK就是1M。用PWM生成时序的方法大家可以参考这一篇:stm32f4 生成PWM波_居安士的博客-CSDN博客_stm32产生pwm波
之后我们可以利用示波器,看一下自己是否正确生成了AD的clk,以及AD的clk是否对应着需要转换的数据 ,也就是看看是否一个数据对应一个CLK,(ADC0806是很高速的AD,因此只要我们对准了数据和CLK,AD转换后的数据不会漏掉),完成这一步之后,我们下面就是利用串口助手,看一下AD转换之后的数据。
在看之前,我们需要先把AD的多位输出拼成一个数。
由于ADC0806是8位输出,所以我们直接读8位输出的管脚,(管脚是0或者1),再把8位输出拼位
#define data0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)
#define data1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)
#define data2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)
#define data3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
#define data4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)
#define data5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define data6 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)
#define data7 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)
#define input data0 | (data1<<1) | (data2<<2) |(data3<<3)| (data4<<4) | (data5<<5) | (data6<<6) |(data7<<7) |0x00
这里的input就是AD转换之后的数据,接下来我们将input用串口进行传输
我们传输的时候可以计算一下波特率够不够(我的串口波特率最高2M)
如果是1M的速度的数据,一个数据有起始位+8位数据+停止位,所以按照bit来算10M/bit,而我的串口最高只有2M/bit,正常的串口传输根本不行。需要使用不需要占用CPU资源的DMA发送方式!
下一篇教大家串口使用DMA,以及数据的抽帧发送
下面再说一下,关于STM32内部AD和外部AD的区别
主要是有两个区别(1)精度(2)IO口
外部AD高精度但是占IO口;内部AD低精度但是省IO口
所以大家选择的时候要看一下自己需要多高的AD精度:
AD精度指的是AD实际转换的结果和理想的计算结果之间的误差,也叫做积分非线性误差,符号是(INL) 单位是LSB
LSB=基准/2^AD位数 例如3V的基准 12位AD 那LSB=3/4096
在数据手册上面都会写明AD精度的大小,例如ADC0806,就是最高1.3LSB
AD对应IO口的占用还是非常明显的,8位并行就是8个IO口,如果大家的IO口数量不满足外部AD,也要选择使用内部AD
最后
以上就是热情学姐最近收集整理的关于stm32外部AD——ADC08060 驱动的全部内容,更多相关stm32外部AD——ADC08060内容请搜索靠谱客的其他文章。
发表评论 取消回复