最新日志

发表于:2007-10-26 16:26:29
标签:模拟开关机理  

1

深刻理解模拟开关原理,正确应用模拟开关

近年来,便携式产品越来越多地采用多源设计,因此开关功能是视频、音频传输及处理过程中的一个重要组成部分。早期采用的机械开关具有可靠性低、体积大、功耗大的缺点,所以模拟开关已经引起了越来越多人的重视,并已被广泛应用于各种电子产品中。

尽管模拟开关具有机械开关不可取代的优势,然而它的应用较机械开关稍微复杂些,初次使用模拟开关的工程人员往往会由于模拟开关使用不当,引起整个系统的故障。本文通过将模拟开关与普通机械开关作比较,论述了模拟开关的若干基本概念,并结合实例对模拟开关应用的关键技术进行研究。

模拟开关的模拟特性

许多工程师第一次使用模拟开关,往往会把模拟开关完全等同于机械开关。其实模拟开关虽然具备开关性,但和机械开关有所不同,它本身还具有半导体特性:

1. 导通电阻(Ron)随输入信号(VIN)变化而变化

图1a是模拟开关的简单示意图,由图中可以看出模拟开关的常开常闭通道实际上是由两个对偶的N沟道MOSFET与P沟道MOSFET构成,可使信号双向传输,如果将不同VIN值所对应的P沟道MOSFET与N沟道MOSFET的导通电阻并联,可得到图1b并联结构下Ron随输入电压(VIN)的变化关系,如果不考虑温度、电源电压的影响,Ron随Vin呈线性关系,将导致插入损耗的变化,使模拟开关产生总谐波失真(THD)。此外,Ron也受电源电压的影响,通常随着电源电压的上升而减小。

图1:a. 模拟开关原理图;b. 模拟开关导通电阻与输入电压关系
2. 模拟开关输入有严格的输入信号范围

由于模拟开关是半导体器件,当输入信号过低(低于零电势)或者过高(高于电源电压)时,MOSFET处于反向偏置,当电压达到某一值时(超出限值0.3V),此时开关无法正常工作,严重者甚至损坏。因此模拟开关在应用中,一定要注意输入信号不要超出规定的范围。

3. 注入电荷

应用机械开关我们当然希望Ron越低越好,因为低阻可以降低信号的损耗。然而对于模拟开关而言,低Ron并非适用于所有的应用,较低的Ron需要占据较大的芯片面积,从而产生较大的输入电容,在每个开关周期其充电和放电过程会消耗更多的电流。时间常数t=RC,充电时间取决于负载电阻(R)和电容(C),一般持续几十纳秒。这说明低Ron具有更长的导通和关断时间。为此,选择模拟开关应该综合权衡Ron和注入电荷。

4. 开关断开时仍会有感应信号漏出

这一特性指的是当模拟开关传输交流信号时,在断开情况下,仍然会有一部分信号通过感应由输入端传到输出端,或者由一个通道传到另一个通道。通常信号的频率越高,信号泄漏的程度越严重。

5. 传输电流比较小

模拟开关不同于机械开关,它通常只能传输小电流,目前CMOS工艺的模拟开关允许连续传输的电流大多小于500mA。

6. 逻辑控制端驱动电流极小

机械开关逻辑控制端的驱动电流往往都是毫安级,有时单纯靠数字I/O很难驱动。而模拟开关的逻辑控制端驱动电流极小,一般低于纳安级。因此,它完全可以由数字I/O直接驱动,从而达到降低功耗、简化电路的目的。

模拟开关的开关特性

既然称之为模拟开关,自然它还具有开关性,具体表现如下:

1. 信号可双向传输

有些人习惯于把模拟开关的两个常开常闭端称之为输入端,公共端称之为输出端,其实这只是根据模拟开关的具体应用给予的临时定义。模拟开关大多可以使信号双向传输,如果忽略这一点,就很容易使电路生成问题,比如将电压反向偏置、电流倒灌等。

2. 开关断开后漏电流极小

