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.

[参考译文] ADS7142:带阈值监控的自主模式

Guru**** 2538930 points
Other Parts Discussed in Thread: ADS7142

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/641879/ads7142-autonomous-mode-with-threshold-monitoring

部件号:ADS7142

尊敬的各位:

我刚刚开始使用 TMR的ADS7142,以便在设备由电池供电时尽可能节省电量。

问题是,我需要使用警示引脚将UC从最深睡眠模式唤醒。

特别是在睡眠模式下,我处于自主模式,仅在CH0上激活阈值监测。

我的想法是当输入超过模拟输出上的零值时唤醒UC (在高分辨率模式下,零值约为2.2万)

第一个问题:我是否必须将阈值设置为12位而不是高分辨率模式使用的16位(值>>>4)? 我想是的,因为寄存器是12位。

第二个问题:ADS7142是否可重新触发?

更好的是,如果我越过阈值,激活中断,警报引脚将永远保持低电平,或者当我通过写入1重置锁定标志时,它将恢复为高电平?

返回到高时,该值需要超出阈值才能再次启动POST警报模式..........

否则,我需要在报警引脚和UC的INT0之间串联一个电容器,以便在中断引脚上生成下降边缘,但保持报警引脚与上拉电阻器断开连接,因为电容器。 在这种情况下,可以保证功耗,避免警报消耗上拉电流。

如果我设置了这样的值

     writeADCR뗇 볇(DWC_HTH_CH0_MSB_ADDR,(2.2万 >> 12)& 0x0F);            // CH0的高阈值中最高有效位数    
     writeADCR뗇 볇(DWC_HTH_CH0_LSB_ADDR,(2.2万 >> 4)& 0xFF );//             CH0阈值上限的最低有效位数
     writeADCR뗇 볇(DWC_LTH_CH0_MSB_ADDR,(2.2万 >> 12)& 0x0F);            // CH0阈值下限的4位最高有效位  
     writeADCR뗇 볇(DWC_LTH_CH0_LSB_ADDR,(2.2万 >> 4)& 0xFF );//             CH0的低阈值最低有效位
     writeADCRegister (DWC_HYS_CH0_ADDR,200 >> 4);                                            // CH0 = 5°的两个比较器滞后

我能否检查销钉是否超过2.2万的值?

