【ARM9嵌入式系统硬件设计指南】模拟输入输出模块的应用

-回复 -浏览
楼主 2020-06-29 14:54:39
举报 只看此人 收藏本贴 楼主

摘要

AMiC系列模块使用简单,不需要连接过多的外部器件,只需要配备一个微控制器,对模块进行控制就可以读取到各个模拟通道的输入电压值...

9.7 模拟输入输出模块的应用



图9‑57 AMiC系列模块的简单应用


AMiC系列模块使用简单,不需要连接过多的外部器件,只需要配备一个微控制器,对模块进行控制就可以读取到各个模拟通道的输入电压值,如图 9‑57所示。下面以AMiC-1204AIO-5ID模块为例进行说明。


9.7.1 模拟输入输出模块硬件连接


AMiC-1204AIO-5ID模块共有两个对外接口:一个用于4路差分信号输入及2路模拟输出的接口,另一个经过光耦隔离与微控制器连接的控制接口。AMiC-1204AIO-5ID的硬件连接如图 9‑58所示。



图9‑58 AMiC-1204AIO-5ID硬件连接


在上图中,需要注意的是,需要采用隔离型的DC/DC模块,建议采用输出带稳压的DC/DC模块,以保证对模块模拟信号供电有较低的纹波,例如ZY0512IAKS-1W,如图 9‑59所示。


图9‑59 ZY0512IAKS-1W外观示意图


ZY0512IAKS-1W系列电源模块具有良好的电磁兼容性,输出纹波及噪声非常小,适合用于供电电源稳定(波动范围小于±5%),对输出电压及纹波要求较高的场合,如A/D、D/A 转换电路,信号采样电路。


9.7.2 模拟输入输出模块软件操作


1.通道选择


AMiC-1204AIO-5ID内部采用模拟开关实现4个差分通道之间的切换,通道切换的实现由控制信号CHSEL1和CHSEL0来控制。CHSEL1和CHSEL0的引脚电平与选择通道之间的关系如表 9.8所示,通道选择的程序实现如程序清单9.1所示。


表9.8通道选择


CHSEL1

CHSEL0

选通的通道

0

0

差分输入通道AI0

0

1

差分输入通道AI1

1

0

差分输入通道AI2

1

1

差分输入通道AI3


程序清单9.1通道选择程序


*引脚定义*/

#define CHSEL0 (1 << 16)//P0.16

#define CHSEL1 (1 << 17)//P0.17

/*******************************************************************************************

** 函数名称:CH_SEL

** 函数功能:选择模拟开关的通道

** 入口参数:n 待选通的通道,取值范围为1~4

** 出口参数:无

*******************************************************************************************/

void CH_SEL(uint8 n)

{

uint32 m;

m = (n-1)<<16;

IO0PIN=(IO0PIN & 0xFFFCFFFF)|m;

}



2.ADC控制


AMiC-1204AIO-5ID内部的ADC采用三线同步串行控制接口:CS、MISO和CLK。CS是片选信号,低电平时内部ADC被选中,高电平时被关闭。MISO是12位串行数据的输出,传输时,MSB在前,LSB在后。CLK用于同步串行数据的传输和决定转换速率。控制时序如图9‑60所示,时序规范如表 9.9所示。虽然内部的ADC能达到75kHz的采样速率,但是由于模块内部的调理电路的限制,模块能达到的最大采样速率为4kSPS。当增大采样速率(大于4kHz但小于75kHz)时,虽然能正确读取内部ADC的采样值,但该采样值不能反映模块输入端的电压值,只能反映ADC输入引脚的电压值,这是由于输入端到ADC之间的调理电路所限制的。



图9‑60 ADC控制时序


表9.9 时序规范


参数

标号

最小

典型

最大

单位

吞吐率

tCYC



75

kHz

CS下降沿到CLK低电平

tCSD



0

ns

CS下降沿到CLK上升沿

tSUCS

30



ns

模拟输入采样时间

tSMPL

1.5


2.0

Clk Cycles

转换时间

tCONV


12


Clk Cycles


对AMiC-1204AIO-5ID的控制可以使用模拟SPI和硬件SPI两种方式。使用模拟SPI控制AMiC-1204AIO-5ID时,必须先把CLK置低,再把CS置低启动采样,否则将不能正确读取采样值,使用模拟SPI的控制程序如程序清单9.2所示。使用硬件SPI控制AMiC-1204AIO-5ID时,微控制器的CS引脚要配置成GPIO模式,CS置低启动采样,必须经过一段延时后才能使用硬件SPI接口读取采样数据,读取完成后把CS置高,最后把读取的数据经过整合得到采样值,硬件SPI的控制程序如程序清单9.3所示。


