精华内容
下载资源
问答
  • 本文提供的方式充分利用了A/D转换器的输入电压动态范围和量化位数优势,实现了对多路模拟信号的自适应采集,对其他信号采集系统也具有一定的借鉴意义。  l 系统设计  该系统主要由信号调理电路、采集电路和时序
  • 摘要:本文对多路测量信号的扩频传输系统进行了研究,提出了对所传输信号的频谱进行扩展并利用码分复用实现多路信号的复用传输的方法。分析了多路测量信号扩频传输系统的 DSP系统实现的整体方案,并实现电路的设计。...
  • 本设计中的多路交通信号灯状态监测系统硬件基于MSP430F149单片机,利用内部集成ADC模块实现多路信号的采集。软件部分,通过中位值平均滤波算法对采样数据进行处理,有效的抑制了由脉冲干扰所引起额采样值偏差。同时...
  • 摘要:本文对多路测量信号的扩频传输系统进行了研究,提出了对所传输信号的频谱进行扩展并利用码分复用实现多路信号的复用传输的方法。分析了多路测量信号扩频传输系统的 DSP系统实现的整体方案,并实现电路的设计。...
  • 针对多路输出的本质安全型电源故障的识别方法是每路电源独立检测采集的方法,路数越多其进行识别成本越高,且电路较复杂。设计一种基于特征电流进行识别的方法,采用电压门限比较、二进制编码等方法,根据信号采集端的...
  • 本设计用于 12 导联直流耦合心电信号的测量,实现了导联脱落信号检测、起搏信号检测、50Hz/60Hz陷波器选择、高通滤波器截止频率选择等功能。 硬件设计介绍 • 12导联诊断级心电信号测量(0.05Hz~150Hz) • 18 位ADC...
  • 通过针对强噪声干扰下的弱信号,设计了相应的多路多级放大电路,并对低噪声前置放大器进行分档设计;同时通过单点并联接地及抗干扰设计抑制噪声干扰。在软件设计上通过一阶数字滤波及数字式平均对数据进行进一步的...
  • 为了解决工控领域多路交流电参数检测,需要独立进行单路测量电路设计的问题,给出了一种基于ADE7878芯片和嵌入式技术设计的多路电参数采集系统的硬件电路和程序流程。系统采用LPC2132作为主控芯片,适时控制4052多路...
  • 所设计的电路多路信号检测系统和多路信号控制系统集成在一起,解决了一些需要检测和控制联合应用的案例,且设备操作简单,系统应用广泛,尤其适合于汽车信号控制及检测等情形。通过对该电路进行仿真和实际电路的...
  • 摘 要:为了满足某测试设备对多种直流电源的需求,提出了一种能够输出多种直流电压的AC/...要实现高精度的准确测试,测试设备中的电压信号经过电路后要提供准确的电压值,这就对电源模块的准确度提出了很高的要求。  
  • 4ADC电压采集与LCD显示 使用ADC1通道和ADC2同时采集 ADC1通道PA0-PA9可在adc.c中先修改引脚, 再修改对应数字通道号adcx=Get_Adc_Average(ADC_Channel_7,20);//获取通道7的转换值,20次取平均 ADC2通道PC0-PC3对应...

    **STM32F407无线遥控4路ADC电压采集与LCD显示

    介绍:使用ADC1通道和ADC2同时采集(正点原子源代码修改)

    ADC1通道PA0-PA9可在adc.c中先修改引脚,
    再修改对应数字通道号adcx=Get_Adc_Average(ADC_Channel_7,20);//获取通道7的转换值,20次取平均
    ADC2通道PC0-PC3对应通道10-13可在adc.c中先修改引脚,
    再修改对应数字通道号adcx=Get_Adc_Average1(ADC_Channel_10,10);//获取通道0的转换值,10次取平均

    遥控:按下KEY_0为接收模式,KEY_1为发射模式,遥控使用PA5,PA7两路电压采集为单遥感可控制小车前进后退左转右转,归位停止
    (未写PWM波控制)
    硬件连接:
    遥感:PA5,PA7
    KEY0按键(连接在PE4)/KEY1按键(连接在PE3)
    NRF24L01模块(SPI1(PB3/PB4/PB5)/IRQ(PG8)/CS(PG7)/CE(PG6)).(原理图下载可看另一篇博客末尾链接)

    电机控制io:PC6 PC7 --PC8 PC9
    (L298N使能端跳线帽不拔,若用PWM波时接IO,电机IO定义位于led.c与led.h)*

    本文源代码链接:
    链接:https://pan.baidu.com/s/1sR2hARq8hdMJc2lxBQjUuQ
    提取码:0eky

    1、adc.c(注释IO有些未改)

    #include "adc.h"
    #include "delay.h"		 
    
    
    //初始化ADC															   
    void  Adc_Init(void)
    {    
      GPIO_InitTypeDef  GPIO_InitStructure;
    	ADC_CommonInitTypeDef ADC_CommonInitStructure;
    	ADC_InitTypeDef       ADC_InitStructure;
    	
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOA时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); //使能ADC1时钟
      //先初始化ADC1通道5 IO口
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;//PA5 通道5
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
      GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  
     
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//PA5 通道5
    	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
      GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化  
    	
    	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);	  //ADC1复位
    	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);	//复位结束	 
    	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,ENABLE);	  //ADC1复位
    	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC2,DISABLE);	//复位结束	 
     
    	
      ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
      ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
      ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能
      ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
      ADC_CommonInit(&ADC_CommonInitStructure);//初始化
    	
      ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
      ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式	
      ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
      ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐	
      ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
      ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
    	ADC_Init(ADC2, &ADC_InitStructure);//ADC初始化
    	
     
    	ADC_Cmd(ADC1, ENABLE);//开启AD转换器	
    	ADC_Cmd(ADC2, ENABLE);//开启AD转换器	
    
    }				  
    //获得ADC值
    //ch: @ref ADC_channels 
    //通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16
    //返回值:转换结果
    u16 Get_Adc(u8 ch)   
    {
    	  	//设置指定ADC的规则组通道,一个序列,采样时间
    	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );	//ADC1,ADC通道5,480个周期,提高采样时间可以提高精确度	
    	//ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );	//ADC1,ADC通道7,480个周期,提高采样时间可以提高精确度		
      
    	ADC_SoftwareStartConv(ADC1);		//使能指定的ADC1的软件转换启动功能	
    	 
    	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    
    	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
    	//ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_480Cycles );	//ADC1,ADC通道5,480个周期,提高采样时间可以提高精确度	
    }
    u16 Get_Adc1(u8 ch)
    	{
    		ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_480Cycles );
    	//ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );	//ADC1,ADC通道7,480个周期,提高采样时间可以提高精确度		
      
    	ADC_SoftwareStartConv(ADC2);		//使能指定的ADC1的软件转换启动功能	
    	 
    	while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC ));//等待转换结束
    
    	return ADC_GetConversionValue(ADC2);	//返回最近一次ADC1规则组的转换结果
    	}
    //获取通道ch的转换值,取times次,然后平均 
    //ch:通道编号
    //times:获取次数
    //返回值:通道ch的times次转换结果平均值
    u16 Get_Adc_Average(u8 ch,u8 times)
    {
    	u32 temp_val=0;
    	u8 t;
    	for(t=0;t<times;t++)
    	{
    		temp_val+=Get_Adc(ch);
    		delay_ms(5);
    	}
    	return temp_val/times;
    } 
    
    u16 Get_Adc_Average1(u8 ch,u8 times)
    {
    	u32 temp_val1=0;
    	u8 t;
    	for(t=0;t<times;t++)
    	{
    		temp_val1+=Get_Adc1(ch);
    		delay_ms(5);
    	}
    	return temp_val1/times;
    } 
    

    2、adc.h

    #ifndef __ADC_H
    #define __ADC_H	
    #include "sys.h" 
     							   
    void Adc_Init(void); 				//ADC通道初始化
    u16  Get_Adc(u8 ch); 				//获得某个通道值 
    u16  Get_Adc1(u8 ch); 				//获得某个通道值 
    u16 Get_Adc_Average(u8 ch,u8 times);//得到某个通道给定次数采样的平均值  
    u16 Get_Adc_Average1(u8 ch,u8 times);//得到某个通道给定次数采样的平均值  
    #endif 
    

    3.main.c

    #include "sys.h"
    #include "delay.h"
    #include "usart.h"
    #include "led.h"
    #include "lcd.h"
    #include "spi.h"
    #include "key.h" 
    #include "24l01.h"
    #include "adc.h"
    
    //要写入到W25Q16的字符串数组
    const u8 TEXT_Buffer[]={"Explorer STM32F4 SPI TEST"};
    #define SIZE sizeof(TEXT_Buffer)	 
    	
    int main(void)
    { 
    	u8 key,mode;
    	u16 adcx,adcx1,ADCX2,ADCX3;
    	float temp,temp1,TEMP2,TEMP3;
    	u16 t=0;			 
    	u8 tmp_buf[33];	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    	delay_init(168);  //初始化延时函数
    	uart_init(115200);	//初始化串口波特率为115200
    	LED_Init();					//初始化LED 
     	LCD_Init();					//LCD初始化  
     	KEY_Init();					//按键初始化
     	NRF24L01_Init();    		//初始化NRF24L01 
      Adc_Init();         //初始化ADC
     	
    	POINT_COLOR=RED;//设置字体为红色      
    	LCD_ShowString(30,50,200,16,16,"ADC1_CH7_VOL:0.000V");	//先在固定位置显示小数点    
    	LCD_ShowString(30,70,200,16,16,"ADC1_CH5_VOL:0.000V");	//先在固定位置显示小数点  
      LCD_ShowString(30,90,200,16,16,"ADC2_CH1_VOL:0.000V");	//先在固定位置显示小数点  
      LCD_ShowString(30,110,200,16,16,"ADC2_CH3_VOL:0.000V");	//先在固定位置显示小数点   	
    	while(NRF24L01_Check())
    	{
    		LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
    		delay_ms(200);
    		LCD_Fill(30,130,239,130+16,WHITE);
     		delay_ms(200);
    	}
    	LCD_ShowString(30,130,200,16,16,"NRF24L01 OK"); 	 
     	while(1)
    	{	
    		key=KEY_Scan(0);
    		if(key==KEY0_PRES)
    		{
    			mode=0;   
    			break;
    		}else if(key==KEY1_PRES)
    		{
    			mode=1;
    			break;
    		}
    		t++;
    		if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode  KEY1:TX_Mode"); //闪烁显示提示信息
     		if(t==200)
    		{	
    			LCD_Fill(10,150,230,150+16,WHITE);
    			t=0; 
    		}
    		delay_ms(5);	  
    	}   
     	LCD_Fill(10,150,240,166,WHITE);//清空上面的显示		  
     	POINT_COLOR=BLUE;//设置字体为蓝色	   
    	if(mode==0)//RX模式
    	{
    		LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");	
    		LCD_ShowString(30,170,200,16,16,"Received DATA:");	
    		NRF24L01_RX_Mode();		  
    		while(1)
    		{	  		    		    				 
    			if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
    			{
    				tmp_buf[32]=0;//加入字符串结束符
    				LCD_ShowString(30,190,lcddev.width-1,32,16,tmp_buf);    
    							switch(tmp_buf[0])
    				{
    					case 'A':
    						//LED0 = 1;                                                                                                         
    						LED1 = 1;
    						IN0=1;IN1=1;
    						IN2=1;IN3=1;
    //						delay_ms(500);
    //						GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
    						break;
    					case 'B':
    						//LED0 = 1;
    						LED1 = 0;
    						IN0=0;IN1=1;
    						IN2=0; IN3=1;
    //						delay_ms(100);
    //						GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
    						break;
    					case 'C':
    						//LED0 = 0;
    						LED1 = 0;
    						IN0=1;IN1=0;
    					  IN2=1; IN3=0;
    //						delay_ms(500);
    //						GPIO_ResetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
    						break;
    					case 'D':
    						//LED0 = 0;
    						LED1 = 0;
    						IN0=1;IN1=0;
    					  IN2=0; IN3=1;
    //						delay_ms(100);
    //						GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
    						break;
    					case 'E':
    						//LED0 = 0;
    						LED1 = 0;
    						IN0=0;IN1=1;
    					  IN2=1; IN3=0;
    //						delay_ms(100);
    //						GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
    						break;
    				}
    				
    			}
    			else 
    				delay_us(100);	   
    			
    		};	
    	}
    				else//TX模式
    	{							    
    		LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");	
    		NRF24L01_TX_Mode();
    		while(1)
    		{	
    		adcx=Get_Adc_Average(ADC_Channel_7,20);//获取通道7的转换值,20次取平均
    		adcx1=Get_Adc_Average(ADC_Channel_5,10);//获取通道5的转换值,20次取平均
    		ADCX2=Get_Adc_Average1(ADC_Channel_11,10);//获取通道1的转换值,20次取平均
    		ADCX3=Get_Adc_Average1(ADC_Channel_13,10);//获取通道3的转换值,20次取平均
    			
    		temp=(float)adcx*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
    		temp1=(float)adcx1*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
    	  TEMP2=(float)ADCX2*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
    		TEMP3=(float)ADCX3*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
    			
    		adcx=temp;                            //赋值整数部分给adcx变量,因为adcx为u16整形
    		LCD_ShowxNum(134,50,adcx,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
    		temp-=adcx;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
    		temp*=1000;                           //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
    		
    		adcx1=temp1;                            //赋值整数部分给adcx变量,因为adcx为u16整形
    		LCD_ShowxNum(134,70,adcx1,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
    		temp1-=adcx1;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
    		temp1*=1000; 
    		
    		ADCX2=TEMP2;                            //赋值整数部分给adcx变量,因为adcx为u16整形
    		LCD_ShowxNum(134,90,ADCX2,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
    		TEMP2-=ADCX2;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
    		TEMP2*=1000; 
    		
    		ADCX3=TEMP3;                            //赋值整数部分给adcx变量,因为adcx为u16整形
    		LCD_ShowxNum(134,110,ADCX3,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
    		TEMP3-=ADCX3;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
    		TEMP3*=1000; 
    		
    		LCD_ShowxNum(150,50,temp,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
    		LCD_ShowxNum(150,70,temp1,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
    		LCD_ShowxNum(150,90,TEMP2,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
    		LCD_ShowxNum(150,110,TEMP3,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
    
    		if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
    			{
    				LCD_ShowString(30,170,239,32,16,"Sended DATA:");	
    				LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf); 	
    	   	if(adcx1>=1&&adcx1<=2&&adcx>=1&&adcx<=2)
    		   {
    					LED0=1;
    					tmp_buf[0]='A';
    				  tmp_buf[31] = 0; 
    				}
    				else if(adcx1==0)
    				{
    						LED0=0;
    					tmp_buf[0]='B';
    				  tmp_buf[31] = 0; 
    				}
    				else if(adcx1>2)
    				{
    						LED0=0;
    					tmp_buf[0]='C';
    				  tmp_buf[31] = 0; 
    				}
    				else if(adcx==0)
    				{
    						LED0=0;
    					tmp_buf[0]='D';
    				  tmp_buf[31] = 0;
    				}
    				else if(adcx>2)
    				{
    					LED0=0;
    					tmp_buf[0]='E';
    				  tmp_buf[31] = 0;
    				}
    				else
    				{
    					LED0=1;
    				}
    			}
    
    //			if(key)
    //			{						   
    //				switch(key)
    //				{				 
    //					case WKUP_PRES:	//?????
    //						mode='A';//??????  
    //						LED0=!LED0;
    //						break;
    //					case KEY0_PRES:	//??LED0??
    //						mode='D';//??????  
    //						LED0=!LED0;
    //						break;
    //					case KEY1_PRES:	//??LED1??
    //						mode='C';//??????  						
    //						LED1=!LED1;
    //						break;
    //					case KEY2_PRES:	//????LED0,LED1??
    //						mode='B';//??????  
    //						LED0=!LED0;
    //						LED1=!LED1;
    //						break;
    //				}
    //			}
    				else
    				{										   	
    					LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);//????			   
    					LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed "); 
    				}			
    	}
    	}     
    }
    
    展开全文
  •  脉冲信号发生电路电路实验和设备检测等工程中具有十分广泛的用途,例如某测试系统,需要给被测产品加入可调的间隔脉冲激励信号,以使被测产品能按照要求工作在不同的状态。随着各种数字设备和工业标准持续、...
  • 针对力学实验或生产加工的...全套系统造价低、体积小、便携性好,能同时检测和显示1~3形变信号,测试实验表明该系统检测精度高、实时性好,能满足力学性能实验和生产加工现场的实际功能需求,具有较大的应用价值。
  • 一个完整的采集电路框图详见图2.19,从传感器或信号源到最终的ADC 数据输出,中间需要经过输入范围调整、通道复用等信号调理环节。除ADC 自身之外,需要考虑整个采集通道链路的设计,才能获得的良好采集精度。 ...

    转自周立功《面向AMetal框架与接口的编程(上)》 第二章  ADC 信号调理电路设计

    2.3 必要措施

    一个完整的采集电路框图详见图2.19,从传感器或信号源到最终的ADC 数据输出,中间需要经过输入范围调整、多通道复用等信号调理环节。除ADC 自身之外,需要考虑整个采集通道链路的设计,才能获得的良好采集精度。

    图2.19 典型的采集电路框图

    在设计采集通道时,需要考虑的问题有:

    • 信号的大小和ADC 满量程输入的范围。

    • 信号的极性和ADC 输入的极性。

    • 信号的通道数,是否需要多通道同步采样,还是采用复用输入?

    • 信号是单端输入,还是差分输入?

    >>> 2.3.1 输入范围匹配

    传感器信号往往都很微弱,幅度可能只占ADC 量程的一小部分。使得最大输入信号的幅度与ADC 量程相匹配,对于得到最大的ADC 转换精度是重要的。假定要转换的信号在0V 至2V 之间变化,而VREF 等于3V,则最大信号的ADC 转换数值是2729(2.0V),详见图2.20。这样,就有1366 个未使用的转换数值,即丢失了转换信号的精度。

    图2.20 输入信号幅度与ADC 测量范围

    最好使用一个外部的前级放大器,这个放大器可以把输入信号的范围转换至ADC 模块的范围。例如使用LMV358A 搭建10 倍同相放大器,使得0~300mV输入信号,转换到0~3V。

    同样可以使用外部的放大器搭建叠加电路,完成双极性正负输入,转换成单极性输入;搭建仪表放大器,完成差分输入转换成单端输入。

    >>> 2.3.2 多通道采样设置

    考虑硬件成本时,多个采集通道复用一个ADC 是常用的做法。LPC82x 具有12 路模拟输入管脚,芯片内部已经是多路复用结构,详见图2.21。

    图2.21 LPC82x 模拟输入通道的多路复用等效电路

    使用这种时分复用结构时,非常容易由以下两个问题导致精度下降:

    • 通道的信号源阻抗过大导致建立时间不足,采集到的电压值减小。

    • 通道切换时间过快,多路开关公共端的寄生电容,导致相邻通道上的信号出现串扰。

    虽然信号源阻抗的影响已经设计了缓冲运放彻底解决,但是考虑到成本因素,每个通道都加入一个运放有时无法接受,更合理的配置是幅值精度要求高的信号通道上使用运放,要求不高的通道上信号源直接输入ADC 通道。

    这种混合配置需考虑两种情况:直接输入通道为高速信号并且要求高带宽,或者为低速信号并且要求限制带宽。当直接输入通道为高速信号的参考电路详见图2.22,为了避免通道串扰导致的电压残留,通道上不能并接电容,设计关键在于信号源阻抗与采样速率相匹配。

    图2.22 直接输入通道为高速信号时的多通道采样电路

    要根据采样速率,对直接输入通道信号源阻抗的极限值进行量化。为了方便计算,取多路复用结构中的单个LPC82x 模拟输入通道,等效电路详见图2.23。

    图2.23 LPC82x 单个模拟输入通道的等效电路

    从左至右来看,RS 为外部信号源阻抗,CPIN 是输入引脚电容(基本可忽略),RSWITCH为多路复用开关电阻+采样开关导通电阻,CSAMPLE  为采样电容。采样期间开关闭合,RS、RSWITCH、CSAMPLE  构成单极点RC 网络,它的时间常数可以表示为:

    假设在采样刚开始时,采样电容上电压为0,电容上电压与上升时间的关系可以表示为:

    由此可见,可以根据变化时间确定采样电容上的电压达到输入信号电压值的百分比。假设RS为0,当采样电容上的电压为输入电压值的99.32%时,将有0.68%(剩余百分比)的电压无法准确获得,也就是说最小分辨率为0.68%,这和7.2 位的ADC 的分辨率一致。剩余百分比和ADC 位数的换算公式为log2(1/剩余百分比)log2(1/剩余百分比),其典型换算结果详见表2.4。

    表2.4 建立时间与ADC 精度

    根据这个表的计算,如果不能给ADC 足够的采样时间会导致ADC 的精度降低。假设一个采样速率为1Msps 的12 位ADC,有效的采样时间为750ns。当RS 为0 时,750ns>200ns,采样电容上能获得远高于12 位的精度,采样时间是足够的。如果现在对信号源增加5KΩ内阻,然后可以得到:如果要达到13bits 精度,ADC 至少需要1350ns 的采样时间:

    750ns 的采样时间就已经不够了。这时,可以通过改变软件来降低ADC 的采样率来获得更长的采样时间。而判断是否应该降低采样速率,以LPC82x 最高采样速率1Msps 情况下,所允许的最高源阻抗为参考值。考虑信号建立至1/2LSB,计算过程如下:

    该极限值表示,使用图2.22 的直接输入通道为高速信号的多通道采样电路,最高信号源阻抗不能超过2kΩ,否则需要降低采样速率。

    当直接输入通道为低速信号的参考电路详见图2.24,对源阻抗无要求,但通道两侧的相邻输入通道需要接地。总结多通道采样设置方法详见表2.5,高速信号是指需要进行波形采样的信号,比如采集电网波形。低速信号是指只关注直流分量的信号,比如电源电压、温传感器的输出电压。

    图2.24 直接输入通道为低速信号时的多通道采样电路

    表2.5 多通道采样电路的选择方法

    >>> 2.3.3 电源分配策略

    电源噪声是电路板上重要的噪声源头。为了减少干扰,建议模拟和数字部分独立使用稳压器供电,详见图2.25。

    图2.25 模拟部分与数字部分独立供电

    >>> 2.3.4 PCB 布局布线处理

    数字信号的开关噪声是电路板上另外一大干扰源。避免干扰电路板上的数字电路干扰模拟电路,应该遵循下面的规则:

    • 模拟部分器件与数字部分器件,分区域放置,避免交叉放置,详见图2.26。

    图2.26 模拟器件与数字器件分区域放置

    • 分割地平面,然后使模拟地平面与数字地平面在单点连接,避免通过公共的地回路引入干扰,详见图2.27。

    图2.27 分割地平面在单点连接

    • 模拟走线与数字走线,避免靠近平行走线,如果不能避免,加地线屏蔽模拟走线,详见图2.28。

    图2.28 避免数字走线干扰模拟走线

    2.4 实测验证

    为验证改善方法的有效性,特制作了实际的电路板。测试LPC824 内部ADC 的关键精度指标,并且与成品开发板AM824 的测试数据进行对比。主要测试数据为无噪声分辨率、INL、失调误差、增益误差。

    >>> 2.4.1 无噪声分辨率

    无噪声分辨率定义为ADC 电路测量一个无噪声的稳定直流电压源,统计多次连续采样数据,输出数字代码能够保持不跳动的位数。无噪声电压源使用干电池,理想情况下,输出代码不跳动,只有一个输出代码。

    在原AM824 开发板上,重复测试一块干电池200 次,获得的数据直方图详见图2.29。

    图2.29 AM824 开发板测试直流信号的代码分布

    在使用了本文改善措施的电路板上,重复测试同一块干电池200 次,获得的数据直方图详见图2.30。

    图2.30 标准化电路板测试直流信号的代码分布

    经过对比,发现原数据跳动在6 位数码,转换成分辨率为3 位,就是说如果使用原开发板,最多可以发挥9 位分辨率的精度。但是在新的电路板上,我们看到数据相对集中而且跳动仅仅在3 位,测量的精度更高,可以使用10 位的分辨率精度。

    >>> 2.4.2 积分非线性(INL)

    INL 是表征ADC 精度的一个重要参数。在ADC 的全量程范围内,设置输入电压值从小至到大,依次等间距采集一系列数据点,可以线性拟合出一条最贴近这些数据点的直线。理想情况下,ADC 是线性的,采集数据点应该全部落在该直线上。实际的采样数据点与拟合直线的偏离程度,则表征了ADC 的非线性。在原AM824 开发板上测试的数据详见 表 2.6(Vref=2.5V)。

    表2.6 AM824 开发板的INL 测试数据

    AM824 开发板INL 数据的拟合曲线详见图2.31。

    图2.31 AM824 开发板INL 数据的拟合曲线

    在使用了本文改善措施的电路板上,重复测试获得的测试数据详见表2.7(Vref=3V)。

    表2.7 标准化电路板的INL 测试数据

    标准化电路板INL 数据的拟合曲线详见图2.32。

    图2.32 标准化电路板INL 数据的拟合曲线

    通过对比 表2.6 与表2.7 发现,在电路板上加入这些措施后,INL 得到了改善,从原来的5.3 个 LSB 改善为后来的3.6 个LSB。

    >>> 2.4.3 失调与增益误差

    1.  失调误差

    失调误差定义为第一次实际的转换至第一次理想的转换之间的偏差。理想情况下,第一次转换应该发生在输入信号为0.5 LSB 时。失调误差以EO 标注,测试过程如下:

    调节可调电阻,产生连续可变的mV 级电压值输入到标准化电路板,观察ADC 输出代码变为1 的电压值为:2.44mV。实测电路板上基准电压为:3047.56mV,算得1LSB =3047.56/(4096*2)=0.74mV。

    2.  增益误差

    增益误差定义为最后一次实际转换与最后一次理想转换之间的偏差。理想情况下,当模拟输入电压等于VREF-0.5LSB 时产生从0xFFE 至0xFFF 的变换。增益误差以EG 标注,测试过程为:调节可调电阻,产生Vref 附近连续可变的电压值输入到标准化电路板,观察ADC输出代码变为0xFFF 的电压值为:3046.35mV。

    2.5 应用说明

    总结改善后的标准化电路板和AM824 开发板的精度指标测试值详见表2.8。

    表2.8 标准化电路板与AM824 开发板的ADC 测试精度

    表中数据表明,经过上面提及到的方法改进后,除增加ADC 驱动运放导致失调电压有略微增加之外,所有参数指标都可以有进一步的改善。在AM824 开发板中无噪声分辨率比较低,根据公式log2(1/跳动LSB)log2(1/跳动LSB),在9 位左右。INL 根据公式log2(1/误差LSB)log2(1/误差LSB)也是9 位。

    在改进设计后的标准化电路板,片上ADC 可以发挥更好的性能指标,其无噪声分辨率与INL 性能都提升到了10 位,适合于精度等级为0.5%的应用。

    在实际应用中,如果用户需要进行修改滤波器带宽或输入范围等参数,可以在以下几方面进行,只需要做一些参数上或通道电路上的调整,详见表2.9。

    表2.9 用户参数选择

     

     

     

     

    展开全文
  • 单端反激电路由输入滤波电路、脉宽调制电路、功率传递电路(由开关管和变压器组成)、输出整流滤波电路、误差检测电路(由芯片TL431及周围元件组成)及信号传递电路(由隔离光耦及电阻组成)等组成。本电源设计
  • 多路串联电池检测

    千次阅读 2018-01-09 11:24:22
    最近接了一个电池检测的科技项目,百度了一下,...我们需要解决的问题是什么,单节分立的电池检测几乎没有任何难度,节分立电池的检测也很成熟,但是串联节电池的检测难度会稍微大一点,也就是共模电压串联后太高

    最近接了一个电池检测的科技项目,百度了一下,发现相关的文章和帖子比较少,索性写一点方案,希望能帮助有类似需求的同学。

    关于电池检测,网上有好多文章和论文,个人感觉都比较水,互相抄袭严重,有的图竟然在各种论文中互相抄错,希望学术圈戒骄戒躁吧!

    我们需要解决的问题是什么,单节分立的电池检测几乎没有任何难度,多节分立电池的检测也很成熟,但是串联多节电池的检测难度会稍微大一点,也就是共模电压串联后太高,如果考虑检测装置的体积,确实有一些难度。

     

    目前的电动汽车和锂电池行业做的很好,相关的产品应该也很多,先看下几种电池检测方式吧:

    共模测量法

    这是从别人抄来的,哈哈。

    共模测量是相对同一参考点,用精密电阻等比例衰减测量各点电压,然后依次相减得到各节电池电压。共模电压在每一导体和所规定的参照点之间出现电压的平均值,或者说同时加在电压表两测量端和规定公共端之间的那部分输入电压。

    该方法电路比较简单,但是测量精度也等比例降低,经常会造成累计误差,所以不能满足要求。因此这种方法只适合串联电池数量较少或者对测量精度要求不高的场合。消耗电池电能,且需要出厂校准调试,批量生产很浪费人力成本。

    如图所示为电阻分压方案。


    继电器切换

    转换速度太慢,路数少,采样速度要求不高的情况下可以考虑,不做赘述。

    MOS阵列采集

    这也是从别人抄来的,抄来的图画的不好,有错的地方,基本原理凑合看看即可。

    在继电器切换采集的基础上,使用光MOS组成采集阵列,使用译码器选通某路测量。大致如下图所示。


     

    MOS体积大,价格也比较贵,且此方案也需要分组隔离,优势也不大。

     

    MUX+ADC+分组隔离方案

    使用高速多路复用器,分组采集,在ADC侧进行数字隔离,前端的实现方式如下图所示:


    TIMUX507类似的器件,转换速度较快,可以满足要求,共模电压最高可达36V,可以满足8路(即55路情况中的8路)差模采集。如上图的电路,至少要隔离出7组,且MUX507供电电源需要大于8*3V=24V,无论是整体电路还是隔离方式占用板面都比较大。且类似芯片需要从电池取电,或者使用系统电源隔离出24V以上的供电电压。


    模拟前端隔离方案

    模拟前端可以考虑使用隔离运放,但是需要注意隔离运放的输入电压一般都比较小,印象中AVAGO的隔离运放只有±200mV的输入范围,需要用放大器、电阻处理,多路设计也有些麻烦。如果大神们喜欢用分立器件增加点设计乐趣,再进行温度调理等方面的设计,感觉还是可以试一下的。

     

    专用芯片方案

    还是提出一个比较简单容易实现的方案吧:

    本来想用MUX+运放+ADC+隔离自己搭一套电路的,后来在凌特的官网上发现了好东西,看出来凌特(现在应该叫ADI了)在电源方面做得东西还是比较有优势的,在此替他们做做广告,哈哈哈!

    看了凌特的器件手册,写的也不错,基本上全套方案都帮忙想好了,科技项目暂不考虑成本,做个指标不错的先试试,直接选了同类电池检测芯片中比较高端的一款LTC6804-1。大家要是成本需求,如果板面要求不太紧张的话,可以考虑用MUX自己搭,或者使用凌特的低成本同类器件(有低采样率的)。

    LTC6804随口问了技术支持,大概10刀一片,砍砍价还是可以接受。

    其检测前端如下图所示:


    使用分组隔离,可以完美解决串联电池共模电压问题,SPI的菊花链通过变压器传输,通过一片LTC6820转换为数字信号传输给CPU,基本就没啥其它的事了,这项目难度瞬间变低了,提不起性质了……

     

    小伙伴们一定要注意,虽然凌特的片子很完美,还要注意下隐藏的小问题,我想了几条:多片串联菊花链要考虑下SPI的速度够不够;时刻注意单片的共模电压千万不能超;对于燃料电池,要注意,单片电压非常低,呵呵,也就是说可能12片电池取电都无法让片子工作;注意不能检测负压!

     

    关于电池取电,有的项目不一定适用,所以需要隔离出来多路电源为芯片供电,隔离出来的电源电压要高于每组检测电池的总最大电压,凌特也有个现成的电路:


    自己用变压器搭也挺简单的,不放心的直接抄就行啦!

    剩下的传输方面的问题就是大家都会的数字电路了,只采集和简单上传就看需求喽,汽车电子常用的CAN应该用的比较多,出点彩,加个液晶,以太网,RS485就随便玩啦。


    顺便提一下用这种方法能做出来的极限指标:

    ADC最高分辨率:16位(这个指标比较耍流氓,好多仪器竟然这么写,明显是骗客户的,哈哈,能做到和ADC一样的精度的几乎不可能,可是都这么写也没办法啦)

    每组最高共模电压:75V(这个指标大家可以想想哈,对于自己搭的电源,最高只能达到电源最高电压)

    采样率:理论上能达到290us采集12路,25us采集一路,采样率达到40kS/s/ch,注意单位呀,哈哈,很多写指标的人都耍了小心眼,一台设备采集8路,采样率好多都写的是总采样率,都是套路!

    尺寸:估计能做到150mm*150mm。

     

    最后大家可以看下NI的模块指标,满满的套路呀,哈哈哈,

    大家可以考虑下:

    电池检测能用吗?怎么用?装置内通道的隔离方式大致如何?


    展开全文
  •  脉冲信号发生电路电路实验和设备检测等工程中具有十分广泛的用途,例如某测试系统,需要给被测产品加入可调的间隔脉冲激励信号,以使被测产品能按照要求工作在不同的状态。随着各种数字设备和工业标准持续、...
  • 引言  随着相控阵天线在雷达中的广泛使用,天线电源的故障...信号调理电路对输入的35路电源检测信号进行滤波、分压及阻抗匹配,然后经过多路复用器(MUX)选择进入模数变换器(A/D),变换成数字量,单片机读入该数字量,
  • 多路数据采集器的FPGA实现

    千次阅读 2020-10-18 16:15:37
    “数据采集”是指将温度、压力、流量、位移等模拟量采集转换成数字量后,再...同时利用CPLD 强大的数字处理功能和高密集成的特点,降低了硬件的成本,简化了电路设计,具有很好的经济效益和社会效益。有此看出,数据...

          “数据采集”是指将温度、压力、流量、位移等模拟量采集转换成数字量后,再由计算机进行存储、处理、显示或打印的过程,相应的系统称为数据采集系统。随着科技进步,人们对数据采集的要求也越来越高,比如采样频率,分辨率等等。基于单片机的数据采集系统数据处理能力比较低,已经无法达到某些要求。科技的不断创新及半导体工业的发展使得我们将可编程逻辑器件的技术应用到数据采集系统的研究上。同时利用CPLD 强大的数字处理功能和高密集成的特点,降低了硬件的成本,简化了电路设计,具有很好的经济效益和社会效益。有此看出,数据采集系统日趋成熟,应用越来越广泛,发展前景是相当广阔的[1]

          在计算机广泛应用的今天,数据采集的重要性是十分显著的。它是计算机与外部物理世界连接的桥梁。在工业,工程,生产车间等部门,尤其是在对信息实时性能要求较高或者恶劣的数据采集环境中更突出其应用的必要性。这就要求数据采集系统必须具备更高的采样频率,更高的分辨率,来提供更多的原始数据。以前的数据采集系统一般都是以单片机为核心的,随着数据采集要求的不断提高,单片机为核心的数据采集系统已经不能满足要求了。科技进一步发展,就出现了现在的高速数据采集系统。随着各种先进武器系统陆续装备部队 ,各种问题也随之出现 ,尤其是在各种武器装备信号检测中都涉及到数据的采集问题,本课题要求对某武器系统的多个弹上数据,如压力、温度等进行采集并显示,要求采样频率1MHz,分辨率10位,显示到小数点后一位[2]。

           综合上述,本文设计了一种基于CPLD控制高速AD转换器的数据采集系统。这个系统能大幅度提高数据采集的速度和精度,满足高速数据采集的要求。

     

        现代数据采集系统具有如下主要特点:

        (1)现代采集系统一般都由计算机控制,使得数据采集的质量和效率等大为提高,也节省了硬件投资。

        (2)软件在数据采集系统中的作用越来越大,这增加了系统设计的灵活性。

        (3)数据采集与数据处理相互结合的日益紧密,形成数据采集与处理系统,可实现从数据采集、处理到控制的全部工作。

        (4)数据采集过程一般都具有“实时”特性,实时的标准是能满足实际需要。实时性是指基于计算机的工业数据采集系统应具有的能够在限定的时间内对外来事件做出反应的特性。工业控制计算机及监控管理软件具有时间驱动能力和事件驱动能力,即在按一定的时间周期内对所有事件进行巡检扫描的同时,可以随时响应事件的中断请求。实时性要求计算机有多任务的处理能力,以便将测控任务分解为若干个并行执行的多个任务,加速程序执行速度。将变化并不显著、即使不及时做出反应也不至于造成影响或损害的事件,作为顺序执行的任务,按照一定的巡检周期有规律的执行,而把保持时间很短且需要计算机及时做出反应的事件,作为中断请求源或事件触发信号,为其专门编写处理程序,保证在该事件触发时计算机可以立即响应[3]。

        (5)随着电子技术的发展,电路集成度的提高,数据采集系统的体积越来越小,可靠性越来越高,甚至出现了单片数据采集系统。

        (6)总线在数据采集系统中有着广泛的应用,总线技术它对数据采集系统结构的发展起着重要作用。

        (7)数据采集系统的适应能力。无论是大规模的生产过程采集系统,还是普通的多路信号采集系统,都可以通过选取适当的智能模块设备来构成相应规模的系统,这样的系统实现易于扩展和维护。在计算机、数据采集和控制设备正常工作的情况下,如果电源供应正常、通信线路畅通以及设备状况良好时,系统可稳定可靠的长期运行。另外,采集系统和上位机之间利用数字信号传输代替模拟信号传输,可克服电磁干扰、差模和共模信号干扰等,以适应在恶劣的环境下工作[4]。

         传统的数据采集系统,一般由信号输入部分、信号调理部分、数据采集部分、数据传输部分数据显示部分组成。从传感器过来的模拟量通过调理电路后再送入 AD 转换成数字量,采集到的数据再通过传输通道到单片机进行数据处理,最后显示出采样结果。

        在这种系统中,单片机作为主控芯片来完成对外围芯片的控制,数据采集的 AD 转换是由单片机通过软件控制的,这样势必会引起系统的频繁中断,减弱了系统的数据运算能力,使得数据采集的速度降低,单片机本身的缺点制约了整个系统的性能。

    为了提高数据采集系统的性能,本文设计了基于 CPLD 的高速数据采集系统,与传统采集系统相比,采用高速的 CPLD 器件作为主控芯片,可轻易实现高速、低成本、易扩展、高可靠性的数据采集,代表了现代数据采集系统的发展趋势。

                           图2.1 系统结构框图

        其中信号输入部分是由传感器传来的各种模拟信号。信号调理部分由放大电路、滤波器电路构成。其主要作用是对输入信号进行放大、滤波使其电压在AD的采样电压范围之内。AD采样部分是将输入的模拟信号转换成数字信号。其中AD的采样电压范围和位数决定了采样精度的大小。为了提高系统采集数据的频率,我们选择高速AD,这样采集速度就可以大大提高。数据采集与传输控制电路的开发工作主要集中在 CPLD 上,在此系统中,CPLD 用于控制AD 转换和对 AD 转换之后的数据进行显示[9]

    2.3.1  信号调理部分

        在数据采集系统中,量化误差的引入是不可避免的。量化误差成了评价数据采集系统的一个重要指标。一般来说AD转换器的位数越长则量化噪声越小,精度越高。可是在AD芯片的设计过程中,要想把数据转换分辨率提高一位,则AD转换器中的比较器数量必须增加一倍,其增加的成本可想而知。但是通过对信号调理电路的合理设计,可以减小引入的量化误差,这可以使整个数据采集系统的性能得到进一步的提高[10]

    本系统中调理电路由滤波器电路构成。其主要作用是除去信号中的各种干扰成分,使输入信号的幅值尽可能接近 AD 的输入范围 Vmax,获得尽可能大的信噪比,提高数据采集的精度

    2.3.2  数据采样控制部分

    当前的数据采集系统已有很多,有很多基于单片机的成熟的数据采集卡,由于单片机的频率难以做的太高,这使得其构成的系统的采集数据的频率难以提高。所以我们选择CPLD 作为处理 CPU,此外我们选择高速 AD、高速 RAM 来采集数据,这样采集速度就可以大大提高。数据采集电路的实现也有两种方案。方案 1 是用单片机完成数据采集及控制。方案 2 是用可编程逻辑器件 CPLD 来实现

    单片机的速度相对较慢,而当前武器设备电子系统对频率的要求越来越高,如在一些实时的音频,视频处理中频率可达到上百兆,这样的频率对于单片机来说是无能为力的。如果采用单片机来控制 AD 芯片和数据显示,将显著降低整个系统的工作速度。随着微电子技术的发展,CPLD 器件的容量变得越来越大,速度变得越来越快,高端产品的速度已经达到几百兆[11]。采用 CPLD 器件来完成高速 AD 芯片的控制和数据显示,使系统的速度成倍提高。传统的系统除了单片机外还有大量的中小规模集成电路,在高速,强电磁干扰等恶劣条件下,芯片的数量越多,受到干扰的可能性就越大,造成单片机频繁出现程序跑飞,系统复位。采用 CPLD器件可减少系统受干扰的几率,显著提高系统的可靠性。该系统要求进行高速的数据采集,用普通单片机难以实现。所以,我们使用方案 2 实现数据采集电路

    系统电路设计

    本章主要介绍该系统的电路设计。详细论述了系统各个模块设计方案,包括相关芯片的选择、电路连接、接口设计、电源设计等。

    系统框图如图3.1所示:

    图3.1 系统框图

    AD 转换就是模数转换,顾名思义,就是把模拟信号转换成数字信号。AD 进行数据采集有两个主要过程:采样和量化。采样是指每隔 T 秒所记录的 x(t)的幅值。设 x(t)是模拟信号,将采集到的幅值用 x(kt)表示,其中 k 表示数据序列中的采样位置,k=0,1,…N-1,(N 是数据序列总的采样数)。T 称为采样间隔,采样频率为 1/T(Hz)。

    AD 采样时必须满足采样定理。香农采样定理给出了低通型带限信号的最低采样频率,即采样频率 fs 必须大于被测信号最高频率的两倍,即 fs≥2fmax。fs/2 称为纳奎斯特频率(Nyquist frequency)[12]。

    采样定理的出发点是从采样数据中能够完全恢复原始信号,可是在实际运用中,将连续的模拟信号转换成离散的数字信号势必会造成一定的失真和误差。特别是当信号中包含频率高于奈奎斯特频率的成分,信号将在直流和恩奎斯特频率之间畸变使得采集的信号失真。为了避免这种现象的发生,采样频率一般取信号最高频率的3-5 倍,有时为了较好地还原波形,甚至会取信号最高频率的 10 倍[13]。

    量化就是用有限长度的二进制数来逼近离散的模拟信号。由于量化的结果是把尾数按四舍五入处理,对于有 m 位、输入电压范围是 Vmax的 A/D 转换器,有 0 至 2m-1 共 2m 个等级,每个等级的增量为 δ=Vmax/2m-1,那么,量化的最大误差就是 emax(nT)= ±δ/2。

    AD 转换器的位数越长则量化噪声越小,精度越高。在 AD 的位数确定的情况下,应该使输入信号的幅值尽可能接近 AD 的输入范围 Vmax,获得尽可能大的信噪比,提高数据采集的精度。AD 的选择,首先看精度和速度,然后看输出是多少路,输出是怎样的,比如 SPI 或者是并行的,差分或者单端输入,输入范围是多少,这些都是选 择AD 转换器时需要考虑的[14]。

        AD976为高速、低功耗、16位模数转换器(ADC),采用5 V单电源供电AD976的吞吐速率为100 ksps。器件均内置一个逐次逼近型开关电容ADC、一个2.5 V内部基准电压源和一个高速并行接口。最大功耗均为100 mW。该ADC经过工厂校准,所有线性误差均被降至最小。模拟满量程输入为±10 V的标准工业范围。信噪比(SNR)和总谐波失真(THD)等交流参数,以及失调、增益和线性度等一般参数均经过全面测试。AD976采用ADI公司专有的BiCMOS工艺制造,兼有高性能双极性器件和CMOS晶体管的优点。提供超小型28引脚DIPSSOPSOIC三种封装[15]

    3.1.1  封装及管脚功能

        AD976/AD976A的封装如下图所示,为窄28脚DIP形式,两列管脚间距为0.3英寸。

     

     

     

     

     

     

     

     

     

     

     

     

    主要管脚功能如图3.2所示:

    图3.2   AD976管脚图

    (1)电源:2,5,14,27,28脚,分别为数字或模拟地以及电源。模拟地于数字地及模拟5V和数组5V之间,最好通过小磁珠再连接到一起。

    (2)模拟接口:1脚,模拟信号输入端,与模拟信号之间须接一200欧电阻

                3脚,参考电压输入端,可外部输入,也可利用内部2.5V电压基准。无论以上那种情况,均须将该脚通过一2.2μF电容接到AGND1。

                4脚,参考缓冲输入,须通过一2.2μF电容接到AGND2.

    (3)数据接口:6~13和15~22分别对应16位数据的D15到D0

    (4)控制接口:24脚,R/C,为读取数据/模数转换选择控制信号;

                25脚,CS,为片选端;

                26脚,BUSY,用于指示转换是否完成;

                23脚,BYTE,为转换结果输出高低字节选择控制端。

    3.1.2  工作过程及转换结果

        AD976/AD976A要开始一次转换,首先要将CS信号置低,之后R/C信号的下降沿使得内部采样/保持单元进入保持状态并开始一次转换,BUSY信号在开始一次转换时变为低,且在转换结束前保持为低。BUSY信号为高时标明转换已经结束,BUSY的上升沿可以用来所存输出数据。此时,将R/C置高,即可把转换结果输出到数据总线上,数据有效可用。BYTE为低时,高8位从D15~D8输出,低8位从D7~D0输出,为高时相反;高8位从D7~D0输出,低8位从D15~D8输出。时序如图3.3所示:

    图3.3  A/D976转化器时序图

     

        其中Module Name就是输入的“one2two”,下面的列表框用于对端口的定义。“Port Name”表示端口名称,“Direction”表示端口方向(可以选择为input、output或inout),MSB表示信号的最高位,LSB表示信号的最低位,对于单位信号的MSB和LSB不用填写。定义了模块端口后,单击“Next”进入下一步,点击“Finish”按键完成创建。这样,ISE会自动创建一个Verilog模块的例子,并且在源代码编辑区内打开。简单的注释、模块和端口定义已经自动生成,所剩余的工作就是在模块中实现代码。填入的代码如下:

    module one2two(x_in, flag, y1_out, y2_out);

    input [7:0] x_in;

    input flag;

    output [7:0] y1_out;

    output [7:0] y2_out;

    //以下为手工添加的代码

    assign y1_out = flag ? x_in : 8'b0000_0000;

    assign y2_out = flag ? 8'b0000_0000:x_in;

    Endmodule

        鉴于篇幅,不可能对该软件的其他功能进行详细介绍,我们应该在实际工作中学习并熟练掌握。

    4.3  AD 控制模块

    定义端口:

    CS:片选(低电平有效);

    R/C:为读取数据/模数转换选择控制信号;

    BUSY:高电平, 表示本次A /D转换完成, 控制电路可将数据取走。

    数据采集时序可分成4个状态: S0、S1、S2、S3, 每个状态的动作如下:

        S0: CS=0、RC=0、BUSY=0(由控制电路发出信号,要求A/D开始进行A/D转换)。

        S1: CS=0、RC=0、BUSY = 1 (A/D进行转换动作,转换完后将BUSY信号从低电平降至高电平)。

        S2: CS=0、RC=1、BUSY=1(由控制电路发出读信号)。

        S3: CS=0、RC=1、BUSY=1(数据被读取到DB0~DB15上)。

        下面给出部分主要源程序:

    PROCESS ( CP, RST)

    BEGIN

       IF RST = '1';Then

         nCS < = '0';   //片选(置低)

         nRC< = '0';    //写信号(置低)

         nBUSY < = '0';   //读信号(置低)

         EC < = '0';

         State < = S0;

       Else IF CP Event And CP = '1 'Then

        CASE State IS

         WHEN S0=>

           nCS < = '0';

           nRC < = '0';

           nBUSY < = '1';

           EC < = '0';

           State < = S1;   //开始AD转换

         WHEN S1 = >

          nCS < = '0';

          nRC < = '1';

          nBUSY< = '1';

          EC < = '0';

          If nIN = '0'Then   //转换结束

           State < = S2;

          End if;

          WHEN S2=>

            nCS < = '0';

            nRC< = '1';

            nBUSY< = '1';

            EC < = '1';

            State < = S3;    //传送数据

          WHEN S3 = >

            nCS < = '0';

            nRC < = '1';

            nBUSY < = '1';

            EC < = '0';

            State < = S0;  

           WHEN OTHERS= >

            State < = S0;

           END CASE;

         ENd If;

    END PROCESS;

    AD转换流程图如图4.7所示:

                            图4.7 AD转换流程图

    4.4  数码管显示程序

        下面的VHDL 程序片段描述了七段扫描驱动显示电路, 包括扫描信号产生电路和十六进制码与七段显示码转换电路。

    SignalQ: STD_LOGIC_VECTOR(15 DOW NTO 0) ;

    PROCESS (CP)  //CP为系统时钟

    Beg in

    IF CP Event AND CP= '1'then

    Q<=Q+1;  //加法计数器

    END IF;

    END PROCESS;

    ST<=Q(15 DOWNTO 14);

    SEL<= "110" WHEN ST= 0 ELSE

    "101" WHEN ST= 1 ELSE

    "011" WHEN ST= 2 ELSE

    "111";

    NUM <= Value(3 DOWNTO 0) WHEN ST=0 ELSE

       Value( 7 DOWNTO 4) WHEN ST = 1 ELSE

       Value( 11 DOWNTO 8);

    SEG < = " 0111111" WHEN NUM = 0 ELSE   //十六进制转换成

    "0000110" WHEN NUM =1 ELSE           //七段码

    "1011011" WHEN NUM = 2 ELSE

    "1011011" WHEN NUM = 3 ELSE

    "1011011" WHEN NUM = 4 ELSE

    "1011011" WHEN NUM = 5 ELSE

    "1011011" WHEN NUM = 6 ELSE

    "1011011" WHEN NUM = 7 ELSE

    "1011011" WHEN NUM = 8 ELSE

    "1011011" WHEN NUM = 9 ELSE

    "1011011" WHEN NUM = 10 ELSE

    "1011011" WHEN NUM = 11 ELSE

    "1011011" WHEN NUM = 12 ELSE

    "1011011" WHEN NUM = 13 ELSE

    "1011011" WHEN NUM = 14 ELSE

    "1110001" WHEN NUM = 15 ELSE

    "0000000";

        用VHDL和CPLD设计数字系统具有传统方法无可比拟的优越性, 最大的优点是调试极其方便。基于自顶向下的数据流描述方法, 可以使设计者不必关心具体的电路细节, 而是由综合系统来具体实现, 这样可以使设计者主要关心系统级的算法设计, 从而能有效地提高系统的综合性能。它减少了设计成本, 缩短了设计周期, 已成为大规模集成电路设计最有效的手段之一。

    展开全文
  • 多路数据传送过程中,能够根据需要将其中任意一路选出来的电路,叫做数据选择器,也称多路选择器或多路开关。在选择变量控制下,从多路数据输入中某一路数据送至输出端。对于一个具有 2^n 个输入和 1 个输出的多路...
  • 0 引言  传统感应式电能表用其结构和原理上的制约,通常存在着测量范围小,稳定性差,精度低等缺点而不能适应社会发展的...该系统通过电流互感器检测电流信号,而通过分压电阻采集电压信号,然后将其送入单相功率/
  • 通过带阻滤波电路,改善滤波器周围信号频率特性,实现多路反馈。依据复位电路为系统提供复位脉冲,使电路恢复到初始状态,为下一次信号监测做好准备。设计软件流程,依据小波变换原理,对系统进行规避噪声处理,由此...
  • 用51单片机p1口产生的8脉冲同步控制信号,用于电路的控制和协调.
  • 介绍了一种基于C8051F020单片机的多路压力测量仪。该测量仪选用电阻应变式压力传感器采集压力信号,并经放大电路处理后送入C8051F020单片机,再由C8051F020单片机内部的A/D转换器将采集到的压力信号进行模数转化,...
  • 同时,实施绝缘在线监测,可以使计划维修转变为状态维修,减少不必要的停运检测,节省大量经费,并使设备发挥更大的经济效益。  电力设备在线监测系统可分为集中式和分布式两大类。前者将被测信号经屏蔽电缆送到...
  • AN234是彩色电视机色皮信号处理.为16脚单列直插式塑料封装.其功能AN235相同,只是内部的色度放大器增益AN235高6dB在松下TC261H型彩电上的正常工作电压典型检测数据如表所示,用DT890型数字式三表(DC挡)测得...
  • HEF4053是一种三组2选1模拟电子.../[NS02],以及长虹29SD83型世纪缘超平智能化写人式数字大屏幕彩电TV/AI数字多路开关电路[DS01]/[DS03]、AV数字多路开关[DS02]上的正常工作电压典型检测数据分别如表1、表2所列,用50
  • 采用多路高频正弦信号作为载波加载至与各自由度对应的控制/检测电极上,通过公共电极输出反映转子沿各自由度位移变化的调幅信号,然后经过交流放大、相敏解调、低通滤波后得到各自由度位移检测信号。文中介绍了微电...
  • 摘要:提出一种基于FPGA技术的多路模拟量、数字量采集与处理系统的设计方案,分析整个系统的结构,并讨论FPGA内部硬件资源的划分和软件的设计方案等。本设计方案外部电路结构简单可靠,特别适用于多路检测系统中,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,784
精华内容 6,713
关键字:

多路信号检测电路