模拟开关在断开(OFF)时会呈现高阻状态,两传输端间的漏电流极小,一般只有纳安级以下,如SGM3001、SGM3002和SGM3005系列模拟开关,其断开后的漏电流均为1nA。这么微弱的电流在应用中可忽略不计,模拟开关此时可被认为是理想断开的。

总之,模拟开关是具有开关功能的半导体器件,在应用过程中既要充分利用它的开关功能,又要考虑它的半导体特性,否则可能会出现意想不到的麻烦。

模拟开关应用实例分析

图2是一音响设备前端放大及信号选通部分电路,其中选用了SGM324(四通道运算放大器)和SGM3002(双通道模拟开关)。

点击看大图

图2:音响前端放大及信号选通电路
该方案设计本意是当Input=0时,Line_outL和Line_outR音频信号选通;当Input=1时,Phone_outL和Phone_outR音频信号选通。然而当实验机做出后,设计者发现当Input=1时,Line_outL和Line_outR通道有相当一部分信号分别漏到D1和D2端。应用网络分析仪HP/Agilent 3589A测试SGM3002的关断隔离度,当输入信号为10kHz时,SGM3002的关断隔离度仅为-120dB,因此芯片应该没有问题。

事实上,该电路在模拟开关应用上存在下面两处错误:

1. 模拟开关的输入信号缺少一个直流偏置

图2中模拟开关部分电路可以等效成图3,本文第一部分曾经提到模拟开关输入信号输入不能为负。

点击看大图

图3:模拟开关等效电路
通常来讲,CMOS工艺的模拟开关输入信号最小只能到-0.3V,如果再低于这个值,芯片将不能正常工作,甚至会损坏。图2中模拟开关输入信号没有直流偏置,所以输入信号有一部分处于负值区,模拟开关自然无法正常工作。

解决办法:将电容C2、C3均去掉,模拟开关输入信号便有了1/2VDC的直流偏置信号,此时模拟开关便可以轨到轨工作。此外,由于模拟开关公共端后面加了电容,所以直流信号依然可以被有效地隔离。

2. 在D1和D2端缺少耦合电阻

当模拟开关在断开的情况下,其输入与输出端等效串联了一个电容C,如果再假设在模拟开关输出端到地之间有一个等效电阻R,则模拟开关在断开时的等效电路如图4所示。

图4:模拟开关断开时的等效电路
此时的模拟开关其实等效为一个RC滤波电路,由此不难得出以下公式:


其中,uout为模拟开关输出信号;uin为模拟开关输入信号;R为模拟开关输出端电阻负载;C为模拟开关断开时等效电容;f为输入信号频率。

由于模拟开关等效电容C会设计成很小,所以当输入信号f处于音频区时,增益A由R和f同时决定。当R取值较小时,f起主导作用,此时A<<1,信号被有效隔离。当R取值较大时,此时R起主导作用,此时A—>1,信号几乎被完全泄漏过来。所以当输出端悬空时,其输出端与地之间电阻R—>+∞,此时模拟开关完全导通。

修正以上两个错误后,该音频应用电路便可以正常工作了。由以上实例可以看出,充分理解模拟开关的基本概念是正确应用模拟开关的基础。

点击此处查看原文 >>

系统分类: 模拟技术   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(889)
发表于:2007-9-28 17:34:48
标签:ARM  字节对齐  问题  

0

ARM程序由于字节对齐引起的问题深入分析

      首先说说,什么叫对齐。如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;半字对齐的特征是bit0=0,其他位为任意值。字对齐的特征是bit1=0,bit0=1,其他位为任意值。如果一个数据是以能被4 整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。举例说明四字节对齐: 对内存进行操作时,被访问的地址必须为4的倍数。如果分配到的地址的地址不是4的倍数时,CPU实际访问的地址还是按照字对齐的方式来操作。也就是自动屏蔽bit1和bit0.   

      用ADS的ARM C Complier下Optimization Level可能引起问题,其中的一个问题就是字节对齐的问题。下面讲讲问题的现象及实质。

       当时问题的现象是:程序使用一公共变量Buf创建队列,如果ADS编译优化选项采用Minium则软件工作正常;源码不变,如果采用ALL优化,则不正常,数据紊乱且无法工作。为了发现问题,我们分别用Minium和ALL编译,在反汇编条件下单步跟踪程序,观察CPU寄存器和内存变量的变化情况。发现在Minium模式下,编译器把队列内存块Uart0TxBuf分配到的地址是0x400015cc,这个地址是一个4字节对齐的地址,而在ALL模式下,编译器把Buf分配的地址是0x400015c2,这个地址是一个非4字节对齐的地址。正是由于这个非4字节对齐的地址导致了问题的发生。
