480 likes | 608 Vues
模拟量输入输出通道. (共 2 学时). 训练目的. 1 、 了解计算机如何采集工业系统中的模拟信号。 Inportb—— 读端口 ( 寄存器 ) Intvar=Inportb ( 基地址 + 偏移地址 ) 2 、了解计算机如何输出模拟信号。 Outportb—— 写端口 ( 寄存器 ) Outportb( 基地址 + 偏移地址, Intvar). 设备与器材. IPC-610 工业控制计算机一台(带 ACL-8112 PG 数据采集卡一块) PCLD-880 REV. A1 端子板一块 37 芯扁平电缆一条 直流稳压电源一台 示波器一台
E N D
模拟量输入输出通道 (共2学时)
训练目的 1、 了解计算机如何采集工业系统中的模拟信号。 Inportb——读端口(寄存器) Intvar=Inportb (基地址+偏移地址) 2、了解计算机如何输出模拟信号。 Outportb——写端口(寄存器) Outportb(基地址+偏移地址,Intvar)
设备与器材 • IPC-610工业控制计算机一台(带ACL-8112 PG数据采集卡一块) • PCLD-880 REV. A1端子板一块 • 37芯扁平电缆一条 • 直流稳压电源一台 • 示波器一台 • 数字万用表一个 • 信号发生器一台
数字量 模拟量输出/输入系统的一般组成 Outportb(基地址+偏移地址,Intvar) A/D转换 D/A转换 模拟信号 Intvar=Inportb (基地址+偏移地址) 端子板 信号调理电路 驱动电路 工业系统
1)A/D不主动工作,要有 触发信号; 2)多种触发方式可以选择 3)方式要约定 4)转换是逐位进行,需要 一定时间30us 5)完成通知CPU 6)按照规定的数据传输方 式传入计算机 模拟量输入通道的一般组成 每个通道输入的模拟量的范围不同,选择不同的增益 AD0 AD1 AD15 先采样,再保持,等待处理(存放在寄存器) 公用一套电路,要进行通道选择
V1 模拟传感器 信号调理 V2 模拟传感器 信号调理 可编程 放大器 Vk 模拟传感器 信号调理 Vn 模拟传感器 信号调理 A/D通道内部工作原理 工业系统 多 路 开 关 M U X Vk Vd VG Vh A/D 寄 存 器 S/H 接口 电路 … … 采样 触发 信号 gain 锁存 信号 … … 控制电路 channel = k 控制线 数据总线 选通道:channel = k 设定增益:gain 选择触发方式
模拟量输入的实现 1. 多路控制:决定哪一路信号进入通道 2. 可编程放大器:调节输入信号幅值范围 3. A/D转换:模拟量转化成计算机可处理的数字量 4. 数据传输:转化结果传送到内存
问题1: 同时会有多路模拟信号输入,每一路信号选用一个A/D通道,采集卡有16路A/D通道,哪一路工作?
V1 模拟传感器 模拟传感器 模拟传感器 模拟传感器 信号调理 信号调理 信号调理 信号调理 V2 Vk Vn 多路开关MUX的工作原理 channel=k 工业系统 MUX Vk … … … …
A/D通道多路开关寄存器 解决: 多路转换控制寄存器 地址:base+10 属性:只写 说明:CL3~CL0 A/D转换通道号 • 数据格式:低4位提供了A/D通道号:CL3~CL0对应0~15号通道 • 0000 ~ 1111 (AD0~AD15) • outportb(base+10,channels )
问题2: 各路模拟的信号幅值范围不同 ,怎么办?
A/D增益寄存器 采集卡的最大输入电压,由跳线决定,可以是±5V或±10V 模拟信号输入的最大电压 Outportb(base+9,0)
问题3: 模拟电压输入后,如何使A/D转换开始?
触发:给一控制信号,使A/D开始 A/D转换触发 模拟电压经端子板送到采集卡输入口后,采集卡并不会主动开始工作,需要给它一个触发信号启动A/D过程。 A/D转换触发方式: • 软件触发; • 板上定时触发; • 外部脉冲触发。
A/D操作模式控制寄存器 outportb(Base+11,1) • 模式控制寄存器 • 地址:base+11 • 属性:只写 • 说明:若触发方式跳线跳到内部时,内部触发可选方式:
A/D软件触发寄存器 • 如果给ACL-8112PG的A/D转换产生一个触发脉冲,只要向这个软件触发寄存器写一个任意值,A/D转换器就会被触发; • 软件触发寄存器 • 地址:Base+12 • 属性:只写 outportb(BASE+12,0) 可以为任意值
问题4: 如何知道A/D转换已经完成?
A/D转换逐位进行,需要一定的时段( ),因此必须使CPU知道转换已完成,并约定方式使转换结果送入内存 • A/D转换结果的传输方式有三种: 1. 查询方式传输: 查询A/D完成位DRDY,然后再从寄存器读取数据到内存变量。 2. 中断传输: A/D转换完成后发中断请求,然后由中断服务程序读取数据。 3.DMA传输: (Direct Memory Access)直接内存访问,DMA方式下由于不直接访问计算机的CPU,而直接在RAM与设备之间传输,因而大大提高了数据传输速度,适用于高速采集。
A/D数据寄存器 Data ReaDY 说明:DRDY为转换完成标志位 DRDY=1:A/D转换没有完成 =0:A/D转换完成 。 当读A/D低字节寄存器(Base+4)时,变回1。 例:判断A/D是否转换完成:inportb(Base+5)&0x10 说明:AD11~AD0:A/D转换完成后的数据。 AD0是最低位(LSB),AD11是最高位(MSB)。
问题5: 如何读取A/D转换完成后的数据?
数据读取 A/D数据寄存器 地址:base+4(低字节) AD7 ~AD0 base+5(高字节)AD11 ~AD8 属性:只读 说明: AD11~AD0 12位 注意: 先读高字节,再读低字节
问题6: 如何将高字节和低字节合并为一个12位二进制数?
解决: 将高字节左移8位后,与低字节相加。 temp=Hbyte<<8 +Lbyte inputData=Inportb(Base+5)&0x0F<<8 + inportb(Base+4)
问题7: 如何将读入的12位二进制数转换为十进制电压值?
±10V 0-4095(=212-1) 12位二进制数 数字信号与模拟信号的对应:
0 – 4095(212-1) ±10V 12位2进制数 inputData=Inportb(Base+5)&0x0F<<8 + inportb(Base+4) Volt=(inputData-2047)*20.0/4095 Volt=inputData*20.0/4095-10.0
+10V 0V -10V 12位A/D的量化 umax 1111 1111 1111 =4095 1111 1111 1110 =4094 0.004884V 0111 1111 1111 =2047 q=( umax-umin)/2n-1 0000 0000 0001 = 1 umin 0000 0000 0000 = 0
模拟量输入通道小结 Outportb (Base+11,控制字) Outportb (Base+12,控制字) Outportb (Base+9,增益) Outportb (Base+10,通道号) Inportb(Base+5) Inportb(Base+4)
模拟量输入过程总结 • 选择A/D通道,通过写多路转换控制寄存器(Base+10) • 确定增益,通过写增益控制寄存器(Base+9) • 选择触发方式,通过写模式控制寄存器(Base+11) • 启动软件触发,通过写寄存器(Base+12) • 判断DRDY,通过读寄存器(Base+5)&0x10,等待A/D完成 • 完成后从数据寄存器(Base+5)(Base+4)中读数据读数据,先读高字节(Base+5),再读低字节(base+4)。 • 将整数值转换成模拟电压值,用作计算机显示。
A/D初始化 A/D转换 软件触发方式的A/D流程图 选择通道 base+10, channel 设置增益 base+9, gain 设置触发模式 base+11, 1 触发A/D转换 base+12, 1 N N 转换完成? DRDY=0? Y Y base+5, base+4 读取A/D寄存器数据 拼接成12位二进制码 hbyte&0x0f<<8+lbyte 译码 计算AD采样值 V_out = A/D_word*20.0/4095-10.0
模拟量输出通道(AO) • 任务:把计算机输出的数字量信号转换成模拟电压或电流信号,以便去驱动相应的执行机构,达到控制目的; • 组成:一般由接口电路、数/模转换器和电压/电流变换器组成; • 核心:数/模转换器,简称D/A或DAC (digital-to-analog converter),通常也把模拟量输出通道(AO)简称为D/A通道。
模拟量输出通道的一般组成 每一路都是独立的 Outportb (Base+4) Outportb (Base+5)
D/A输出寄存器 D/A#1 outportb(Base+4,lbyte); outportb(Base+5,hbyte); 先写低字节 后写高字节 D/A#2 outportb(Base+6,lbyte); outportb(Base+7,hbyte);
D/A的实现 • 明确使用的D/A通道,第1路对应高字节(Base+5),低字节(Base+4);第2路对应高字节(Base+7),低字节(Base+6)。 • 先写低字节,后写高字节。写高字节时,和低字节的内容同时送到DA转化器。 • D/A通道输出范围为0~10V。
scanf(“%f”,&Vout) 得到一个十进制数值 V_word = Vout*4095/10 把10进制数转换为12位2进制编码 V_wordbase+4(6), base+5(7) 把12位2进制编码送出 delay(30) 延迟30μs hbyte=(V_word>>8)&0x0F; lbyte= V_word&0xFF; outportb(Base+4+port*2,lbyte); outportb(Base+5+port*2,hbyte); D/A输出操作流程 注意: D/A转换需要时间(30μs),对于高速的CPU,相邻两次D/A操作之间可能需要加等待延时。
ACL-8112PG采集卡在工控机中的安装 (DO) (AD/DA) • CN1:开关量输出 • CN2:开关量输入 • CN3:模拟量单端输入与输出 (DI)
采集卡和端子板对应关系 至采集卡CN3
采集卡和端子板对应关系 • AD10 :A6 • GND : • A17 ~A20 • DA1 :B2 • GND : • B7 、B9
训练内容 1.模拟量输出通道D/A (1)运行演示程序(test.exe) 产生一个方波或正弦波信号,周期1ms~5ms可调,幅值0~10V可调。用示波器观察上述波形: DA 1号通道(B2、B7) (!!!注意示波器的探头的正确使用,不能相碰;否则设备损害,照价赔偿) (2)单步运行范例程序 按F8键,单步运行DA_ONE.C程序,由键盘键入需要输出的直流电压值( 0~+10V,源程序见附录5)。利用“watch”区域观察有关变量的值,确认并记录程序中的关键语句及其作用。注意对采集卡各端口的寻址和数据格式。 (运行E:\第二层次\DA_ONE.C;用数字电压表量DA输出端的电压)
训练内容(续) 2.模拟量输入通道A/D (1)运行演示程序:(test.exe) 计算机由10号A/D通道将信号采入,在显示器上显示0~+10V直流电压、正弦波信号和方波信号(10HZ—100HZ),这时,计算机相当于一个数字示波器。演示中可以用信号发生器作为信号源,也可以将演示程序D/A部分所产生的信号作为信号源。 (2)单步运行范例程序 单步运行AD_ONE.C程序(源程序见附录5),该程序将一个直流电压信号采入计算机,以数字形式显示,程序运行中,利用“watch”区域观察有关变量的值,确认程序中的关键语句及其作用,作记录。 (运行E:\第二层次\AD_ONE.C;直流电压由直流稳压电源提供)
DO AD/DA 输入 DI 输出 训练接线图 接示波器 1、输入A/D通道的电压严禁超出±10V; 2、输出D/A通道严禁短路; 3、在关机状态下接线! 4、所有接线请注意和相应的读写寄存器地址对应; 5、不能同时接CN1和CN2! 接信号发生器或直流稳压电源
AD通道程序(附录5.1) #define BASS_ADDRESS 0x220 /*设置板卡基地址*/ int Channel=10; /*定义通道号变量*/ main() /*AD主函数*/ { unsigned short int DRDY; int hbyte,lbyte; float temp; char c; /*定义变量*/ outportb(BASS_ADDRESS+10,Channel); /*选择通道*/ outportb(BASS_ADDRESS+9,0); /*输入电压范围-10~+10V*/ outportb(BASS_ADDRESS+11,1); /*选择软件触发方式*/ while(1) { DRDY=1; /*转换完成标志位置于未完成*/ outportb(BASS_ADDRESS+12,1); /*AD软件触发*/
AD通道程序(续) while((DRDY!=0)&&(!kbhit())) /*AD转换未完成且无键盘响应*/ { DRDY=inportb(BASS_ADDRESS+5)&0x10; } /*查询等待AD转换完成*/ hbyte=inportb(BASS_ADDRESS+5)&0x0F; /*先读高字节*/ lbyte=inportb(BASS_ADDRESS+4)&0xFF; /*再读低字节*/ temp=((hbyte<<8)+lbyte-2047)*20.0/4095.0; /*换算模拟电压值*/ printf(“\nValue=%f”,temp); /*显示输入的电压值*/ printf("\nPress N to next and Press other key to quit!!"); c=bioskey(0); if(c=='n'||c=='N') continue; else break; } }
DA通道程序(附录5.2) #define BASS_ADDRESS 0x220 /*设置板卡基地址*/ int Channel=1; /*定义通道号变量*/ main() /*DA主函数*/ { float Outputdata; int lbyte,hbyte; int out=0; char c; /*定义变量*/ while(1) { clrscr(); /*清屏*/ printf("\nPlease input Amplitude (0~10V):"); scanf(“%f”,&Outputdata); /*键盘输入直流电压信号*/
DA通道程序(续) out=Outputdata*4095.0/10.0; /*换算电压值对应的代码*/ hbyte=(out>>8)&0x0F; /*代码高4位放入高字节变量*/ lbyte=out&0xFF; /*代码低8位放入低字节变量*/ outportb(BASE_ADDRESS+4+2*(Channel-1),lbyte); /*先写DA低字节,通道1为Base+4,通道2为Base+6*/ outportb(BASE_ADDRESS+5+2*(Channel-1),hbyte); /*再写DA高字节,通道1为Base+5,通道2为Base+7*/ printf("\nPress N to next and Press other key to quit!!"); c=bioskey(0); if(c=='n'||c=='N') continue; else break; /*继续程序或退出*/ } outportb(BASE_ADDRESS+4+2*(Channel-1),0); outportb(BASE_ADDRESS+5+2*(Channel-1),0); } /*对应的DA通道寄存器清零*/
作业 1、改写AD和DA通道程序为子程序 • int AD (int channel) /*0-15*/ { …… } • DA(int channel, int data) /*1-2;0-10V */{…… } 2、预习:信号离散化