精华内容
下载资源
问答
  • 这是用protel画的原理图 内涵盖了同相放大电路;反相放大电路,跟随,差动放大(减法电路仪表放大前级电路;同相加法器;计分;微分
  • 1a示出简化的放大器电路。该电路的一般原理是电容器C和电阻器R3对输入信号进行缓冲和交流耦合。第二级由两个差动放大器AD组成。每个差动放大器放大差动输入信号的一半。求和运算可以得到求VOUT的如下公式: 在...
  • 经典的三运放或二运放仪表放大器电路都是放大内含高共模噪声的小振幅差动信号的标准方法。在有些应用场合,信号源随高串行输出阻抗而波动,因而需要使用高输入阻抗放大器。本设计实例提出一种使用简化放大器电路的...
  • 仪表器的选型很多,我们这里介绍一种用途非常广泛的仪表放大器,其实就是典型的差动放大器。它只需三个廉价的普通运算放大器和几只电阻器,即可构成性能优越的仪表用放大器。广泛应用于工业自动控制、仪器仪表、电气...
  •  1所示电路提供了一种负电源电流检测的原理框图,利用MAX4460或MAX4208仪表放大器,配合一些分立元件实现。齐纳二极管D1在保证仪表放大器具有足够的供电电压的前提下为其提供过压保护。被监测电流通过检流电阻...
  • 1a示出简化的放大器电路。该电路的一般原理是电容器C和电阻器R3对输入信号进行缓冲和交流耦合。第二级由两个差动放大器AD组成。每个差动放大器放大差动输入信号的一半。求和运算可以得到求VOUT的如下公式: 在1a...
  • 很多设计都需要的压控电流源,特别是那些存在可变负载的情况。通常是使用几个运算放大器和若干无源元件来构成电路,但是由于元器件的非理想特性,如有限的... 采用两个仪表放大器和两个晶体管,您可以构建一个精度达
  • 1a示出简化的放大器电路。该电路的一般原理是电容器C和电阻器R3对输入信号进行缓冲和交流耦合。第二级由两个差动放大器AD组成。每个差动放大器放大差动输入信号的一半。求和运算可以得到求VOUT的如下公式: 在...
  • STK6303是三洋公司的一种大功率厚膜集成电路,一块电路分成A、B两面,在国内尚很鲜见,至今尚未查到其内部电路原理图。估计是专用于某些进口大功率变频调速用电机伺服。通过反复试验,发现用其B面做后级功放的电流...
  • 很多设计都需要精确的压控电流源,特别是那些存在可变负载的情况。通常是使用几个运算放大器和若干无源元件来构成电路,但是由于元器件的非理想特性,如有限的... 采用两个仪表放大器和两个晶体管,您可以构建一个精
  • 555作逆变器电路一:简易高频逆变器电路 555定时器成本低,性能可靠,只需要外接几个电阻、电容,就可以实现多谐振荡器、单稳态触发器及施密特触发器等脉冲产生与变换电路。它也常作为定时器广泛应用于仪器仪表、...
  • 仪表放大器加上反馈回路,便可获得一个二分压电路,而且具有缓冲输出的好处(1)。这一电路的工作原理很简单。该仪表放大器具有单位增益的特点,所以其输入端上的电压出现在VREF和VOUT之间;VOUT-VREF=VIN(+)-...
  • 仿真电路图带详细的注释,电路的功能:因为输人电阻高,所以信号源电阻产生的误差可忽略不计,象模拟记录仪等要进行大幅度零点移动的仪表可使用本电路。例如,要记录土10V电压的变动情况,可把信号从A输入,由外部基准...
  • 电路组成 XMZ-101H型数字温度显示仪由冷端补偿、换、滤波、前置放大、A/D转如1 所示,中只画符合电路、EPROM... 1 XMZ-101H型数字温度显示仪表整机电路原理  欢迎转载,信息维库电子市场网(www.dzsc.com) :
  • 仪表的冷端温度补偿、滤波、前置放大电路采用1a所示电路。经过预处理后的热电势信号送A/D7 107进行模/数转换,将转换后的结果数字量作为地址信号送到EPROM线性化里,我出与该热电势对应的温度值后,送到CD4511...
  • 电路组成 XMZ-101H型数字温度显示仪由冷端补偿、换、滤波、前置放大、A/D转如1 所示,中只画... 1 XMZ-101H型数字温度显示仪表整机电路原理  欢迎转载,信息来源维库电子市场网(www.dzsc.com) 来源:ks99
  • 仪表的冷端温度补偿、滤波、前置放大电路采用1a所示电路。经过预处理后的热电势信号送A/D7 107进行模/数转换,将转换后的结果数字量作为地址信号送到EPROM线性化里,我出与该热电势对应的温度值后,送到CD4511...
  • 超强PCB布线设计经验谈附原理图(六)

    千次阅读 2017-11-01 10:40:22
    1 负载单元传感器输出端的信号由双运放仪表放大器放大, 然后由12位A/D转换器MCP3201滤波和数字化。每次转换的结果显示在LCD显示屏上。 该电路可精确测量传感器上施加的重量,然后将结果显示在LCD显示屏上。...

    对于12位传感系统的布线,应用的电路是一负载单元电路。

    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图1 负载单元传感器输出端的信号由双运放仪表放大器放大,
    然后由12位A/D转换器MCP3201滤波和数字化。每次转换的结果显示在LCD显示屏上。

    该电路可精确测量传感器上施加的重量,然后将结果显示在LCD显示屏上。系统电路原理图如图1所示。采用的负载单元是Omega公司的LCL-816G。LCL-816G传感器模型是由四个电阻元件组成的桥,需电压激励。将5V激励电压加在传感器高端,施加900g最大激励时,满刻度输出摆幅为±10mV差分信号。该小差分信号被双运放仪表放大器放大。   

    根据电路精度要求,选择一个12位A/D转换器。当转换器将输入端的电压进行数字化后,数字码经转换器SPI端口发送到单片机。然后,单片机用查找表将来自A/D转换器的数字信号转换为重量。此时如需要的话,线性化和标定工作可由控制器代码实现。完成这一步后,结果送到LCD显示器。最后一步是为控制器写固件。电路设计好之后,即可设计印刷电路板和布线了。


      查看这个完整的电路原理图时,若使用自动布线工具,经常要返回来对布线做很大的修改。如果自动布线工具可以实现布线限制,可能还有成功的可能性。如果自动布线工具没有限制选项的话,最好不要使用自动布线工具。

    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图2 在精度高于12位的电路中,PCB上有源元件的放置很重要。要将高频元件 和数字器件尽量靠近接插件放置。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图3 图1电路的顶层布线和底层布线,此布线中没有地平面和电源平面。注意:为降低电源线的感抗,电源线要比信号线宽很多。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图4 在没有地平面或电源平面的PCB(PCB布线如图3所示)中,对A/D转换器输出4096次采样的柱状图。电路的噪声码宽度为15个码。

       

    布线的一般准则

      器件布局

      既然是采用手工布线,那么第一个步骤是在板上放置器件。将噪声敏感器件和产生噪声器件分开放置。完成这个任务有两个准则:

      1. 将电路中器件分成两大类:高速(>40MHz)器件和低速器件。如果可能的话,将高速器件尽量靠近板的接插件和电源放置。

      2. 将上述大类再分成三个子类:纯数字、纯模拟和混合信号。将数字器件尽量靠近板的接插件和电源放置。

      电路板的布线策略要符合图2所示的器件布局图。注意图2a中高速器件、低速器件与电路板的接插件和电源之间的关系。在图2b中,数字器件最靠近电路板的接插件和电源,与其它数字和模拟电路分离开了。纯模拟器件距离数字器件最远,以确保开关噪声不会耦合到模拟信号路径中。A/D转换器的布线策略在本刊2004年1月中有详细论述。

      地和电源策略

      确定了器件的大体位置后,就可以定义地平面和电源平面了。实现这些平面是需要一些策略技巧的。

      在PCB中不使用地平面是很危险的,尤其是在模拟和混合信号设计中。其一,因为模拟信号是以地为基准的,地噪声问题比电源噪声问题更难应对。例如,在图1所示电路中,A/D转换器(MCP3201)的反相输入引脚是接地的;二,地平面还对噪声有屏蔽作用。采用地平面可以很容易解决这些问题,但是,如果没有地平面,要克服这些问题几乎是不可能的。

      这里,假设不需要地平面。图1所示的电路无地平面布线,如图3所示。
    “不需要地平面”的理论还行得通吗?这可以通过数据来验证。在图4中,对A/D转换器进行了4096次采样并记录了数据。在采集数据时,没有在传感器上施加激励。采用这种电路布线,控制器专用于与转换器接口,并将转换器的结果发送到LCD显示器。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图 5 图1电路的顶层和底层布线。注意此布线中有地平面。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图 6 在有地平面的PCB(PCB布线如图5所示)中,对A/D转换器输出4096次采样的柱状图。噪声码宽度为11个码。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图 7 在PCB上将两条走线靠近放置,就会产生寄生电容。信号会通过这种寄生电容在走线之间耦合。
    点击在新窗口查看全图CTRL+鼠标滚轮放大或缩小
    图8 显示在图1电路中添加一个四阶抗信号混叠滤波器后的转换结果。另外,电路板布线中添加了地平面。

      图5所示的布线与图3中的布线基本相同,但在底层添加了地平面。地平面(图5b)有几处被信号线打断,应尽量减少地平面被断开的次数。电流返回路径不应缩短,因为这些走线会限制从器件到电源接插件的电流流动。A/D转换器输出的柱状图如图6所示。与图4相比,输出码要密集得多。两次测试中使用了相同的有源器件。无源器件不同,会导致较小的偏置差异。

      从上述数据很容易看出,地平面确实对电路噪声有抑制作用。当电路中没有地平面时,噪声的宽度大约为15个码;添加了地平面后,性能提高了约1.5倍或15/11倍。请注意,测试是在电磁干扰较低的实验室中进行的。

      A/D转换器输出数字码的噪声可归因于运放的噪声和缺少抗信号混叠滤波器。如果电路中有“最少”量的数字电路,可能只需要一个地平面和一个电源平面就可以了。“最少”可由电路板设计人员定义。将数字和模拟地平面连接在一起的危险在于,模拟电路会从电源引脚引入噪声,并将噪声耦合到信号路径中。在电路的一点或多点上,要将模拟电路和数字电路的地和电源连接在一起,以确保所有器件的电源、输入和输出共地,其标称值不会被破坏。

      在12位系统中,电源平面并不象地平面那么重要。尽管电源平面可以解决许多问题,使电源线比电路板上其它走线宽两倍或三倍,以及有效使用旁路电容,都可以降低电源的噪声。

      信号线

      电路板(包括数字和模拟电路)上的信号线要尽量短。这个基本准则将降低无关信号耦合到信号路径的可能性。尤其要注意的是模拟器件的输入端,这些输入端通常比输出引脚或电源引脚具有更高的阻抗。例如,A/D转换器的参考电压输入引脚在进行转换期间是最为敏感的。对于图1中的12位转换器,输入引脚(IN+和IN-)对引入的噪声也很敏感。运放的输入端也有可能在信号路径中引入噪声。这些端通常具有109W至1013W的输入阻抗。

      高阻抗输入端对于输入电流比较敏感。如果从高阻抗输入端引出的走线靠近有快速变化电压的走线(如数字或时钟信号线),就会发生这种情况,此时电荷通过寄生电容耦合到高阻抗走线中。

      这两条走线之间的关系如图7所示。图中,两条走线之间寄生电容的值主要取决于走线之间的距离(d),以及两条走线保持平行的长度(L)。通过这个模型,高阻抗走线中产生的电流等于:I=C dV/dt

      其中:I是高阻抗走线上的电流,C是两条PCB走线之间的电容值,dV 是有开关动作的走线上的电压变化,dt 是电压从一个电平变化到下一个电平所用的时间。

      旁路电容和抗信号混叠滤波器的使用

      有关旁路电容的一个原则是:在电路中始终包含旁路电容。如果设计电路时,没有加旁路电容,电源噪声很可能使电路的精度达不到12位。

      旁路电容

      可在电路板上的如下两个位置放置旁路电容:一个电容(10mF至100mF)放置在电源侧,另一个电容放置在每个有源器件(包括数字和模拟器件)旁边。加在器件上旁路电容的值取决于使用的器件。如果器件的带宽小于或等于1MHz,那么采用1mF的电容可以显著降低引入的噪声。如果器件的带宽大于10MHz,0.1mF的电容可能比较合适。如果带宽在这两个频率之间,可同时使用这两种容值的电容,或使用其一。

      电路板上的每个有源器件都需要一个旁路电容。旁路电容必须尽可能靠近器件的电源引脚放置,如图5所示。如果一个器件使用了两个旁路电容,容值小的电容要最靠近器件引脚。而且,旁路电容的引脚要尽量短。

      抗信号混叠滤波器

      请注意,图1所示的电路中没有抗信号混叠滤波器。正如数据所显示,这一疏忽在电路中引起了噪声问题。此电路板中,当在仪表放大器的输出和A/D转换器的输入之间接入一个四阶、10Hz抗信号混叠滤波器时,转换响应的性能大为提高,如图8所示。

      模拟滤波可在模拟信号到达A/D转换器之前,消除叠加在模拟信号上的噪声,尤其是无关的噪声尖峰。A/D转换器将对出现在其输入端的信号进行转换,这种信号可能包括传感器电压信号或噪声,抗信号混叠滤波器消除了转换过程中的高频噪声。


    PCB设计准则

      只要遵循如下几个准则,良好的12位布线技巧并不难掌握:

      1. 检查器件相对于接插件的位置,确保高速器件和数字器件最靠近接插件。

      2. 电路中至少要有一个地平面。

      3. 使电源线比板上的其它走线宽。

      4. 检查电流回路,寻找地线中的可能噪声源。这可通过确定地平面上所有点的电流密度和可能存在的噪声量来实现。

      5. 正确旁路所有器件,将电容尽量靠近器件的电源引脚放置。

      6. 使所有走线都尽量短。

      7. 查看所有的高阻抗走线,逐条走线查找可能的电容耦合问题。

      8. 确保对混合信号电路中的信号正确滤波。
    展开全文
  • 心电前端采集电路采用仪表放大器仪表放大器对于共模干扰有很强的抑制力,适合做心电采集前端电路。传输部分采用USB实现虚拟串口和上位机对接,具体电路如下所示 PCB 上位机程序 实物如下 单...

    十年前接触生物电子让我对电子产生浓厚的兴趣,让我感到电子科技的博大精深无所不能。最近用stm32和C#实现心电监测,分享给大家一起探讨,我也把这些技术资料整理下。

    原理图

    心电前端采集电路采用仪表放大器,仪表放大器对于共模干扰有很强的抑制力,适合做心电采集前端电路。传输部分采用USB实现虚拟串口和上位机对接,具体电路如下所示

    PCB

    上位机程序

     

     

    实物如下

    单片机采用stm32内部AD采集,关键程序如下

    #include "sys.h"
    #include "delay.h"
    #include "led.h" 		 	 
    #include "usb_lib.h"
    #include "hw_config.h"
    #include "usb_pwr.h"	 
    #include "usb_prop.h"
    #include "bsp_usart.h"
    #include "bsp_adc.h"
    
    extern char USB_TX_data[512],USB_RX_data[512];
    extern u8 USB_Tx_Counter,USB_Rx_Counter,USB_TX_flag,USB_RX_flag;
    extern char U1_TX_data[512],U1_RX_data[512];
    extern u8 U1_Tx_Counter,U1_Rx_Counter,U1_TX_flag,U1_RX_flag;
    
    extern short	AD_BUF[1024];
    extern unsigned int TIM3_count;
    extern char TIM3_flag;
    
    void RCC_HSI_Configuration(void)
    {
        RCC_DeInit();//??? RCC?????????
    
        RCC_HSICmd(ENABLE);//??HSI  
        while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)//??HSI????
        {
        }
    
        if(1)
        {
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
            FLASH_SetLatency(FLASH_Latency_2);
            
            RCC_HCLKConfig(RCC_SYSCLK_Div1);   
            RCC_PCLK1Config(RCC_HCLK_Div2);
            RCC_PCLK2Config(RCC_HCLK_Div1);
            RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); 
            RCC_PLLCmd(ENABLE);//??PLL???????,????????
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            {
            }
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  
            while(RCC_GetSYSCLKSource() != 0x08)
            {
            }
        }
    }
     int main(void)
     {	 
     	u16 i;
    	u16 temp;
    	u8 usbstatus=0;	
    	RCC_HSI_Configuration();
    	delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
    	LED_Init();
    	USART1_Config();
    	ADC_Config();
    	
    	delay_ms(10000);
    	USB_Port_Set(0); 	
    	delay_ms(50);
    	USB_Port_Set(1);	
     	Set_USBClock();   
     	USB_Interrupts_Config();    
     	USB_Init();	
    	
    	while(1)
    	{
    		if(TIM3_flag==1)
    		{
    			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
    			TIM3_flag=0;
    			temp=ADC_GetConversionValue(ADC1);
    			USB_USART_SendData(0x55);//ÒÔ×Ö½Ú·½Ê½,·¢Ë͸øUSB
    			USB_USART_SendData(0xaa);//ÒÔ×Ö½Ú·½Ê½,·¢Ë͸øUSB
    			USB_USART_SendData(temp>>8);//ÒÔ×Ö½Ú·½Ê½,·¢Ë͸øUSB
    			USB_USART_SendData(temp);//ÒÔ×Ö½Ú·½Ê½,·¢Ë͸øUSB 
    			USB_USART_RX_STA=0;
    			GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
    		}
    		if(USB_RX_flag==1)
    		{
    			USB_RX_flag=0;
    		}
    		if(usbstatus!=bDeviceState)//USBÁ¬½Ó״̬·¢ÉúÁ˸ıä.
    		{
    			usbstatus=bDeviceState;//¼Ç¼ÐµÄ״̬
    		}
    	}
    }
    void ADC_Config(void)
    {
    	GPIO_InitTypeDef  GPIO_InitStructure;
    	NVIC_InitTypeDef   NVIC_InitStructure;
    	ADC_InitTypeDef   ADC_InitStructure;
    	TIM_TimeBaseInitTypeDef			TIM_TimeBaseInitStruct;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1  , ENABLE );
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 , ENABLE);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//Ä£ÄâÊäÈë
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  
    	ADC_InitStructure.ADC_ScanConvMode = ENABLE;  
    	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;  
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
    	ADC_InitStructure.ADC_NbrOfChannel = 1;  
    	ADC_Init(ADC1, &ADC_InitStructure);  
    	
    	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
    	
    	ADC_Cmd(ADC1, ENABLE);  
    	
    	ADC_ResetCalibration(ADC1);  
    	while(ADC_GetResetCalibrationStatus(ADC1)); 
    	ADC_StartCalibration(ADC1);  
    	while(ADC_GetCalibrationStatus(ADC1)); 
    	
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE); 
    
    	TIM_DeInit(TIM3);        //½«ÍâÉèTIM3¼Ä´æÆ÷ÖØÉèΪȱʡֵ  
    	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;    //ÉèÖÃÁËʱÖÓ·Ö¸î(Tck_tim) 
    	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up ;   //Ñ¡ÔñÁ˼ÆÊýÆ÷ģʽ(TIMÏòÉϼÆÊýģʽ)  
    	TIM_TimeBaseInitStruct.TIM_Period = 999 ;       //É趨¼ÆÊýÆ÷×Ô¶¯ÖØ×°Öµ,È¡Öµ·¶Î§0x0000~0xFFFF   
    	TIM_TimeBaseInitStruct.TIM_Prescaler = 47 ;    //ÉèÖÃÓÃÀ´×÷ΪTIM3ʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵΪ(7199+1),È¡Öµ·¶Î§0x0000~0xFFFF 
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct ) ;       
    
    	TIM_ClearFlag(TIM3, TIM_FLAG_Update);         //Çå³ýTIM3µÄ´ý´¦Àí±ê־λ    
    	TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);     //ʹÄÜTIM3ÖÐ¶Ï  
    	TIM_Cmd(TIM3, ENABLE);         //ʹÄÜTIM3ÍâÉè  
    	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //NVIC_Group:ÏÈÕ¼ÓÅÏȼ¶2룬´ÓÓÅÏȼ¶2λ  
      NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;    //ÅäÖÃΪTIM3ÖÐ¶Ï  
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //ÏÈÕ¼ÓÅÏȼ¶Îª1  
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;   //´ÓÓÅÏȼ¶Îª2  
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //ʹÄÜÖжÏͨµÀ  
      NVIC_Init(&NVIC_InitStructure); 
    }

    上位机采用C#,C#开发window系统应用程序非常方便,程序如下

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO.Ports;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication4
    {
        public partial class Form1 : Form
        {
            private StringBuilder sb = new StringBuilder();     //为了避免在接收处理函数中反复调用,依然声明为一个全局变量
            long AD_num = 12;
            long LD_num = 1;
            long MD_num = 11;
            long QP_num = 0;
            int QP_flag = 0;
            long uart_count = 0;
            private const int Unit_length = 32;//单位格大小
            private const int X_End = 1024+512+256+48;//Y轴最大数值
            private const int Y_End = 512+256+128;//Y轴最大数值
            private const int X_Start = 48;//Y轴最大数值
            private const int Y_Start = 128;//Y轴最大数值
            private const int MaxStep = 33;//绘制单位最大值
            private const int MinStep = 1;//绘制单位最小值
            private const int StartPrint = 100;//点坐标偏移量
            private List<int> DataList = new List<int>();//数据结构----线性链表
            private Pen TablePen = new Pen(Color.FromArgb(0x80, 0x00, 0x00));//轴线颜色
            private Pen LinesPen = new Pen(Color.FromArgb(0x00, 0x80, 0x80));//波形颜色
            public Form1()
            {
                this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint |
                               ControlStyles.AllPaintingInWmPaint,
                               true);//开启双缓冲
                this.UpdateStyles();
                InitializeComponent();
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
                TablePen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
                SearchAndAddSerialToComboBox(serialPort1, comboBox1);
            }
            private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox)
            {                                                               //将可用端口号添加到ComboBox
                string Buffer;                                              //缓存
                comboBox1.Items.Clear();                                        //清空ComboBox内容
                //int count = 0;
                for (int i = 1; i < 30; i++)                                //循环
                {
                    try                                                     //核心原理是依靠try和catch完成遍历
                    {
                        Buffer = "COM" + i.ToString();
                        MyPort.PortName = Buffer;
                        MyPort.Open();                                      //如果失败,后面的代码不会执行
                                                                            // MyString[count] = Buffer;
                        comboBox1.Items.Add(Buffer);                            //打开成功,添加至下俩列表
                        MyPort.Close();                                     //关闭
                    }
                    catch
                    {
                    }
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    //将可能产生异常的代码放置在try块中
                    //根据当前串口属性来判断是否打开
                    if (serialPort1.IsOpen)
                    {
                        //串口已经处于打开状态
                        serialPort1.Close();    //关闭串口
                        button1.Text = "打开串口";
                        button1.BackColor = Color.ForestGreen;
                        comboBox1.Enabled = true;
                        uart_count = 0;
                    }
                    else
                    {
                        //串口已经处于关闭状态,则设置好串口属性后打开
                        comboBox1.Enabled = false;
                        serialPort1.PortName = comboBox1.Text;
                        serialPort1.BaudRate = 115200;
                        serialPort1.DataBits = 8;
                        serialPort1.Parity = System.IO.Ports.Parity.None;
                        serialPort1.StopBits = System.IO.Ports.StopBits.One;
                        serialPort1.Open();     //打开串口
                        button1.Text = "关闭串口";
                        button1.BackColor = Color.Firebrick;
                    }
                }
                catch (Exception ex)
                {
                    //捕获可能发生的异常并进行处理
    
                    //捕获到异常,创建一个新的对象,之前的不可以再用
                    serialPort1 = new System.IO.Ports.SerialPort();
                    //刷新COM口选项
                    comboBox1.Items.Clear();
                    comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
                    //响铃并显示异常给用户
                    System.Media.SystemSounds.Beep.Play();
                    button1.Text = "打开串口";
                    button1.BackColor = Color.ForestGreen;
                    MessageBox.Show(ex.Message);
                }
            }
    
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                int num = serialPort1.BytesToRead; 
                byte[] received_buf = new byte[num];
                int[] show_buf = new int[num];
                float show_data = 1;
                
                serialPort1.Read(received_buf, 0, num);           
                if (num == 4)
                {
                    uart_count = uart_count + 4;
    
                    show_data =  ((long)(received_buf[2] << 8) + (long)(received_buf[3]))*768/4096;
    
                    
                    show_buf[0] = (int)show_data;
                    DataList.Add(show_buf[0]);//链表尾部添加数据
                    Invalidate();            //刷新显示
                    sb.Clear();
                    try
                    {
                        //因为要访问UI资源,所以需要使用invoke方式同步ui
                        this.Invoke((EventHandler)(delegate
                        {
                            textBox1.Clear();
                            textBox1.AppendText(uart_count.ToString("F2"));
                        }
                           )
                        );
    
                    }
                    catch (Exception ex)
                    {
                        //响铃并显示异常给用户
                        System.Media.SystemSounds.Beep.Play();
                        MessageBox.Show(ex.Message);
    
                    }
                }
            }
            private void Form1_Paint(object sender, PaintEventArgs e)//画
            {
                String Str = "";
                System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
                e.Graphics.FillRectangle(Brushes.White, e.Graphics.ClipBounds);
                //Draw Y 纵向轴绘制
                for (int i = 0; i <= (X_End - X_Start) / Unit_length; i++)
                {
                    e.Graphics.DrawLine(TablePen, X_Start + i * Unit_length, Y_Start, X_Start + i * Unit_length, Y_End);//画线
                    gp.AddString(i.ToString(), this.Font.FontFamily, (int)FontStyle.Regular, 12, new RectangleF(X_Start + i * Unit_length - 7, Y_End + 4, 400, 50), null);//添加文字
                }
                //Draw X 横向轴绘制
                for (int i = 0; i <= (Y_End - Y_Start) / Unit_length; i++)
                {
                    e.Graphics.DrawLine(TablePen, X_Start, Y_Start + i * Unit_length, X_End, Y_Start + i * Unit_length);//画线
                   // if (i == 17)           break;
                    gp.AddString((((12 - i) * Unit_length).ToString() ), this.Font.FontFamily, (int)FontStyle.Regular, 14, new RectangleF(X_Start - 50, Y_Start + i * Unit_length - 8, 400, 50), null);//添加文字
                }
                e.Graphics.DrawPath(Pens.Black, gp);//写文字
                if (DataList.Count - 1 >= (X_End - X_Start))//如果数据量大于可容纳的数据量,即删除最左数据
                {
                    DataList.RemoveRange(0, DataList.Count - (X_End - X_Start) - 1);
                }
                for (int i = 0; i < DataList.Count - 1; i++)//绘制
                {
                    e.Graphics.DrawLine(LinesPen, X_Start + i, Y_End - DataList[i], X_Start + (i + 1), Y_End - DataList[i + 1]);
                }
    
            }
        }
    }

     

    展开全文
  • 仪表由直流电压通过测量电路放大、比较后,形成具有一定比例的电流量来决定表头指针的偏转角度,即表头示值。其工作原理1所示。  1 配热电偶仪表的工作原理 R圈-表头动圈电阻 RM、Rt、R附-表头内部...
  • 仪表由直流电压通过测量电路放大、比较后,形成具有一定比例的电流量来决定表头指针的偏转角度,即表头示值。其工作原理1所示。  1 配热电偶仪表的工作原理 R圈-表头动圈电阻 RM、Rt、R附-表头内部...
  • 如果两者不等,则差值将经放大器放大,驱动可逆电机和平衡机构,带动指示记录机构动作,与此同时,调节已知信号的大小,直到与被测信号相等,使输送给放大器的信号等于零。此时,指示记录机构反映的读数即为被测量的...
  • 如果两者不等,则差值将经放大器放大,驱动可逆电机和平衡机构,带动指示记录机构动作,与此同时,调节已知信号的大小,直到与被测信号相等,使输送给放大器的信号等于零。此时,指示记录机构反映的读数即为被测量的...
  • 用户线接口电路 二/ 四线变换 二/四线变换 用户线接口电路 用户1 PCM CODEC电路 PCM CODEC电路 用户3 用户线接口电路 二/ 四线变换 二/ 四线变换 用户线接口电路 用户2 PCM CODEC电路 PCM CODEC电路 ...
  •  1 位式调节原理示意 1-加热设备 2-加热对象7-控制线圈 8-设定针 3-热电偶 4-动圈 5-指针 6-铝旗9-振荡放大器 10-继电器 11-开关  旗转动时,就形成了指针和设定针(也就是铝旗和控制线圈)的相对角位移。...
  • (a)中,TA是电流互感器,F是手摇交流发电机,Z是机械整流器或相敏整流放大器,S是量程转换开关,G是检流计,Rs是电位器。该表具有3个接地端钮,它们分别是接地端钮E(E端钮是由电位辅助端钮P2和电流辅助端钮C2在...
  • (a)中,TA是电流互感器,F是手摇交流发电机,Z是机械整流器或相敏整流放大器,S是量程转换开关,G是检流计,Rs是电位器。该表具有3个接地端钮,它们分别是接地端钮E(E端钮是由电位辅助端钮P2和电流辅助端钮C2在...
  •  1 位式调节原理示意 1-加热设备 2-加热对象7-控制线圈 8-设定针 3-热电偶 4-动圈 5-指针 6-铝旗9-振荡放大器 10-继电器 11-开关  旗转动时,就形成了指针和设定针(也就是铝旗和控制线圈)的相对角位移。...
  • 工程电路分析(第六版)

    热门讨论 2009-05-08 02:33:56
    6.6 比较器和仪表放大器 总结和复习 深入阅读 习题 第7章 电容和电感 7.1 电容 实际应用——超级电容 7.2 电感 7.3 电感和电容的组合 7.4 线性推论 7.5 带电容的简单运放电路 7.6 对偶 7.7 用PSpice对电容和电感建模...
  • 然后分别介绍了各种半导体器件、光电器件、运算放大器、直流稳压和调压器件、电声器件等专用元器件;介绍了各种滤波电路的设计及实用电路、各种振荡电路及555时基电路;在数字电路中,从各种门电路、触发器开始,...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

仪表放大器电路原理图