This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:采用 MSP430FR2355的脉动式血氧计

Guru**** 1821780 points
Other Parts Discussed in Thread: MSP430FR2355, MSP430FR2353
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/911398/msp430fr2355-pulse-oximeter-with-msp430fr2355

器件型号:MSP430FR2355
主题中讨论的其他器件: MSP430FR2353

大家好、

我正在尝试使用 MSP430FR2355 Launchpad 实现脉动式血氧计设计。 我一直关注参考设计文档 SLAA274和 SLAA458。 我还看到了另一个 TI 文档 SLAA897、其中的设计 非常高效、只需很少的外部组件。  根据下面显示的 SLAA897的设计

Nellcor 兼容 SPO2探头引脚图,引脚2是 IRLED,引脚3是红色 LED,引脚6和7是 GND。

引脚9是光电二极管阴极的输出、引脚5是跨阻偏移引脚。  

根据 SLAA897中的设计、在何处连接引脚5?

此外、我应该从外部将 OA0输出连接到 OA2反相输入、还是有一种方法可以通过软件在内部连接它?   

此外、是否还有 SLAA897文档中显示的任何设计原理图和参考代码?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mourya、  

    MSP430FR2355具有内置 DAC、可为内置 OPA 生成偏置偏移(DAC 和 OPA 都是 MSP430FR2355中 SAC 的一部分)。 因此、无需将跨阻偏移引脚的引脚5连接到 MSP430FR2355。  

    无需从外部将 OA0输出连接到 OA2反相输入。 您可以通过设置 SAC2PGA.MSEL=11b 和 SAC2OA.NSEL=01b 在内部进行连接。  

    在 MSP430FR2353/2355中、SAC0在内部与 SAC2相连、SAC1在内部与 SAC3相连。 SAC 输出也在内部连接到内置比较器和内置 ADC12位。   

    有关级联 SAC 的详细信息/设置,请参阅应用报告“如何使用 MSP430TmMCU 中的智能模拟组合”(slaa833)中的图11。 您还可以参阅 MSP430FR2355/2353数据表中的图6-1 (eCOMP0、SAC0、SAC2互连)。 这两个文档都详细介绍了 SAC 与其他外设的内部连接。  

    关于 SLAA897的原理图、我们没有构建该板。 但我们确实有一些内部原理图用于内部测试。 如果您有兴趣、请联系 TI 销售人员并咨询 MSP430 BU 团队。  

    谢谢、  

    Lixin  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Lixen、您好!

    非常感谢您的回复、并帮助我消除疑虑。  我注意  到的一点是、在 SLAA897文档(第2.2节)中、要将 SAC2配置为反相 PGA 模式、设置应为(PSEL=01、NSEL=01、MSEL=00)。 但我认为、这是我们在外部将 OA0输出连接到 OA2负 I/P 的时候 但是、正如您所说的、对于  SAC2、我必须使用 PSEL=01、NSEL=01、MSEL=11。

    对于脉动式血氧计设计、我需要对放大器级(OA0O 和 OA2O)的输出进行采样、但只有 SAC0和 SAC1输出在内部连接到 ADC 输入。 对于 SAC2、我必须 配置 SAC2的输出引脚并将其从外部连接到 ADC 输入引脚。  

    根据上述理解、我已配置 SAC、ADC 和计时器、如下所示。

    //配置参考模块
    PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    PMMCTL2 = INTREFEN | REFVSEL_2; //启用内部2.5V 基准
    while (!(PMMCTL2 & REFGENRDY)); //轮询直至内部基准稳定
    
    
    
    
    /******* SAC0配置为 TIA **** /
    P1SEL0 |= BIT2; //选择 P1.2 OA0-引脚功能
    P1SEL1 |= BIT2; //选择 P1.2 OA0-引脚功能
    
    SAC0DAC = DACSREF_1; //选择2.5V 内部 Vref 作为 DAC 基准
    SAC0DAT = 0x0FFF; //将 SAC DAC 数据设置为2.5V
    SAC0DAC |= DACEN; //启用 DAC
    SAC0OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_0;//选择正输入作为 DAC、选择负引脚输入作为光电二极管
    SAC0PGA |= MSEL_0; //反相 PGA 模式
    SAC0OA &=~OAPM; //选择高速和高功率模式
    SAC0OA |= SACEN + OAEN; //启用 SAC 和 OA
    
    /********* SAC2配置为反相 PGA ***** /
    P3SEL0 |= BIT1; //选择 P3.1 OA2输出功能
    P3SEL1 |= BIT1; //选择 P3.1 OA2输出功能
    
    SAC2DAC = DACSREF_1; //选择2.5V 内部 Vref 作为 DAC 基准
    SAC2DAT = 0x0FFF; //将 SAC DAC 数据设置为2.5V
    SAC2DAC |= DACEN; //启用 DAC
    SAC2OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_1;//选择正输入作为 DAC、选择负引脚输入作为 OA0的 O/P
    SAC2PGA |= GAIN0 + GAIN2 + MSEL_3;//设置增益= 16的反相 PGA 模式
    SAC2OA &=~OAPM; //选择高速和高功率模式
    SAC2OA |= SACEN | OAEN;//启用 SAC 和 OA
    
    /****** SAC3配置为 DAC 输出**** /
    P3SEL0 |= BIT5; //选择 P3.5 OA3O 功能
    P3SEL1 |= BIT5; // OA 用作 DAC 的缓冲器
    
    SAC3DAC = DACSREF_1; //选择2.5V 内部 Vref 作为 DAC 基准
    SAC3DAT = 3340; //将 SAC DAC 数据设置为初始值
    SAC3DAC |= DACEN; //启用 DAC
    SAC3OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_0;//选择 DAC 模式
    SAC3PGA |= MSEL_1; //将 OA 设置为缓冲模式
    SAC3OA &=~OAPM; //选择高速和高功率模式
    SAC3OA |= SACEN | OAEN;//启用 SAC 和 OA
    
    /******* SAC1配置 AS DAC 输出******** /
    P1SEL0 |= BIT5; //选择 P1.5 OA1O 功能
    P1SEL1 |= BIT5; // OA 用作 DAC 的缓冲器
    
    SAC1DAC = DACSREF_1; //选择2.5V 内部 Vref 作为 DAC 基准
    SAC1DAT = 3340; //将 SAC DAC 数据设置为初始值
    SAC1DAC |= DACEN; //启用 DAC
    SAC1OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_0;//选择 DAC 模式
    SAC1PGA |= MSEL_1; //将 OA 设置为缓冲模式
    SAC1OA &=~OAPM; //选择高速和高功率模式
    SAC1OA |= SACEN | OAEN;//启用 SAC 和 OA
    
    /*** ADC 配置*** /
    
    ADCCTL0 &=~ADCENC; //禁用 ADC
    ADCCTL0 |= ADCSHT_4 | ADCMSC | ADCON;//0000010010010;64个 ADCLK 周期、MSC 位高电平、ADC 打开
    
    ADCCTL1 |= ADCSHP | ADCSHS_1 | ADCCONSEQ_1;//0000010010010010010;
    ADCCTL2 &=~ADCRES;//清除分辨率
    ADCCTL2 |= ADCRES_2;//12位分辨率
    ADCMCTL0 |= ADCSREF_1|ADCINCH_1|ADCINCH_3;// OA0输出作为 A1 ADC 输入,VR+= VREF+,OA2输出从外部连接到 A3 ADC 输入
    ADCIE |= ADCIE0;//启用转换完成中断
    ADCCTL0 |= ADCENC|ADCSC;//启用转换并开始转换
    
    /******** 配置计时器 /
    
    TB0CTL = TBSSEL_ACLK + TBCLR;//ACLK 和复位定时器
    TB0CCTL1 = OUTMOD_2;//切换和复位
    TB0CCTL0 = CCIE;//中断使能
    TB0CCR0 = 31;//采样率为512SPS
    TB0CCR1 = 10;//在采样前留出足够的时间使信号变得稳定
    TB0CTL |= MC_1;//向上计数模式
    
    
    //计时器 B0中断服务例程
    #pragma vector=TIMER0_B0_vector
    __interrupt void Timer0_B0_ISR (void)
    {
    int I;
    
    if (SAC3OA & SACEN))//检查 VSLED 是否在
    
    {
    SAC3DAC |= DACEN;
    SAC3DAT = VS_LED_LEVEL;
    SAC0DAT = VS_dc_offset;
    IS _IR = 0; // IR LED 关闭
    
    IR_SAMPLE = ADCMEM0; //读取 IR LED 结果
    I = ADCMEM0;
    //启用下一个转换序列。
    //序列由 TA1启动
    ADCCTL0 &=~ADCENC;
    ADCCTL0 |= ADCENC;
    
    ................................. 

    ,根据 Slaa458的参考代码,在计时器 ISR 中,它首先检查 DAC 输出是否连接到 IR LED。 如果它被连接、它将关闭 IR 并打开 VS LED、反之亦然。  

    在新设计中,两个 LED 都有自己的 DAC 输出,因此,我是否需要交替检查 SAC3和 SAC1的开/关状态以一次切换两个 LED? 我是说我可以像下面的行那样编写代码

    if (((SAC3OA 和 SACEN))// 检查红外 LED 是否亮起、而不是 slaa458中使用的 IF ((DAC12_0CTL 和 DAC12OPS))?

    我希望我的代码方向正确。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Mourya、  

    很抱歉耽误你的回答。  

    [引用 user="Sumit Mourya"> 我注意到的一件事是、在 SLAA897文档(第2.2节) 中、要将 SAC2配置为反相 PGA 模式、设置应为 (PSEL=01、NSEL=01、MSEL=00)。 但我认为、这是我们在外部将 OA0输出连接到 OA2负 I/P 的时候 但是、正如您所说的、对于  SAC2、我必须使用 PSEL=01、NSEL=01、MSEL=11。[/引述]

    由于 OA2O 未在内部连接到 ADC12、OA0O 为、因此我建议使用 OA2作为光电二极管电流至电压放大器、并使用 OA0作为第二级负输入放大器。 则无需从外部将 OA 输出引脚连接到 ADC 输入引脚。 SAC0和 SAC2都有其各自的 DAC。 因此、您可以将 SAC0的 DAC 输出基准电压配置为 SAC0正引脚、并将 SAC2的 DAC 输出基准电压配置为 DAC2至 SAC2正引脚。 下面是 SAC2和 SAC0的配置代码供您参考。  

    /***** 将 SAC2引脚配置为 TIA (I-V 转换)
    P3SEL0 |= BIT1 + BIT2 + BIT3;
    P3SEL1 |= BIT1 + BIT2 + BIT3;

    SAC2DAC = DACSREF_1;//选择内部 Vref (1.5V、2.0V、2.5V)作为 SAC2 DAC 基准
    SAC2DAT = DACDATA100;//设置 SAC2 DAC 输出= 0.1V
    SAC2DAC |= DACEN;//启用 SAC2 DAC

    SAC2OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_0;//选择正负输入:正 DAC、负 P3.2
    //SAC2OA |= OAPM;//选择低速和低功耗模式-进行测试
    SAC2OA |= SACEN + OAEN;//启用 SAC2和 OA2

    /***** 将 SAC0引脚配置为 PGA 反相放大器模式
    P1SEL0 |= BIT1 + BIT2 + BIT3;
    P1SEL1 |= BIT1 + BIT2 + BIT3;

    SAC0DAC = DACSREF_1;//选择内部 Vref (1.5V、2.0V、2.5V)作为 SAC3 DAC 基准
    SAC0DAT = DACDATA850;//设置 SAC0 DAC 输出= 0.85V
    SAC0DAC |= DACEN;//启用 SAC0 DAC

    SAC0OA = NMUXEN + PMUXEN + PSEL_1 + NSEL_1;//选择正负输入:正 DAC、负配对 OA 输出
    SAC0PGA = MSEL_3;//将负输入设置为配对的 OA 输出- SAC2
    //SAC0PGA |= GAIN0 + GAIN1;//将 PGA 增益设置为4
    SAC0PGA |= GAIN1;//将 PGA 增益设置为2
    // SAC0OA |= OAPM;//选择低速和低功耗模式-进行测试
    SAC0OA |= SACEN + OAEN;//启用 SAC1和 OA1

    [引用 USER="Sumit Mourya">对于脉动式血氧计设计、我需要对两个放大器级(OA0O 和 OA2O)的输出进行采样、但只有 SAC0和 SAC1输出在内部连接到 ADC 输入。 对于 SAC2、我必须 配置 SAC2的输出引脚并将其从外部连接到 ADC 输入引脚。  [/报价]

    如果您需要对 OA0O 和 OA2O 的输出进行采样、则必须从外部将 OA2O 引脚连接到 ADC 输入引脚。  

    [引用用户="Sumit Mourya"]

    在新设计中,两个 LED 都有自己的 DAC 输出,因此,我是否需要交替检查 SAC3和 SAC1的开/关状态以一次切换两个 LED? 我是说我可以像下面的行那样编写代码

    if (((SAC3OA 和 SACEN))// 检查红外 LED 是否亮起、而不是 slaa458中使用的 IF ((DAC12_0CTL 和 DAC12OPS))?

    [/报价]

    同意。 您无需检查 SAC3和 SAC1的开/关状态。 以检查是否启用了 SAC。 您的想法是正确的。  

    谢谢、  

    Lixin  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Lixen、

    我还想问的是、SAC0 +ve 输入连接到 DAC、而不是 SPO2传感器 DB9连接器。

    我应该保持多大的价值  SAC0DAT ? Since DAC value of other SAC's are changing according to the SPO2 Signal But for SAC0 the DAC value needs to be fixed?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sumit、  

    如果您按照 slaa897进行连接:SAC0连接到光电二极管、SAC2作为第二个放大 器、并且光电二极管感应信号动态范围稳定、则 SAC0_DAC 可以是固定值。 SAC2_DAC 可以是动态的、以跟踪光电二极管信号的直流分量。  

    谢谢、  

    Lixin