PIC24F32 I2C 学习

1. MCC生成代码解析
主要定义了如下结构体,导致整程序阅读理解比较复杂
下面的结构体定义了I2C请求操作模块(trb),包含了读写操作需要的地址,指向待写数据的指针,数据的字节数信息
typedef struct
{
    uint16_t  address;          // Bits <10:1> are the 10 bit address.
                                // Bits <7:1> are the 7 bit address
                                // Bit 0 is R/W (1 for read)
    uint8_t   length;           // the # of bytes in the buffer
    uint8_t   *pbuffer;         // a pointer to a buffer of length bytes
} I2C1_TRANSACTION_REQUEST_BLOCK;

下面的结构体定义了一个队列单元条目,包含trb个数,指向上述trb模块的指针,I2C状态机状态信息

typedef struct
{
    uint8_t                         count;          // a count of trb's in the trb list
    I2C1_TRANSACTION_REQUEST_BLOCK  *ptrb_list;     // pointer to the trb list
    I2C1_MESSAGE_STATUS             *pTrFlag;       // set with the error of the last trb sent.
                                                    // if all trb's are sent successfully,
                                                    // then this is I2C1_MESSAGE_COMPLETE
} I2C_TR_QUEUE_ENTRY;

下面的结构体定义了一个I2C对象,包含两个分别指向trb头尾的指针,trb队列状态位,I2C完成标志,I2C累积错误数

typedef struct
{
    /* Read/Write Queue */
    I2C_TR_QUEUE_ENTRY          *pTrTail;       // tail of the queue
    I2C_TR_QUEUE_ENTRY          *pTrHead;       // head of the queue
    I2C_TR_QUEUE_STATUS         trStatus;       // status of the last transaction
    uint8_t                     i2cDoneFlag;    // flag to indicate the current
                                                // transaction is done
    uint8_t                     i2cErrors;      // keeps track of errors


} I2C_OBJECT ;

MCC生成的驱动代码主要围绕I2C_OBJECT进行操作,首先它定义了如下全局变量,为I2C处理队列条目预分配内存

static I2C_TR_QUEUE_ENTRY i2c1_tr_queue[I2C1_CONFIG_TR_QUEUE_LENGTH];

I2C1_CONFIG_TR_QUEUE_LENGTH默认值为1,意味着默认I2C仅仅能创建一个处理请求。

其次它定义了一个I2C对象类型的全局变量

static I2C_OBJECT i2c1_object;

变量加上限定词static应该是为了防止用户程序(为了便利性等)直接对此变量进行操作

在I2C初始化函数里,除了I2C硬件寄存器的初始化,也对i2c1_object进行了初始化

i2c1_object.pTrHead = i2c1_tr_queue;
i2c1_object.pTrTail = i2c1_tr_queue;
i2c1_object.trStatus.s.empty = true;
i2c1_object.trStatus.s.full = false;

i2c1_object.i2cErrors = 0;

用户主要调用I2C_MasterWrite() 以及I2C_MasterRead()函数实现对i2c设备的访问操作。调用I2C_MasterWrite()后,首先创建一个trb类型局部静态变量,并将数据指针,数据长度,外设地址传递给trb。然后尝试在i2c1_object对象里插入一个trb单元,成功后置位I2C中断标志位,触发中断处理例程。

