编写用于模数转换器的软件驱动程序
作者:凌力尔特公司混合信号产品应用经理Mark Thoren 应用工程师Leo Chen
"你能发送给我一个用于……的驱动程序吗?"
模数转换器 (ADC) 提供了一个进入模拟世界的嵌入式控制器窗口。选择合适的 ADC 可以去掉一个电路板的运算放大器和调节电位器,从而产生一个干净、坚固的设计。设计过程需要确保满足电路的模拟需求,确保处理器能够用 ADC 的输出数据做有用的事,两者的粘合剂是低级驱动程序代码。
与存储器、UART、I/O 扩展器等纯数字外部设备相比,模数转换器写固件时需要特殊考虑。如果要分析一个 AC 信号,那么转换开始的定时必须绝对确定,而且不受软件引起的抖动影响,从而对控制器如何启动转换提出了严格要求。用于 DC 测量的高分辨率 ADC 有可能具有一个比控制器必须执行的任何其他过程都要长得多的转换时间。最后,数字接口可能与控制器的内置外部设备控制器不是完美匹配的。
本文描述了一种编写用于 LTC2499 (一款具 I2C 接口的 24 位、ΔΣ ADC) 的驱动程序的步进法。它举例说明了驱动程序设计由于诸多原因而存在的的许多微妙之处。
1) 与微控制器中发生的大多数事情相比,转换时间非常长。
2) 它使用 I2C 接口,这种接口内置在很多控制器中,但是每个控制器都有自己特定的实现方式。
3) I2C 接口本身用来指示转换的状态,而不是状态位。
4) 它有多个输入通道,从而需要在固件中恰当排序。
ADC 详细信息
一个 ADC 必须做两件事:接受模拟测量值;将数据发送到控制器。两件事可能同时发生 (取决于 ADC 的架构)。例如,12 位 LTC2366 用串行数据时钟进行转换。就高速器件而言,这是有意义的,同时进行的操作越多,采样就越快。而 LTC2499 采用增量累加架构,以实现精确 DC 规范,结果是长的转换时间 (145ms)。
LTC2499 用 I2C 接口实现配置和数据传送。这个接口以 100kHz 和 400kHz 的标准速率工作,这相当于用大约 112.5us 至 450us 读一次转换结果 (发送7位地址和读出位;接收4个数据字节,在每个字节的末端是一个ACK/NACK位)。这意味着,该 ADC 根本不能与控制器可能的通信速度一样快地产生结果。好消息是:借助少量规划,控制器能够运用转换时间来完成其他有用的操作,比如:捣弄数字或显示数据。
该ADC还通过不确认其I2C地址来向控制器传送"某项转换操作正在进行之中"的信息。一些 EEPROMS 在写周期也用这种方法来指示写操作正在进行中,这个操作也许需要数 10ms。
另一项将在开发后期节省大量时间的工作是,开始定义一些有用的常数。负责对ADC进行配置的两个字节在A0和EN2位之间被方便地分离了。你可以从定义地址选择字节开始,以供输入用来测试 (在这种情况下,是在 CH0 和 CH1 之间的差分测量),以及定义配置,以在 50/60Hz 抑制模式测量输入 (而不是内部温度传感器),如表 1 所示。
#define CH0_1_DIFF 0xA0 // First config byte to select CH0-1 differential
#define EXT_1X_50_60HZ 0x80 // Second config byte to select analog inputs
#define TEMP_50_60HZ 0xA0 // Second config byte to select temperature sensor
表 1 : 字符配置
微控制器详细信息
很多微控制器都有内置外部设备,用于 I2C 通信。这些硬件将常常实现一些任务的自动化,如产生启动和停止条件、发送和接收数据字节、以及在传送未确认时发出提醒信息。这些任务常常是通过给一个寄存器装入数据来启动的,然后在应该发送数据的时候确认一个数据位;当任务完成或发生错误时,将产生一个中断信号。这缩小了指令速率 (每 us 很多条指令) 与 I2C 总线工作速率的差别;分别就 100kHz 和 400kHz 标准时钟速率而言,每个 I2C 时钟周期为 2.5us 至 10us,或一次 9 位数据传送为 22.5us 至 90us。
避免浪费一个指令周期、完全采用彻底的中断驱动方法,这是很吸引人的。但是有很多事情可能出错,因此一种安全的方法是,从启动一个任务开始,然后等待这个任务完成,之后再继续。
当决定是否转换到中断驱动的 I2C 接口时,你应该在所增加的复杂性和效率之间仔细权衡。在一个以400kHz频率运行I2C总线的慢速处理器中,与简单地通过轮询来完成每项操作相比,由于进入和退出中断服务例程所引起的开销有可能使工作效率出现下降。此外,如果数据没有正在通过 I2C 端口读取,主程序就不能继续,那么它也许根本没有任何有用的事情可做。
不过,一个中断驱动的驱动程序的确有一些优势。等待转
- 基于AD73360和TMS320F2812的数据采集系统设计(12-06)
- 基于 LT6015 / LT6016 / LT6017 的运放精准型正压和负压限幅器(10-07)
- 如何用运算放大器构成最精确的限幅器(09-23)
- 仿真ADC的前端(08-21)
- 模数转换器的工作原理与分类特点详解(05-06)
- ADC模数转换器如何选型?ADC模数转换器分类详解(05-06)