程序清单9.2模拟SPI控制程序


/*引脚定义*/

#define CLK (1 << 4)//P0.4

#define MISO (1 << 5)//P0.5

#define MOSI (1 << 6)//P0.6

#define CS (1 << 7)//P0.7

#define LDAC (1 << 18)//P0.18

/*******************************************************************************************

** 函数名称:AMIC1204Init

** 函数功能:初始化控制引脚

** 入口参数:无

** 出口参数:无

*******************************************************************************************/

void AMIC1204Init (void)

{

PINSEL0 &= 0xFFFF00FF; /* 管脚P0.4~7设为GPIO模式 */

PINSEL1 &= 0xFFFFFFC0; /* 管脚P0.16~18设为GPIO模式 */

IO0DIR &= ~MISO; /* 设MISO为输入 */

IO0DIR |= CLK |MOSI| CS| LDAC|CHSEL0|CHSEL1; /* 设置为输出 */

IO0SET |= CLK |MOSI| CS| LDAC; /* CLK、MOSI、CS初始化为高电平 */

}

/*******************************************************************************************

** 函数名称:AMIC1204Read

** 函数功能:读取AMIC的采样值

** 入口参数:无

** 出口参数:AMIC的采样值

*******************************************************************************************/

uint16 AMIC1204Read(void)

{

uint16 i;

uint16 Rdata = 0; /* 定义数据暂存单元 */

IO0CLR |= CLK;

IO0CLR |= CS; /* 启动转换 */

for (i=0;i<3;i++) {

IO0SET |=CLK;

IO0CLR |=CLK;

}

for (i=0;i<12;i++) { /* 读12位数据 */

IO0CLR |= CLK; /* 时钟下降沿 */

Rdata <<= 1;

IO0SET |= CLK; /* 时钟上升沿 */

if (IO0PIN & MISO)

Rdata |= 1; /* 读入数据 */

}

IO0SET |= CS; /* 采样完成 */

return Rdata; /* 返回采样值 */

}


程序清单 9.3 硬件SPI控制程序


/*******************************************************************************************

** 函数名称:AMIC1204Init

** 函数功能:初始化SPI接口,设置为主机

** 入口参数:无

** 出口参数:无

*******************************************************************************************/

void AMIC1204Init (void)

{

PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; /* 设置管脚连接SPI功能 */

IO0DIR |= CS; /* 设置为输出 */

S0PCCR = 0x08;

S0PCR = (0 << 3) | /* CPHA = 0, 数据在SCK 的第一个时钟沿采样*/

(0 << 4) | /* CPOL = 1, SCK 为低有效 */

(1 << 5) | /* MSTR = 1, SPI 处于主模式 */ (0 << 6) | /* LSBF = 0, SPI 数据传输MSB (位7)在先 */

(0 << 7) ; /* SPIE = 0, SPI 中断被禁止 */

}

/*******************************************************************************************

** 函数名称:MSPI_SendData()

** 函数功能:向SPI总线发送数据

** 入口参数:data 待发送的数据

** 出口参数:返回值为读取的数据

*******************************************************************************************/

uint16 MSPI_SendData(uint8 data)

{ uint8 dat;

SPI_SPDR = data;

while( 0 == (SPI_SPSR & 0x80)); /* 等待SPIF置位,即等待数据发送完毕 */

dat=SPI_SPSR;

return(SPI_SPDR);

}

/*******************************************************************************************

** 函数名称:AMIC1204Read

** 函数功能:读取AMIC的采样值

** 入口参数:无

** 出口参数:AMIC的采样值

*******************************************************************************************/

uint16 AMIC1204Read (void)

{ uint32 i;

uint16 data,data1,data2;

IOCLR |= CS; /* 启动采样 */

for(i=10;i>0;i--); /* 延时 */

data1 = MSPI_SendData(0x00); /* 读取到data1 */

data2 = MSPI_SendData(0x00); /* 读取到data2 */

IOSET |= CS; /* 结束采样 */

data1 = data1 << 7;

data2 = data2 >> 1;

data = (data1 | data2 ) & 0x0FFF; /* 整合data1和data2得到采样值 */

return (data); /* 返回采样值 */

}