void I2C1_MasterWrite(
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address,
                                I2C1_MESSAGE_STATUS *pstatus)
{
    static I2C1_TRANSACTION_REQUEST_BLOCK   trBlock;

    // check if there is space in the queue
    if (i2c1_object.trStatus.s.full != true)
    {
        I2C1_MasterWriteTRBBuild(&trBlock, pdata, length, address);
        I2C1_MasterTRBInsert(1, &trBlock, pstatus);
    }
    else
    {
        *pstatus = I2C1_MESSAGE_FAIL;
    }

}
void I2C1_MasterWriteTRBBuild(
                                I2C1_TRANSACTION_REQUEST_BLOCK *ptrb,
                                uint8_t *pdata,
                                uint8_t length,
                                uint16_t address)
{
    ptrb->address = address << 1;
    ptrb->length  = length;
    ptrb->pbuffer = pdata;
}
void I2C1_MasterTRBInsert(
                                uint8_t count,
                                I2C1_TRANSACTION_REQUEST_BLOCK *ptrb_list,
                                I2C1_MESSAGE_STATUS *pflag)
{

    // check if there is space in the queue
    if (i2c1_object.trStatus.s.full != true)
    {
        *pflag = I2C1_MESSAGE_PENDING;

        i2c1_object.pTrTail->ptrb_list = ptrb_list;
        i2c1_object.pTrTail->count     = count; //count fixed to 1....
        i2c1_object.pTrTail->pTrFlag   = pflag;
        i2c1_object.pTrTail++;

        // check if the end of the array is reached
        if (i2c1_object.pTrTail == (i2c1_tr_queue + I2C1_CONFIG_TR_QUEUE_LENGTH))
        {
            // adjust to restart at the beginning of the array
            i2c1_object.pTrTail = i2c1_tr_queue;
        }

        // since we added one item to be processed, we know
        // it is not empty, so set the empty status to false
        i2c1_object.trStatus.s.empty = false;

        // check if full
        if (i2c1_object.pTrHead == i2c1_object.pTrTail)
        {
            // it is full, set the full status to true
            i2c1_object.trStatus.s.full = true;
        }

        // for interrupt based
        if(i2c1_state == S_MASTER_IDLE)
        {    
            // force the task to run since we know that the queue has
            // something that needs to be sent
            IFS1bits.MI2C1IF = 1;
        }           
        
    }
    else
    {
        *pflag = I2C1_MESSAGE_FAIL;
    }

}

2. 用户程序编写

I2C写的话主要调用I2C1_MasterWrite(pdata,length,slave_address,pstatus)函数,其中pdata为指向待写数据(包含寄存器地址等待写信息)的指针,length为数据长度,slave_address为从设备地址,pstatus为I2C模块的状态标志位,用于判断操作I2c之后的返回状态以及I2C状态机的状态信息。

执行写操作的一般步骤如下

  1. 判断I2C状态是否为异常,如果否,则调用I2Cx_MasterWrite函数在TrB队列里面插入一个处理请求
  2. 判断I2C状态是否是pending状态,如果是,表明上一次操作还没有完成。此时唯有等待(设置超时机制)
  3. I2C状态为非pending状态,或者等待超时后,判断I2C状态是否为完成状态,如果是,函数返回;或者超时已经达到预设最大次数,此时函数也返回,但是写操作失败
  4. 如果I2C状态为其它状态,则函数试图重新调用写函数,直到重试次数达到预设最大值

执行读操作的一般步骤

  1. 判断I2C状态机是否处于fail状态,如果否,则进行下一步
  2. 调用I2C_Master_Write()函数写入待读寄存器地址
  3. 判断I2C写是否成功,如果成功,则进行下一步,否则退出
  4. 调用I2C_Master_Read()函数

 

 

MOSFET驱动及半桥死区时间计算

现在大部分的MOSFET驱动电路均为电压源驱动。在MOSFET开启和关闭的过程中,依据栅极电压,沟道电流,漏极电压的变化,可细分为四个阶段,

  1. \(V_{GS}\)从零上升到\(V_{{GS}\_th}\) ,此时沟道电流和漏源电压没有任何变化。此段时间计为\(t_1\)
  2. \(V_{GS}\)从\(V_{{GS}\_th}\) 上升到\(V_{{GS}\_plateu}\) ,相应的,可以认为在这段时间内沟道电流从零上升到工作电流(感性负载?),而漏极电压保持不变。此段时间加上\(t_1\)计为\(t_2\)
  3. \(V_{GS}\)保持在\(V_{{GS}\_plateu}\) ,\(C_{GD}\)被充电,相应的,漏源电压从电源电压下降到\(V_{{DS}\_ON}\),而沟道电流近似不变。此段时间计为\(t_3\)
  4. \(V_{GS}\)从\(V_{{GS}\_plateu}\)上升到栅极驱动芯片输出电压,此为过驱动阶段。此阶段\(R_{{DS}\_ON}\)继续减小,\(V_{{DS}\_ON}\)有少许变化。

