stm32外部AD——ADC08060 驱动

本文详细介绍了如何驱动外部AD转换器ADC0806,包括时序设计、数据速率匹配、PWM生成、串口数据解析,以及与STM32内部AD的比较。重点讲解了利用DMA进行高效数据传输,以及AD精度和IO口占用的考虑因素。
摘要由CSDN通过智能技术生成

我的毕设用的是外部的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 

 

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值