AMiC-1204AI-5ID内部的ADC芯片的基准源是使用了内部DAC芯片输出的基准源,该基准源的使用需要对DAC芯片进行设置,所以采集各通道的模拟输入之前,必须对DAC芯片进行初始化,详细请看DAC芯片的基准源选择和程序实例部分。


3.多通道采集实例


多通道采样时,在通道切换和读取采样值之间应该要有足够长的等待时间,让ADC输入引脚的电压稳定下来。最好的方法是读取采样值后立即切换到下一通道,当下一次读取采样值时,该采样值就是上次切换的通道的电压值,这样可以使通道切换到读取采样值之间有足够长的等待时间,如图9‑61所示。以下给出使用AMiC-1204AI-5ID实现的多通道采集程序,程序的流程框图如图9‑62所示,程序如程序清单9.4所示。


图9‑61 多通道采样方法



图9‑62 多通道采集流程图


程序清单9.4 多通道采集实例


int main (void)

{

uint16 i;

uint16 data[800]; /* 定义存储采样数据的数组 */

uint8 ch=0;

AMIC1204Init(); /* 初始化 */

for(i=0;i<800;i++){ /* 循环切换通道,采集800个采样数据 */

ch++;

if(ch==5) ch=1;

CH_SEL(ch); /* 切换到下一个通道 */

Delay(); /* 延时,使通道电压稳定 */

data[i]=AMIC1204Read (); /* 读取通道采样值 */

}

/*以下是数据处理,略*/

}


4. DAC控制


AMiC-1204AIO-5ID内部的DAC芯片是一款双12位缓冲电压输出数模转换器,具有小封装、低功耗等特点。完成D/A转换操作只需4根控制线:CS、CLK、MOSI和LDAC。


(1)输入数据的格式


输入移位寄存器是24位宽度,数据结构如图9‑63所示。第1、2位是保留位,接着是三个的命令位C2-C0,含义见表9.10,然后是3位通道选择位A2-A0,含义见表9.11,接着是12位数据位,最后4位作为保留位。在一个有效的写序列中,CS信号应始终保持低电平,CLK至少有24 次下降沿,如图9‑64所示。



图9‑63 DAC数据结构



图9‑64 DAC转换时序


表9.10 命令位含义


C2

C1

C0

执行命令

0

0

0

写输入寄存器n

0

0

1

更新DAC寄存器n

0

1

0

写输入寄存器n,更新所有输出

0

1

1

写和更新通道n输出

1

0

0

使芯片掉电

1

0

1

复位

1

1

0

LDAC寄存器设置

1

1

1

参考源设置


表9.11 通道选择位含义


A2

A1

A0

通道(n)

0

0

0

通道A

0

0

1

通道B

0

1

0

保留

0

1

1

保留

1

1

1

所有通道


(2)复位


DAC芯片内置一个上电复位控制电路,在上电过程中,保持输出端的电压一直为0V。在上电结束后,输出仍然保持为0V,直到程序改变DAC寄存器数值为止。


DAC芯片也包含一个软件复位功能,通过命令位C2C1C0=101的命令来实现,数据结构见表9.12。软件复位功能包含了两个模式,两个复位模式清零的寄存器不同,通过设置控制寄存器位DB0来选择,具体见表9.13。


表9.12 软件复位数据结构


DB23-DB22

DB21

DB20

DB19

DB18

DB17

DB16

DB15-DB1

DB0

×

1

0

1

A2

A1

A0

×

1/0

忽略

命令位

选择通道位

忽略

软件复位模式


表9.13 软件复位模式


DB0

清零的寄存器

0

DAC寄存器

输入寄存器

1

DAC寄存器

输入寄存器

LDAC寄存器

掉电寄存器

参考源寄存器


(3)LDAC引脚功能选择


DAC芯片每个通道使用两个寄存器构成的双缓冲结构,分别是输入寄存器和DAC寄存器。输入寄存器和输入移位寄存器直接相连,当一个有效的写操作完成后,有效的数据将转移到输入寄存器中。DAC寄存器包含了数模转换用的电阻阵列,DAC寄存器中数值通过电阻阵列转换后输出。数据从输入寄存器转移到DAC寄存器是受LDAC引脚控制的。当LDAC引脚为高,DAC寄存器锁存数据,输入寄存器内容的改变不会影响DAC寄存器。当LDAC为低, DAC寄存器随着输入寄存器内容改变而改变。