问题发生在QueueCreate(void *Buf, uint32 SizeOfBuf, uint8 (* ReadEmpty)(), uint8 (* WriteFull)())这个函数里,问题是如何发生的,


        在了解问题发生的机理前,先了解QueueCreate这个函数的工作原理。QueueCreate工作原理是,首先把buf指向的内存初始化为DataQueue格式的结构体。  DataQueue的结构体格式如下:
typedef struct {
    QUEUE_DATA_TYPE     *Out;                   /* 指向数据输出位置         */
    QUEUE_DATA_TYPE     *In;                    /* 指向数据输入位置         */
    QUEUE_DATA_TYPE     *End;                   /* 指向Buf的结束位置        */
    uint16              NData;                  /* 队列中数据个数           */
    uint16              MaxData;                /* 队列中允许存储的数据个数 */
   
    uint8               (* ReadEmpty)();        /* 读空处理函数             */
    uint8               (* WriteFull)();        /* 写满处理函数             */
    QUEUE_DATA_TYPE     *Buf;                 /* 存储数据的空间           */
} DataQueue;
从结构体可以看出,结构体字节类型在内存分配为: 4字节指针变量(*Out)、4字节指针变量(*In)、4字节指针变量(*End)、2字节变量NData、2字节变量MaxData、4字节函数指针变量ReadEmpty()、4字节函数指针变量(WriteFull())
   观察结构体起始地址放在非对齐时会出现什么情况。

          起始地址为0x400015c2时的由编译器分配得到的地址         实际操作地址
*Out       0x400015c2~0x400015c5                                                0x40015c0~0x400015c3
*In         0x400014c6~0x400015c9                                                 x400014c4~0x400015c7
*End      0x400015ca~0x400015cd                                               0x400015c8~0x400015cb
从表中可以看出,实际操作的地址按照4字节对齐格式得到。例如,当执行*Out进行操作时,自动屏蔽bit1和bit0,因此实际发生变化的是0x40015c0~0x400015c3,而不是0x400015c2~0x400015c5,由于实际操作地址和编译器分配地址互相覆盖,当对*In操作时,会导致*Out一起变化,对*End操作时,*In也跟着变化。正是由于非对齐的原因导致创建队列和对列操作完全错误。
     当内存起始地址为4字节对齐地址的情况时,编译器分配地址和实际地址一致,因此不存在上述问题。

结 论:

          在ARM嵌入式系统中,当把一个内存区域初始化为某个结构体时,必须注意字节对齐的情况。如果该内存起始地址为非对齐地址,不仅得不到预期的结果,还可能导致一些很奇怪的让人无法理解表面问题。在C层面上不太容易观察到这些问题的实质,只有深入到汇编一层去分析程序,才可能理解这些现象的深层原因。

 


 

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1320)
发表于:2007-9-7 17:44:34
标签:ADS  编译优化  问题  

0

慎用ADS编译优化(示例)

在使用ADS开发软件过程中发现,当程序复杂到一定程度时,在优化选项为MINIUM时可以通过测试的程序如果用最高优化级别ALL来编译,会冒出一些莫名其妙的问题,在调试时程序在调试窗口的反汇编代码与内存窗口的反汇编代码不一致。

下面是一个例子。本意是把0x00fc00的地址作赋给函数指针upd,在优化选项为minium时,通过反汇编可以看到赋值结果是正确的。当优化选项为ALL时,赋值结果不正确,实际赋值给函数指针upd的地址是0x000000fc,而不是0x0000fc00.