MOSFET关闭时,

  1. \(V_{GS}\)从栅极驱动器输出电压下降到\(V_{{GS}\_plateu}\) ,此时沟道电流和漏源电压没有任何变化。此段时间计为\(t_4\)
  2. \(V_{GS}\)保持在\(V_{{GS}\_plateu}\) ,在这段时间内沟道电流保持不变,而漏源电压从\(V_{{DS}\_{ON}}\)上升到接近电源电压(感性负载?)。此段时间计为\(t_5\)
  3. \(V_{GS}\)从\(V_{{GS}\_plateu}\)下降到\(V_{{GS}\_th}\) ,沟道电流从工作电流迅速下降到零,快速的\(\frac{di}{dt}\) 导致\(V_{DS}\)出现上冲。此段时间计为\(t_6\)
  4. \(V_{GS}\)从\(V_{{GS}\_th}\) 下降到零,此过程对沟道电流和漏源电压没有任何影响,故一般不做研究

相应的波形如下所示,

\(t_1\)以及\(t_2\)时间段由于\(V{_{DS}}\)不变,可等效为一阶RC电路充电过程,相应的时间计算如下,

\(t_1=R_GC_{iss}ln(\frac{1}{1-\frac{V_{GS\_TH}}{V_{GS}}})\)

\(t_2=R_GC_{iss}ln(\frac{1}{1-\frac{V_{GS\_plateu}}{V_{GS}}})\)

在\(t_3\)时间段,由于漏源电压的变化导致\(C_{GD}\)变化,其精确时间由\(Q_{GD}\)来计算,

\(t_3=R_G\frac{Q_{GD\_D}}{V_{DS\_D}}\frac{V_{DS}}{(V_{GS}-V_{GS\_plateu})}\)

简单估算则如下式给出,

\(t_3=R_GC_{GD}(\frac{V_{DS}}{V_{GS}-V_{{GS}\_plateu}})\)

同样的,各关断时间由以下式子给出,

上式里面\(t_5\)仅仅是简单的估算。准确值由下式给出,

\(t_5=R_G\frac{Q_{GD\_D}}{V_{DS\_D}}\frac{V_{DS}}{V_{GS\_}}\)

在芯片规格书中,一般用上升时间,下降时间,开启延迟等量来表示MOSFET的开关特性,它们和上述式子的关系如下,

\(t_{d\_on}=t_2\)

\(t_r=t_3\)

\(t_{d\_off}=t_4\)

\(t_f=t_5\)

由上面的分析不难看出,某一个开关管关闭到另一个开关管打开需要的最小时间间隔,也就是死区时间为,

\(T_{dead}=t_4+t_5+t_6-t_1\)

上面的式子仅仅考虑半桥MOSFET开关过程本身需要的最小死区时间。实际应用中,还要考虑驱动器的传播延迟失配时间\(t_{pd\_mismatch}\),输入PWM信号的skew,\(t_f\),\(t_r\)等影响因素。

 

利用buck芯片生成负电压电源轨

文章内容主要参考TI的AN,少许自己的一些看法。

将buck芯片外部电路连接稍加改动,buck芯片也可以如buck-boost芯片一般配置成输出负压的inverting电路形式。具体连接如下图所示,

此时,芯片同步整流MOSFET的源端(或者外接续流二极管的正极),以及芯片的接地引脚(AGND, PGND etc.)成为负压输出端。功率电感的输出端直接接地。输出电容还是如buck电路一般跨接在输出功率电感和续流二极管之间。输入滤波电容则需要跨接在电源输入和输出功率电感端。