提前感谢

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

    我正在研究这件事,并将很快回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Evan。

    目前,为了更精确地进行配置,我已经配置了如下ADS7124:

    void setupADC (字节模式)

    //模式= 1自治模式 模式= 2高精度模式(高速)
    开关(模式)

    Case Auto (自动案例):// TCC= k x nCLK x tOSC --> 2 x 18 x 95.2 Us =3,42 ms
    writeADCRegister (abort_sequence_adDR,0b0.0001万); // TI推荐
    writeADCRegister (OPMODE_SEL_ADDR,0b0.011万); //启用自动序列的自主监护模式
    writeADCRegister (AUTO_SEQ_CHAN_ADDR,0b0.0011万); //为自动排序选择了CH0和CH1
    writeADCRegister(OSC_SEL_ADDR, 0b0.0001万); //设备使用低功率振荡器
    writeADCRegister(nCLK_SEL_ADDR, 0b0万); // nCLK设置为0 (=18)(TCC≃3.427 ms)
    writeADCRegister(data缓冲器_OPMODE_ADDR, 0b0.011万);//警报后数据模式
    writeADCRegister (alert_DWC_EN_ADDR,0b0.0001万); //启用数字窗口比较器
    writeADCRegister (alert_Chen) ADDR,0b0.0001万); //仅为CH0启用警报

    writeADCRegister (DWC_HTH_CH0_MSB_ADDR,(maxSIN >> 12)& 0x0F);
    writeADCRegister(DWC_HTH_CH0_LSB_ADDR, maxSIN & 0xFF );
    writeADCRegister(DWC_LTH_CH0_MSB_ADDR,(minSIN & 0x0F);
    writeADCR뗇 볇(DWC_LTH_CH0_LSB_ADDR,(minSIN >>4)& 0xFF );
    writeADCRegister (DWC_HYS_CH0_ADDR,滞后>> 4); //对于CH0 = 5°的两个比较器,滞后
    writeADCRegister (start_sequence_adDR,0b0.0001万);
    中断;

    CASE HIGH _PREC:// TCC= k x nCLK x tOSC --> 2 x 21 x 47.6 ns = 2 us --> RDY LOW each 2 us x 16=32 us
    writeADCRegister (abort_sequence_adDR,0b0.0001万); // TI推荐
    writeADCRegister (OPMODE_SEL_ADDR,0b0.0111万); //启用自动序列的高精度模式
    writeADCRegister (AUTO_SEQ_CHAN_ADDR,0b0.0011万); //为自动排序选择了CH0和CH1
    writeADCRegister(OSC_SEL_ADDR, 0b0万); //器件使用高速振荡器
    writeADCRegister (nCLK_SEL_ADDR,0b1111.1111万); // nCLK设置为255 (TCC≃25us --> RDY LOW each 388 us)
    writeADCRegister (ACC_EN_ADDR,0b0.1111万); //已启用收集器
    writeADCRegister (alert_DWC_EN_ADDR,0b0万); //禁用数字窗口比较器
    writeADCRegister (start_sequence_adDR,0b0.0001万);
    中断;
    }
    }

    其中maxSIN,minSIN是在校准过程中采用高分辨率模式时的最大ADC值,滞后固定为1000。

    执行的CASE SWITCH语句取决于我是处于睡眠(Auto)还是HIGH _PREC (正常执行)状态

    等待您的意见和建议

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    即使我在读取自主模式下的数据缓冲区时遇到一些困难。
    数据表中的信息不是很清楚。

    我的职能是:

    无符号int readSIN()

    UINT16_t数据;

    Wire.beginTransmission(ADC_ADDRESS和0x7F);
    wire.requestFrom (ADC_ADDRESS,2);
    while (!Wire.Available ());
    数据=单词(Wire.Read(),Wire.Read())>> 4;
    wire.endTransmission (); //发送缓冲区中的字节

    返回数据;
    }

    无符号int readcos ()

    UINT16_t数据;

    Wire.beginTransmission(ADC_ADDRESS和0x7F);
    wire.requestFrom (ADC_ADDRESS,2);
    while (!Wire.Available ());
    数据=单词(Wire.Read(),Wire.Read())>> 4;
    wire.endTransmission ();

    返回数据;
    }

    您能否更好地解释数据表中的“7.3 .6.1 Reading data from the Data Buffer”(从数据缓冲区读取数据)过程?

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

    解决。

    下面介绍如何读取数据缓冲区

    void readADCDataBuffer(uint16_t *ch0, uint16_t *CH1)     

     Wire.beginTransmission(ADC_ADDRESS和0x7F);
     wire.requestFrom (ADC_ADDRESS,32);   //数据缓冲区中的每个数据都有2个字节(MSB + LSB)
     while (!Wire.Available ());
     *ch0 = 0;
     *CH1 = 0;
     对于(int i=0;i<8;i++)
       {
         *ch0 +=(((((((uint16_t)Wire.Read()<< 8 )+ Wire.Read())>>4)& 0x0FFF;
         *CH1 +=(((((((uint16_t)Wire.Read()<< 8 )+ Wire.Read())>>4)& 0x0FFF;
       }
     *ch0 *=2; //转换为假的16位
     *CH1 *=2; //转换为假的16位
     wire.endTransmission ();     
    }

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

    我试图将电容器串联在放电和上拉电阻之间,但它不起作用,因为集电极开路输出永远保持在低电平状态。 它需要直接连接的上拉电阻器,并且值不会太高(100Kohm工作,而不是例如3.3MOhm)。
    无论如何,这将打开一个关于在警报引脚中实施的逻辑的讨论。
    问题是,为了控制能源消耗,必须是一种冲动,在超过阈值之前不保持低水平。

    目前,它继续消耗上拉电流。

    我正在尝试解决固件中的此硬件错误。

    有什么意见?

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

    感谢您的所有评论和耐心。 听起来,除了由于上拉电阻器导致的功耗外,您的一切都正常工作,因此我将回答这个问题。

    正如您已经注意到的,电阻器可以增加,但不会增加太多,否则数字信号的上升时间将太长(类似于向线路添加电容,这也会增加功耗)。 我可以给出的最佳建议是在警报驱动到高位后尽快读取设备,并重置它,使其不会长时间保持高位。 设备本身不能为报警提供脉搏。

    根据您所期望的信号,您还可以增加在触发报警之前必须高于上限阈值的样本数量。 虽然报警仍不是脉冲,但这应降低报警被触发的可能性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan:

    是的,我解决了问题,一旦触发阈值,警报就会移动。 我已经在两个与我的应用程序相匹配的阈值之间实施了某种程度的匹配

    这样,我就得到了一种没有重新激发的冲动。

    另一件重要的事情是我一直在努力的是你设置了报警CH1数据缓冲器反转样本的顺序

    然后,如果将CH0作为警报,则数据缓冲区将是CH0 --> CH1 --> CH0 --> CH1 ....,依此类推,直到第16个样本

    当CH1作为报警时,数据缓冲区将是CH1 --> CH0 --> CH1 --> CH0 ....,依此类推,直到第16个样本

    我不知道为什么,但数据表中没有提到。

    谢谢

    Alessio

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

    很高兴听到您找到了一种行之有效的方法。 感谢您提供有关缓冲区中存储的样本顺序的反馈。 我已将其传达给我的团队,他们正在数据表中进行适当的更新。 我们非常感谢您的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan:

    我需要您的帮助来解决我的应用中的一个大问题,否则ADS7142将对我毫无用处。

    我是否可以在不通过数据缓冲区的情况下读取POST警报中的转换结果。

    或者如何读取设置闹钟的最新值?

    请记住,我可以设置的警报比填充数据缓冲区更快,或者有时我会在DATA_BUFFER_STATUS寄存器中读取16,有时不会

    提前感谢

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

    您好Alessio:

    您只能从数据缓冲区中读取一个条目。 在POST警报模式中,数据缓冲区中的第一个条目(设置警报后)给出触发警报的转换结果。

    请告诉我们,这对您尝试实施的应用程序是否有帮助。

    -Lokesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    警报引脚是UC的外部中断。
    当我已经被唤醒时,ADS7142会在稍后开始填充数据缓冲区。 如果我在警报关闭后立即读取数据缓冲区,我会得到0和"1"作为DATA_BUFFER_STATUS。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否正在监控ADS7142的BUSY/RDY引脚? 您是否在BUSY/RDY引脚处于低电平后读取数据?

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

    等待占线/RDY表示缓冲区已满。 有时,如果警报速度最快,我可以在缓冲区满之前获得中断。

    这就是为什么我需要知道缓冲区中的最新值是什么。

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

    您好Alessio,

    此处有两个选项:

    • 使用开机自检警报模式:Alert > Wake-up MCU >> Set SEQ_ABORT bit (这将终止转换和数据缓冲区填充)> Read Data buffer first entry (读取数据缓冲区第一个条目)。
    • 使用预警模式:alert>Wake-up MCU > Read Data Buffer (所有条目)。 数据缓冲区中的最后一个条目提供触发警报的转换结果。

    您是否与任何当地的TI销售代表联系? 我们可以通过他/她设置呼叫。

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

    尝试的第一个选项:如果我在UC唤醒后立即设置SEQ_ABORT位,我得到0。 我比ADS的采样时间快。
    还尝试了第二个选项:如果缓冲区本身已填充,则数据缓冲区中的最后一个数据条目不是最近的条目。 它是FIFO模式下的循环缓冲区。
    如果两次警报之间的时间比填充缓冲区所需的时间快,则可以。 但总的来说,这不是真的。 有时警报会变慢,有时会变快。 这取决于情况,也不可预测。 DATA_BUFFER_STATUS不包含指向最近值的指针,但每当缓冲区被填充时,该指针仍为16。

    TI销售代表无法回答此技术问题。 当然

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

    我已通过电子邮件回复您。