点击看大图

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(2) | 阅读(847)
发表于:2007-8-3 17:32:12
标签:2410  中断系统  

1

2410 中断系统

2410 中断系统

(转载)

1。S3C241056个中断源

2.中断处理流程

 

点击看大图

 

1.       产生中断条件

   设置中断模式

   PSR寄存器的FI位打开,为0

   中断屏蔽位打开,为0

    中断挂起寄存器的请求标志位 1

 

2.       使用中断通常需设置以下寄存器的值,前五个为必须。

 

寄存器名字

 

寄存器地址

 

读写权限

 

作用

SRCPND

0x4a000000

R/W

中断源挂起寄存器,当中断产生后,相应位置位

INTMOD

0x4a000004

R/W

中断模式寄存器,设定IRQFIQ模式

INTMASK

0x4a000008

R/W

中断屏蔽寄存器,如果相应位置1则该中断屏蔽

PRIORITY

0x4a00000c

R/W

中断优先级控制寄存器

INTPND

0x4a000010

R/W

中断挂起寄存器,相应位对应正在执行的中断

INTOFFSET

0x4a000014

R

中断源请求偏移寄存器

SUBSRCPND

0x4a000018

R/W

子中断源挂起寄存器

INTSUBMSK

0x4a00001c

R/W

子中断屏蔽寄存器

 注:
决定能否发生中断的寄存器,也就是说在没有发生中断已经设置的寄存器,不受中断后果的影响:
① PSR寄存器  

② INTMASK寄存器  默认值为   0XFFFFFFFF
表明中断是否发生的寄存器

① SRCPND寄存器  默认值0X00000000

                    在中断服务程序中必须清“0”,通过向对应位写数据

② INTPND寄存器   默认值为0X00000000 

在中断服务程序中必须清“0”,通过向对应位写“1”

 

SRCPND和INTPND的区别:

大体上可以这样理解:S3C2410A支持56个中断源,由一些寄存器的32个位管理决定是否使能中断:SRCPND、INTPND、INTMASK、INTMOD、PRIORITY。

① 有中断源请求到达,SRCPND寄存器的对应位置为 1 ,经过优先模块仲裁后INTPND寄存器的其中一位被置1,而且只能有一位置 1,而SRCPND可允许多位

② 若中断被屏蔽,尽管这样,SRCPND寄存器的相应位被置1,但不影响INTPND寄存器。只要INTPND寄存器的相应位为1,且I-FLAG or F-FLAG位清0,就可以立即启动中断服务程序

③ 中断源的中断请求首先在SRCPND登记

④ SRCPND寄存器不受中断控制器的优先逻辑所影响,INTPND受制于优先级控制。

 

3.       使用定时器1产生中断步骤

①     配置定时器寄存器:

rTCFG0 ―― 预份频值

rTCFG1 ―― 选择MUX的分割比例

rTCNTB1 ―― 设定计数值

rTCMPB1 ―― 设置占空比

       定时器输入时钟频率 = MCLK / { 预分频值 + 1 } / { 除数值 } ,也即1秒钟的计数值

    ② 配置中断系统

                        pISR_TIMER1 = (int)Timer1_ISR   赋中断服务程序的入口地址

                        rINTMSK &= ~(BIT_TIMER1)     开中断

 

如:

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

- 函数名称 : void Timer1_init(void)

- 函数说明 : 定时器初始化程序

- 输入参数 : 无

- 输出参数 : 无

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

void Timer1_init(void)