同步DAC:当LDAC引脚未使能或者LDAC使能后一直为低,第24个CLK下降沿到来后,数据直接更新DAC寄存器并转换输出。


异步DAC:当输入寄存器内容更新时,DAC寄存器没有立即更新,当LDAC拉低时,DAC寄存器才被更新。LDAC引脚的使能,可以通道软件设置实现,具体操作见表9.14和表9.15。


表9.14 LDAC引脚功能选择数据结构


DB23-DB22

DB21

DB20

DB19

DB18-DB2

DB1

DB0

×

1

1

0

×

通道B

通道A

忽略

命令位

忽略

/LDAC寄存器操作模式


表9.15 LDAC寄存器操作模式


LDAC位(DB0或DB1)

LDAC引脚

LDAC操作模式

0

0/1

LDAC引脚为低,更新通道n的输出

1

第24个CLK上升沿时,更新通道n的输出


(4)参考源选择


DAC芯片可以使用两种参考源:内部参考源和外部参考源,模块使用的是芯片内部参考源。DAC芯片上电复位后,默认使用的是外部的参考源,所以要通过命令位来切换到内部参考源,可以通过命令位C2C1C0=111的命令实现,具体操作见表9.16和表9.17。


表9.16 参考源选择数据结构


DB23-DB22

DB21

DB20

DB19

DB18

DB17

DB16

DB15-DB1

DB0

×

1

1

1

A2

A1

A0

×

1/0

忽略

命令位

选择通道位

忽略

参考源选择


表9.17 参考源选择


DB0

功能

0

VREF作为输入,芯片使用外部参考源(缺省时状态)

1

VREF作为输出,芯片使用内部参考源


(5)程序举例


一个完整的数据包有24bit,以模拟SPI形式将24bit的数据写到DAC芯片中,高位在前,低位在后,具体过程见程序清单9.5。


程序清单9.5 DAC写数据


/*******************************************************************************************

** 函数名称:AMIC1204Write

** 函数功能:DAC写入数据或命令

** 入口参数:写入数据

** 出口参数:无

*******************************************************************************************/

void AMIC1204Write (uint32 Data)

{

uint32 i;

IO0CLR |= CS; /* 同步信号 */

for (i=0;i<24;i++) { /* 发送24位数据 */

if (Data & 0x00800000) /* 判断0或1,高或低输出 */

IO0SET |= MOSI;

else

IO0CLR |= MOSI;

IO0CLR |= CLK; /* 时钟下降沿 */

Data <<= 1;

IO0SET |= CLK; /* 时钟上升沿 */

}

IO0SET |= CS; /* 发送完成 */

}


DAC芯片每次硬件上电后或者软件复位后,需要根据实际的电路配置芯片的内部功能,例如LDAC引脚是否使用、使用外部还是内部参考源等,DAC芯片初始化过程见程序清单9.6,DAC初始化程序完成了对DAC芯片进行软件复位,设置LDAC为低电平时更新输出,设置使用内部的基准源作为数模转换的基准并输出一个基准源供ADC芯片使用。设置某通道输出电压的程序如程序清单9.7所示。


程序清单9.6 DAC初始化


AMIC1204Write((5<<19) | (7<<16) | 1); /* 软件复位DAC */

AMIC1204Write((6<<19) | 0); /* 设置DAC的LDAC引脚功能有效 */

AMIC1204Write((7<<19) | (7<<16) | 1); /* 使用内部参考源并输出基准源供ADC使用 */


程序清单9.7 设置输出电压值


/*******************************************************************************************

** 函数名称:AMIC1204OUT

** 函数功能:向AMIC1204的某通道输出设定的电压值

** 入口参数:ch 通道号

data 输出值

** 出口参数:无

*******************************************************************************************/

void AMIC1204OUT(uint8 ch,uint16 data)

{

uint16 M;

M = data & 0x0FFF;

AMIC1204Write((3<<19) | ((ch&0x01)<<16) | M<<4); /* 把M写入DAC */

IO0CLR |= LDAC; /* 更新输出 */

IO0SET |= LDAC;

}






致远电子 (ID: ZLG_zhiyuan )

还没关注致远电子?您将错过每日泛着油光的干货!您将错过一段颠覆洋品牌的历史!!有时候你想证明给一万个人看,到后来,你发现只得到了一个明白的人,那就够了。你是我们期待已久的粥粉么?我们的微信号:ZLG_zhiyuan。

我要推荐
转发到