对电路性能参数的影响:

  1. 由于原来的芯片地变成了负压输出端,芯片的耐压值和最大输入输出的关系变为\(V_{in\_max}+|V_o|<=V_{IC\_max}\),式中,\(V_{IC\_max}\)为芯片耐压限值。
  2. 占空比和输入输出的关系,依据电感电流平衡法,不难得到:\(D=\frac{|V_o|}{V_{in}+|V_o|}\)
  3. 大部分芯片基于电感峰值电流检测法来实现过流保护以及回路补偿等,buck芯片原先工作于CCM模式,平均输出电流就等于流过电感的平均电流。电路改为inverting模式后,输出电流不再连续(虽然流过电感的电流仍然连续)。从输出回路看,仅在同步整流器件导通的时间段内电感电流才给负载供电,其时间占比为\(1-D\),其中\(D\)为buck芯片工作时的占空比。由此可得最大输出电流和芯片规格的关系: \(I_{max}<I_{ic\_max}\times\frac{V_{in\_min}}{V_{in\_min}+|V_o|}\)
  4. 为了芯片稳定工作而配备的芯片退耦电容现在跨接在输入输出端,间接成为了输入到输出的高频通路。同时,芯片的地电流也构成了输入输出的通路。
  5. 反馈电阻的设定。因为芯片的参考地变成了输出负电压端,而原来的输出端成为了系统地,输出和反馈电阻的关系为:\(|V_o|= V_{REF}\times\frac{R_1+R_2}{R_2}\)

需要指出的是,在芯片自身看来,它仍然工作于buck模式(CCM 或者DCM),只不过名义输入电压变为\(V=V_{in}+|V_o|\),名义输出电压为\(|V_o|\)。熟悉了之后,我们完全可以按名义输入输出关系来设计一款”buck”电路(需要注意输出电流能力的变化)。这也是这款电路的另一好处,无需过多考虑环路稳定性和补偿问题。

reference:

1.creating an inverting power supply using peak current mode buck converter, TI – SLVAE10

2.using a buck converter in an inverting buck-boost topology, TI

 

设计实例

设计目标:设计一款锂电池供电的负电压产生电路,输入由四节串联的锂电池供电,输入电压范围定为12V~17V,输出电压为-15V,输出最大电流500mA。芯片选用LMR36015,工作频率为1MHz。

电感选择,如若芯片能稳定工作在CCM以及DCM模式(或者芯片可以动态调节开关频率),则感量的选择多依据纹波电流占最大输出平均电流的百分比来确定,如若不想让芯片工作在DCM模式,则可以依据电路最小负载电流确定感量最小值。这里假设最小负载电流为50mA,通过前面的换算公式,此时流过电感电流的最大值和负载电流关系为

\(i_o=\frac{i_p(1-D)}{2}\)

由伏秒平衡,我们还有,

\(i_p=\frac{|V_o|(1-D)T}{L}\)

求得最小电感值要求为,

\(L_{min}\ge\frac{V_o(1-D)^2T}{2i_o}\)

上式右侧式子在D取最小值时达到最大值,也就是符合各种输入条件要求的最小感量,带入计算得\(L_{min}=42.3uH\),取标准值47uH.

输出电容的选取涉及电源的瞬态响应需求,纹波需求,这里我们参考芯片规格书的建议,选择三个22uF的电容并联作为输出电容。具体容量可以依据后续测试来调整。

输入电容,规格书里面讲的很详尽,这里我们设计选取两颗4.7uF陶瓷电容,两颗100nF陶瓷电容,以及一颗220uF电解电容。

为了满足系统对电源噪声,纹波更苛刻的需求,我们还可以在DC-DC的输出端再串接一级线性稳压级。选择PSRR频率上限高的LDO或者三端稳压器有利于抑制DC-DC的噪声成分。

 

TI的几款音频运放参数对比