{

    rGPGCON = rGPGCON & 0xfff0ffff | 0x00050000; //配置GPG口为信号输出

    rGPGDAT = rGPGDAT | 0x300;

 

    rTCFG0  = 255;            // Prescaler0=255

    rTCFG1  = 0 << 4;         //

    //rTCNTB1 = 48828;       // 在pclk=50MHZ下,1秒钟的记数值rTCNTB1 = 50000000 / 4 / 256 = 48828;

    rTCNTB1 = 3;

    rTCMPB1 = 0x00;

    rTCON   = (1 << 11) | (1 << 9) | (0 << 8); //禁用定时器1,手动加载

    rTCON   = (1 << 11) | (0 << 9) | (1 << 8); //启动定时器1,自动装载

    

}
/******************************************************************************

- 函数名称 : void Timer1INT_Init(void)

- 函数说明 : 定时器中断初始化程序

- 输入参数 : 无

- 输出参数 : 无

******************************************************************************/  
void Timer1INT_Init(void)                                                    //定时器接口使能

{

     if ((rINTPND & BIT_TIMER1))

    {

         rSRCPND |= BIT_TIMER1;

    }

    pISR_TIMER1 = (int)Timer1_ISR;

    rINTMSK  &= ~(BIT_TIMER1);  //开中断;   

}

6.对中断的实质理解

其实我对2410的中断没有真正理解的,我不清楚其中的执行流程,以下是我的部分理解(不一定正确的),写下让自己以后改正。

①     2410的向量中断:中断产生后,CPU自动跳中断服务程序执行。不用计算地址偏移,也不需要到rINTPND中查询

②     2410非向量中断:中断产生后,CPU跳到一个固定的地址,查询中断源标号,接着利用“加载程序”跳到中断服务程序。这属于启动代码,程序如下:

 

