跳转到内容

Hempl/ADC

来自维基教科书,开放世界中的开放书籍

ADC 代表模数转换器。在现实世界中,像光或声音这样的信号的数值通常可以以模拟方式测量,但是为了让这些数值被微控制器处理,它们必须被转换为数字信息。ADC 完成了这项工作,并且嵌入在所有现代微控制器中。

因此,ADC 电路是感知外部世界最常见的方式,但它并不智能。它只能在特定时间测量电压水平,你需要另一个硬件部分,一个传感器,来将你的模拟值转换为电压,以便与 ADC 一起使用,并成为数字信息。一些常见的模拟传感器类型是用于光、声音、温度、湿度、各种气体、电流传感器等等。

ADC 电路所做的是不时地从模拟信号中获取样本。每个样本都被转换为一个数字,它表示在特定时间模拟信号波形的数值。

举一个众所周知的例子,CD 包含音乐的数字样本,这些样本是音频(实际上是连续波形)的模数转换,采样率为 44.1KHz。这意味着,每秒 44,100 次,它的音频波形被采样成一个 16 位分辨率的数字:一个从 0 到 65,535 的数字。为什么是 65,535?因为每个样本都表示为 16 位,每位都可以取两个不同值中的一个(0 和 1),这给了你 216 = 65,536 个不同的可能值,也就是从 0 到 65535 的所有数字。

在每一次模数转换中,我们都有这两个重要的参数,频率或采样率,以及数字,样本本身,具有固定的位分辨率。分辨率是采样数据的精度。

Mizar32 的 ADC 以 8 位或 10 位的分辨率进行采样,这提供了 256 或 1024 个不同的可能值。这比音频 CD 的高保真度精度要低,但对于测量温度、压力、光强以及大多数其他物理信号来说已经足够精确了。

为了更好地解释分辨率的概念,输入波形中每个采样点的值将存储在一个固定长度的变量中。如果这个变量使用 8 位,这意味着它可以保存从 0 到 255(28 = 256)的值。如果这个变量使用 10 位,这意味着它可以保存从 0 到 1023(210 = 1024)的值。在 10 位分辨率的情况下,数字 0 代表最低电压,数字 1023 代表最高电压。

AVR32 中使用的 ADC 类型是逐次逼近寄存器 (SAR) ADC,它反复将它正在采样的信号与它当前的最佳估计值进行比较,直到它得到最接近的值,并在 10 个时钟周期内(在 10 位分辨率的情况下)找到样本的正确数字值。

这种类型的电路的另一个优点是使用了输出缓冲器,它允许由 ADC 供电的电路在 ADC 已经在处理下一个样本时读取数字数据。

硬件视图

[编辑 | 编辑源代码]

Mizar32 有一个模数转换器,它在最多八个输入(ADC0 到 ADC7)之间复用。

ADC 通道可以在硬件中设置为执行 8 位或 10 位转换,输入电压范围为 0V 到 VDDANA(BUS1,第 9 脚),它通过 R3(一个 0 欧姆电阻)连接到 Mizar32 主板上的 3.3V。

信号 GPIO 总线引脚 PicoLisp 备注
ADC0 PA21 BUS5 引脚 5 'PA_21
ADC1 PA22 BUS5 引脚 6 'PA_22
ADC2 PA23 BUS5 引脚 7 'PA_23
ADC3 PA24 BUS2 引脚 3 'PA_24 (1)
ADC4 PA25 BUS6 引脚 4 'PA_25
ADC5 PA26 BUS6 引脚 5 'PA_26
ADC6 PA27 BUS6 引脚 6 'PA_27
ADC7 PA28 BUS6 引脚 7 'PA_28

(1) ADC3 与以太网中断共享一个总线引脚,当没有以太网附加板时,可以作为 ADC 输入使用。

软件视图

[编辑 | 编辑源代码]

Hempl 的 ADC 模块用于配置和读取 ADC 输入。至少需要两个函数调用:一个启动转换,另一个读取结果值,结果值范围从 0(在 0V 时)到 1023(在 3.3V 时)。

在 PicoLisp 中

# Repeatedly measure and print the value on ADC channel 0
(setq adc-channel 0) # Measure the first ADC channel
(loop
   (adc-sample adc-channel 1) # start conversion of one sample
   (prinl (adc-getsample adc-channel)) ) # read the result and print it

如果 ADC 引脚没有用作 ADC 输入,它可以通过在 PIO 子系统中调用 setdir 函数来用作通用 PIO 引脚。例如,要将 BUS5 引脚 7(ADC5)用作 PIO 输出而不是 ADC 输入,你可以使用以下代码

(pio-pin-setdir *pio-output* 'PA_24)

请注意,ADC 的 setclock 函数在 AVR32 上没有实现。参见 问题 #25

进一步阅读

[编辑 | 编辑源代码]
华夏公益教科书