收购BB以及NS的缘故,现在的音频领域TI是当之无愧的集大成者

OPA827 OPA627 OPA1641 OPA1611 LME49710
Input stage structure JFET JFET JFET Bipolar Bipolar
Input offset voltage 0.075mV 0.28mV 1mV 0.1mV 0.05mV
Input noise voltage(1KHz) 3.8nV/sqrt(Hz) 5.6nV/sqrt(Hz) 5.1nV/sqrt(Hz) 1.1nV/sqrt(Hz) 2.5nV/sqrt(Hz)
1/f corner frequency 20Hz 80Hz 20Hz 20Hz N.A.
Input current noise(1KHz) 2.2fA/sqrt(Hz) 2.5fA/sqrt(Hz) 0.8fA/sqrt(Hz) 1.7pA/sqrt(Hz) 1.6pA/sqrt(Hz)
THD+N(%) 1KHz/1Kohm 0.00004 0.00003 0.00005 0.000015 0.00003
Slew rate(V/us) 28 55 20 27 20
Gain Bandwidth(MHz) 55 16 11 40 55

Vishay Dale电阻

Vishay的达尼系列电阻一直是高端电阻的标杆,前几天闲鱼买到一批报废品电阻,特地拆开看看正品dale电阻和次品的区别。

将一枚RN60电阻的外覆层去掉,连接引脚的金属帽去除之后,就有如下的电阻芯本体,坚硬的陶瓷基体(在用斜口钳拆解电阻的过程中,斜口钳的硬度明显不敌电阻芯的硬度,斜口钳刀刃直接损坏)上用金属溅射工艺覆盖了一层薄薄的合金电阻层,然后经由激光开槽修正为目标阻值。

次品电阻阻值和印刷阻值偏差太多,应该是激光开槽站淘汰的次品

RN55电阻芯

 

低噪声晶体管噪声系数及测量

噪声系数(noise figure, Harald T. Friis introduced in 1944)经常用来衡量低噪声放大器(LNA)或者输入级晶体管的噪声性能,其定义如下:

\(Noise Figure(NF) =10\lg{\frac{\frac{P_{si}}{P_{ni}}}{\frac{P_{so}}{P_{no}}}}\)

等于输入信噪比除以输出信噪比的对数,单位为dB,故而如果是功率比值,前面乘以系数10,如果是电压比值,乘以20

其实,最开始时候是噪声因子(noise factor)的概念 (Introduced in 1942 by Dwight O. North)

 \(Noise Factor(N) =\frac{\frac{P_{si}}{P_{ni}}}{\frac{P_{so}}{P_{no}}}\)

热噪声,由于导体/导电媒介中载流子的不规则热运动导致的宏观电压波动,其值和绝对温度,测量带宽,和阻值相关

\(V_{no}=\sqrt{4KTRB}\)    

\(K: Boltzmann\;Constant =1.38×10^{-23}\)  K: 绝对温度(K) B:测量带宽(Hz)

在射频系统中,输入输出匹配通常以最大功率传输原则来设计,即后级的输入阻抗为前级输出阻抗的共轭复数,考虑纯电阻情形,则最大功率传输条件下,负载阻抗等于前级输出阻抗。满足此条件时,任意源电阻产生的热噪声电压在负载上的理论功率为

\(P=KTB\)

其值与源电阻阻值无关,而仅与绝对温度相关。故而,在相同带宽下,任意噪声源(或电路单元)可抽象出一个值:等效噪声温度。考察一个功率增益为A的待测单元,在接入匹配的输入电阻之后,在输出端测量其总噪声输出,输出包含两部分,一部分为源匹配电阻热噪声经电路放大后的输出,另一部分为待测单元产生的噪声。将输出噪声功率除以增益后,我们得到输入端的总等效噪声功率,将它带入电阻热噪声公式,可以得到一个温度T,它一般高于测量环境温度(通常为298K),其差值即为待测单元的等效噪声温度。