IsrIRQ 

    sub  sp,sp,#4                  ;//reserved for PC

    stmfd      sp!,{r8-r9}  
    ldr   r9,=INTOFFSET

    ldr   r9,[r9]

    ldr   r8,=HandleEINT0

    add  r8,r8,r9,lsl #2

    ldr   r8,[r8]

    str   r8,[sp,#8]

    ldmfd      sp!,{r8-r9,pc}

问题:C代码中的中断服务程序是如何和启动代码联系起来的,一定要通过启动代码实现中断吗?

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(1114)
发表于:2007-8-3 14:37:35
标签:触摸屏  干扰  CCFL  

0

如何提高触摸屏点击时准确性

由于触摸屏是有两个面积很大的金属膜组成,相当于一个大电容,也相当于一个天线,很容易接收外界
干扰,因此在设计电路时需要考虑如何降低这些干扰的影响。特别是当采用CCFL作为背光源时,这些干扰尤为明显。
可以采取以下 措施减少干扰:
(1)硬件滤波,可以采用RC滤波。
(2)软件滤波,可以采取采样多次平均
(3)LCD的金属外壳接地。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(701)
发表于:2007-7-24 13:37:57
标签:bad  block  encountered  on  read  

0

ghost问题解决

    最近装机,用ghost装系统的时候出现这句话:bad  block(s) encountered on read。上网查询相关问题的解答,发现都说是硬盘有问题,有坏块。提供了“重新分区然后格式化”。我不知道回答这些问题的人是否真的经历过这些问题,并且用这些办法来解决这些问题的。

       但我想告诉大家的是,如果硬盘线有问题,用Ghost装机时,一样会出现这样的问题。因为,这是我的亲身经历。因此如果出现这样的 问题,特别是新装机时出现这样的问题,不要首先怀疑硬盘有问题,因为新硬盘一般不会出现这么严重的问题,而是首先换硬盘线试试。

    这个问题的其他现象:读写磁盘无问题,文件可以被正常拷入到磁盘中。但是不能正常启动。启动后会出现:

      Disk I/O ERROR。

如果用SCANDISK扫描,会出现:

      scandisk  encountered  a data error while reading cluster 2 的提示,提示有坏簇。

 

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(972)
发表于:2007-3-22 20:05:10
标签:生物医学技术  血氧饱和度  测量电路原理  

0

生物医学技术之血氧测量技术(4)-血氧饱和度测量电路原理

通过对脉搏血氧测量原理的研究,人们已经发现只要测量出两种波长的透射光在一个完整的脉搏波中光强度的变化量就可以计算出血氧饱和度。现代的光电和微电子技术为这种测量原理的实现提供了可能。根据脉搏血氧测量原理可以设计出各种各样的血氧测量计,基本结构框架如下:

点击看大图

血氧测量计的基本结构包括两部分:血氧传感器器和血氧电路。从理论上来看,血氧传感器的由简单的两部分组成:光发射和光接受部分组成。但是在临床上使用的血氧传感器除了包括这两个核心的器件外,还包括相应的机械部件、信号传输电缆、探头识别接口等。这些因素直接影响探头的可靠性、舒适性。探头能否在实际临床上被可靠的稳定的使用很大程度上取决于这些外围的部件。因此,在工程设计是,除了对传感器工作原理的分析外,对传感器其他部件的分析,寻求一个合适的解决方案是一项技术能否实现产品化的关键。

   信号处理电路对来自传感器的信号进行处理,信号经过放大、滤波,得到一定幅度的信号。这个信号送入到A/D转化电路,实现模拟到数字量的转化,被数字化之后的信号经过单片机按照血氧算法计算后得到血氧饱和度。

 

   在血氧测量原理我们提到,用两种特定的波长就可以实现脉搏血氧饱和度的测量。这两种光的波长是660nm940nm。通过对人体生理波形的分析可以知道,人体的脉搏次数在30~250/分钟,对应的频率是0.5~4.1HZ,。采样定理指出:对于一个具有有限频谱的连续信号进行采样,当采样频率大于信号频率的两倍是,有采样后得到的输出函数能无失真的恢复到原来的信号。在实际上,我们取采样频率为120HZ,可以保证信号的无失真。即使是120HZ,对单片机控制电路来讲,频率也是比较低的,因此对与红光和红外光的采样采用分时采样的方法,即对红光和红外光的采样在不同时刻,但是这两个信号的采样时刻非常的接近。此外,考虑到减少传感器电缆线的芯线数量,降低成本和增强电缆的可靠性,因此在设计红光和红外光的连接方式式采用的红光和红外光反向并联的方式。连接方式如下图:

传感器采用发光二极管LED作为光源,以光电二极管作为光检测器件。在前面的讨论中我们提到采用660nm940nm波长的LED时可以减少测量误差。因此最终确定选用660nm940nm波长的LED作为光源。

    光源采用脉冲驱动。采用脉冲驱动的好处是两路光源可以交替发亮,检测电路可以采用对两路光响应电平一致的光敏元件接收。

 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(1782)
发表于:2007-3-12 10:04:05
标签:生物医学  血氧饱和度  计算方法  

0

生物医学技术之血氧测量技术(3)-血氧饱和度计算方法

光是一种电磁波。自然是由不同波长(400~700nm)的电磁波按一定比例组成的混合光,通过棱镜可分解成红、橙、黄、绿、青、蓝、紫等各种颜色相连续的可见光谱。如把两种光以适当比例混合而产生白光感觉时,则这两种光的颜色互为补色。处于同一直线关系的两种色光(如绿与紫、黄与蓝)互为补色。(www.ednchina.com/blog/cllzs原创)

当白光通过溶液时,如果溶液对各种波长的光都不吸收,溶液就没有颜色。如果溶液吸收了其中一部分波长的光,则溶液就呈现透过溶液后剩余部分光的颜色。例如,我们看到KMnO4溶液在白光下呈紫红色,就是因为白光透过溶液时,绿色光大部分被吸收,而其它各色都能透过。在透过的光中除紫红色外都能两两互补成白色,所以KMnO4溶液呈现紫红色。

同理,CuSO4溶液能吸收黄色光,所以溶液呈蓝色。由此可见,有色溶液的颜色是被吸收光颜色的补色。吸收越多,则补色的颜色越深。比较溶液颜色的深度,实质上就是比较溶液对它所吸收光的吸收程度。下表列出了溶液的颜色与吸收光颜色的关系。

溶液的颜色与吸收光颜色的关系

 

点击看大图

 

当一束平行单色光(只有一种波长的光)照射有色溶液时,光的一部分被吸收,另一部分透过溶液