假设考察的放大器单元是一个线性系统,功率增益为A,则可以根据噪声系数的定义得到其另一种表达方式

\(NF=10\lg{\frac{\frac{P_{si}}{P_{ni}}}{\frac{P_{so}}{P_{no}}}}=10\lg{\frac{P_{no}P_{si}}{P_{ni}P_{Pso}}}=10\lg{(\frac{P_{no}}{AP_{ni}})}\)

即噪声系数表述为总输出噪声功率除以输入电阻热噪声和电路增益的乘积

噪声系数表征的局限性

1>增大输入匹配电阻的阻值,噪声系数计算值会下降,虽然输出总噪声增加了

2>噪声系数的定义对纯电抗性信号源无效

3>当电路本身贡献的噪声仅为信号源热噪声的一小部分时,计算电路的噪声系数或比较两个电路的噪声系数可能得到不精确的结果

4>在某一源阻抗下得到的噪声系数无法用来计算不同源阻抗下的电路噪声系数。因为源阻抗不同,则源电阻产生的噪声值不同,电路产生的噪声成分也有可能与源阻抗相关

运算放大器的噪声模型

同相和反向放大器的噪声模型如下(源自TI运放OPA1612 datasheet)

*作为对比,1Kohm电阻常温下的热噪声密度为\(e_n=4.07nV/\sqrt{\text{Hz}}\),100Ohm电阻的热噪声密度为\(e_n=1.29nV/\sqrt{\text{Hz}}\)

以反相放大器为例,放大倍数以\(\beta\)表示,我们有如下简化表达式,

\(E_o^2=(\beta+1)^2e_n^2+4KTR_2(\beta+1)+(i_nR_2)^2\)

考察一个放大倍数为10,100的放大器,反馈电阻R2假设为10K,运放分别选择为OPA1612,OPA827,带宽假设为20~20KHz(噪声密度数值选取1KHz值作为参考值),总输出噪声有效值分别为:

运放/放大倍数 1 10 100
OPA1612 3.54uVrms 6.72uVrms 24.1uVrms
OPA827 2.81uVrms 8.67uVrms 60uVrms
LT1028 2.93uVrms 6.32uVrms 22uVrms

依据上述噪声模型以及一些典型数据计算后有如下结论

1> 对于低阻信号源或者JFET输入型运放,低噪声运放的等效输入噪声电阻一般在数百欧姆以内,好的运放可以低至50Ohm以内

2> JFET输入运放的电流噪声成分远小于电压噪声,除非应用于输入阻抗极高或者放大倍数极高的电路,一般电流噪声成分可以忽略

晶体管噪声性能评估

和运放类似,晶体管等效噪声模型也由折合到输入端的电压和电流噪声源组成,故而晶体管的噪声系数由下述公式表示,

\(NF=10\lg{\frac{e_n^2+4KTR_s+(i_nR_s)^2}{4KTR_s}}\)

\(e_n\text{:= Noise Voltage of the Transistor referred to the input}\)

\(i_n\text{:= Noise Current of the Transistor referred to the input}\)

\(R_n\text{:= Source resistance}\)

由前述NF的另一种表述,可以看出,只要测量得到放大器单元输出端的总噪声功率(电压),以及放大器单元的增益,就可以根据源阻抗数值计算得出噪声系数。不过,要在极窄频带实现微小信号测量并非易事。通常,精确的测量晶体管的噪声系数曲线需要专业仪器才能实现。这里,我们用测量某一频带内晶体管输出总噪声的方法来评估晶体管的噪声性能

参考电路如下,

实际电路如下图所示,元器件的选择应该以最低噪声为目标。譬如电容选用钽电容,电阻选择vishay金属膜电阻,供电电源选择电池供电,整个测试设备放在多层屏蔽盒杜绝环境电磁波干扰。

忽略晶体管输出端电阻的热噪声和运放的噪声分量之后,输出端测量得到的噪声为源电阻经放大之后的热噪声分量以及晶体管贡献的噪声分量。如果将晶体管的噪声等效到输入端,我们可以得到一等效输入噪声电压。其值的大小可以用来客观的评价晶体管在指定频带内的噪声性能。以晶体管基极为输入参考点,可以求得电路的电压增益为:\(g_m*R_f=\frac{I_c}{V_t}*R_f\),将\(R_E\)置换为恒流源即可得到确定的增益。令\(I_c=1.3mA\;,R_f=10\,K\,ohm\),则总电压增益为500。由前述运放噪声表达式不难看出,在\(R_f\)一定的情况下,运放电压增益越小,电阻贡献的总热噪声越小。

测试数据

用面包板搭建了一个简单测试电路,因为使用9V层叠电池供电的关系,Rc由10K改为2.2K,Rs设为332 Ohm,静态电流设置为1mA。室温下,如果假设待测BJT的输入阻抗远大于332 Ohm,则当带宽限制为22Khz的时候,输出端总噪声由电阻贡献的分量约为133uVrms。挑选了几款音频用三极管,实际测试结果如下,

DUT型号 2SC2240GR(白字) 2SC2240GR(激光) 2SC2240BL(激光 KSC3200GR 2SC2229 2SC2705 MPSA42 KSC1845
总输出噪声 180uVrms 165uVrms 185uVrms 180uVrms 165uVrms 200uVrms 145uVrms 200uVrms

*测试条件:室温(30C),AP525,带宽:10·22.4KHz,仪器底噪+运放底噪:~5uVrms

从上述噪声测试结果得出的一些可能的推论:

  1. 同一型号管子,放大倍数越大,噪声越大。可能的原因是,在晶体管版图结构,制作工艺一致的前提下,放大倍数大的管子,基区相对掺杂浓度较低,基区扩散电阻会稍大,故而噪声较高。
  2. 相同工艺下,耐压越高的管子,噪声越小。

uPC1237 喇叭保护电路测试

最近设计功放想外加一个喇叭保护电路,额外增加一些安全性。不过搜索之后发现选择并不多,

1> 集成喇叭保护电路,广泛使用的是upc1237,不过是很老的型号,并且已经停产。

2> 自行设计喇叭保护电路,纯硬件实现的话涉及到精密全波整流电路,延时电路,滞回比较器等模块,撇开设计的复杂度,硬件的可靠性也是一个问题。纯软件实现的话可以采用工控用MCU,可靠性较好,外设资源丰富,利用多路ADC采样电压信号,软件算法分析直流成分,不过似乎已经超出了我的能力范围。

最后选的第一条路,依据datasheet设计了电路,并打样。淘宝上买了两片号称全新的upc1237,简单测试发现功能基本正常,也同时记录下测试观察到的一些现象,

1> 按照datasheet的推荐,在AC电压30Vrms左右时AC_DET电阻为18K,测试发现,在AC_IN输入3.7V的直流电压即可闭合继电器,3.6V或者以下值继电器断开。测量芯片pin4的电压,闭合/断开电压基本上符合datasheet的规定,在0.74V左右。有mV级的滞回电压。故而,如果把它仅用作AC掉电检测的话按datasheet的推荐阻值设计电路即可,如果设计目标是AC_IN低于某一值就断开喇叭的话,需要重新设计R8的阻值。经测量可以发现,在输入pin4输入电压0.74V左右时,输入电阻约为5.76K—输入电阻呈现非线性,输入电压越高时,输入电阻越低,可以推断pin4输入为一双稳态电路—可以依据此数据计算R8的阻值。不过此种设计仅可应用于AC_IN是独立绕组的情形,如果AC_IN取自功放绕组,要避免功放重载时拉低AC_IN误触发掉电保护。

2> 设计将OC_DET引脚用作过温保护,不过实际测试发现,如果在上电时刻过温保护输入为高电平信号时(温度过高),继电器会出现短暂闭合的趋势,用示波器观察继电器控制引脚发现输出电压有一个dip…

3> 开机延迟由pin7的电阻和电容决定,同时这个延迟也决定了AC_DET 引脚电压达到开启阈值到继电器闭合的时间延迟

4> 喇叭offset检测分压电阻分别为120K/120K, 88.7K的情况下,单声道输入1.5V的直流电压,芯片会在15~27S之后切断继电器,输入2.0V电压,芯片会在8s左右切断继电器。

5> pin2到地的电容有人认为是为了提高左右声道分离度。实际计算发现,在没有电容时,如果假设功放输出电阻为1Ohm,左右声道分离度可以也达到112dB….

 

Gen8 基础知识

以下内容大部分源于网络

Gen8的原配一分四就是mini-sas转四个sata,分出来的就是SATA接口,此机器明确声明不能使用SAS硬盘,只能使用SATA硬盘(自己改硬件之后当然可以用SAS)。

实际上,笼子的1、2位置是sata3,最大理论速度600MB/s;3、4是sata2,最大理论速度300MB/s;主板上的是sata5,也是sata2。
用一个2.5-3.5架子就可以将SSD固定在1号位的抽取盒中,就可以了。

安装windows server系统

方法 1> 冷启动后根据屏幕提示按F12,进入intelligent provision 安装系统,这个方法的好处是安装过程中IP会自动为系统安装驱动,如果系统在支持列表的话

方法2> 用rufus或类似软件制作启动U盘,进入BIOS修改启动顺序为U盘优先,用U盘安装系统。系统安装好之后需要在iLO界面挂载HP的SPP(HP Service Pack for ProLiant) 安装驱动,所幸基本也是一键操作。

方法3> 用iLO挂载光盘镜像,然后安装?没有试验过

tips:

  1. iLO界面需要购买license之后才能激活高级功能(advanced feature),譬如非常有用的远程桌面功能
  2. iLO提供的远程桌面最好用IE浏览器打开,chrome或者edge浏览器或许无法打开(和环境设置相关)
//this is the sample code
for(i=0;i<100;i++)
   {
    a+=i;
   }

 

 

 

 

 

通过Marking查找IC型号的一些Tips

  1. 查找芯片datasheet的传统数据库网站现在也提供了通过marking查找芯片型号以及资料的选项,如www.alldatasheet.com 选marking即可
  2. 第三方的marking数据库,如www.smdmark.com 不过数据库资料不是很齐全
  3.  https://www.ti.com/packaging/docs/partlookup.tsp TI作为芯片届的Walmart,涉足芯片领域无人能及
  4.  万能宝,在淘宝输入具体的marking信息 再打上丝印二字,可以搜索到不少芯片信息
  5.  搜索引擎输入marking信息查找

在上述地方搜索到相关资料后,还需要仔细筛选,因为很可能多个不同供应商的不同类型功能的芯片会对应同一个marking信息,这时候通过芯片尺寸封装,以及自行分析出的芯片功能信息来做进一步分析。

有时候芯片会有好几行的marking信息,分别对应型号,生产日期等,需要多次尝试才能找到正确的信息。

晶体管Hoe测量

测量共发射极组态时晶体管的Rce

  1. 2SC3423,输出阻抗约14K Ohm(@10mA)。用作VAS时最好采用共基极组态(共基极组态输出电阻约为共发射极组态的β+1倍),管子的优点是Cre很小,Vbc零偏时大约为8.5pF左右。缺点是静态工作电流超过10mA时Hfe开始下降,超过20mA时急剧下降。
  2. 2SC3421,输出电阻约为28~33K左右(@10mA),此管子缺点是Cre偏大,Vbc零偏时大约有61pF,优点是hfe在Ic超过200mA时仍保持不变
  3. 2SC2705,输出电阻约为50K Ohm(@3.4mA),由于Rce=VA/ICQ,可以推测在10mA时输出电阻约为17KOhm左右。