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.

[参考译文] DRV2667:对简单的数字波形进行编程

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1376360/drv2667-programming-a-simple-digital-waveform

器件型号:DRV2667
主题中讨论的其他器件: MSP430G2553

工具与软件:

您好、 我最终尝试以低频、7.8或14Hz 的频率驱动 PZT 芯片、但我无法让它播放任何频率的波形。  您能否检查我的代码以验证我是否正确地对标头和数据进行了编程?  此外、如果我希望待机位在发出"GO"位后始终变为1、

下面是我的代码和响应。

import smbus
import time

drv2667_adrrs = [0x59]

# I2C write
def i2c_write(slave_adress :int, reg_adress :int, data :int):
    i2c.write_byte_data(slave_adress, reg_adress, data)
    time.sleep(.01)
    check = i2c.read_byte_data(slave_adress, reg_adress)
    print("written to "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + hex(check))
    return
    
# I2C read
def i2c_read(slave_adress :int, reg_adress):
    data = i2c.read_byte_data(slave_adress, reg_adress)
    print("Device: "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + str(data))
    return
    
def drv2667_setup(slave_adress):
    # Control
    i2c_write(slave_adress, 0x02, 0x00) # Exit STNBY mode
    #i2c_write(slave_adress, 0x01, 0x3D) # DRV2667, Analog Mode, Gain: Vpp=100V
    i2c_write(slave_adress, 0x01, 0x3B) # DRV2667, Digital Mode, Gain: Vpp=100V
    #i2c_write(slave_adress, 0x02, 0x02) # EN_OVERRIDE=1
    
    i2c_write(slave_adress, 0x03, 0x01) # Waveform ID# 0x01 to start waveform
    i2c_write(slave_adress, 0x04, 0x00) # Terminate Waveform by clearing this register 0x03
    
    print("DRV2667 @" + str(slave_adress) + "is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V")
    
    return

    
def drv2667_waveform(slave_adress):
    #Following the Example in 8.3.2.1 Single Click Alert Example  (Modified)
    
    #Set to memory page 1
    i2c_write(slave_adress, 0xFF, 0x01)
    #Header
    i2c_write(slave_adress, 0x00, 0x05)  #Header Size
    i2c_write(slave_adress, 0x01, 0x80)  #Start address upper Byte, Mode 3
    i2c_write(slave_adress, 0x02, 0x06)  #Start address lower byte
    i2c_write(slave_adress, 0x03, 0x00)  #Stop address Upper Byte
    i2c_write(slave_adress, 0x04, 0x09)  #Stop address lower byte
    i2c_write(slave_adress, 0x05, 0x01)  #Repeat waveform count, once
    #Data
    i2c_write(slave_adress, 0x06, 0xFF)  #Amplitude, Full scale
    i2c_write(slave_adress, 0x07, 0xFF)  # Frequency  
    i2c_write(slave_adress, 0x08, 0xFF)  #Cycles
    i2c_write(slave_adress, 0x09, 0x00) # Envelope, no envelope
    
    #Set Page Register back to Control Space
    i2c_write(slave_adress, 0xFF, 0x00)
    
    
    print("DRV2667 @" + str(slave_adress) + "is ready to Trigger GO for waveform play")
    
    return
    
if __name__ == "__main__":
    # I2C Setting
    i2c = smbus.SMBus(1)

    # DRV2667のAnalog Mode Setup
    for addr in drv2667_adrrs:
        drv2667_setup(addr)
        drv2667_waveform(addr)
    time.sleep(1)
    
    # Check STANDBY bit
    print("DRV2667 STATUS STANDBY")
    i2c_read(addr, 0x02)

    i2c_write(addr, 0x02, 0x01) # GO
    
    data2 = i2c.read_i2c_block_data(addr, 0x02, 1)
    print ("GO:" ,hex(data2[0]))

这是我从上述代码返回的响应。

written to 89, register2=0x0
written to 89, register1=0x3b
written to 89, register3=0x1
written to 89, register4=0x0
DRV2667 @89is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V
written to 89, register255=0x1
written to 89, register0=0x5
written to 89, register1=0x80
written to 89, register2=0x6
written to 89, register3=0x0
written to 89, register4=0x9
written to 89, register5=0x1
written to 89, register6=0xff
written to 89, register7=0xff
written to 89, register8=0xff
written to 89, register9=0x0
written to 89, register255=0x0
DRV2667 @89is ready to Trigger GO for waveform play
DRV2667 STATUS STANDBY
Device: 89, register2=0
written to 89, register2=0x40
GO: 0x40

在任何频率、振幅或周期下、DRV2667的输出端都没有响应。  我不确定我是否正确构建了波形接头和数据。

如有任何帮助、将不胜感激。

谢谢!

David

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

    此外、为了添加一些有关硬件设置的其他信息...我修复了 r1 = 768k、r2 = 9.8k、l1 = 3.3uH、并且几乎所有其他项都与 drv2668_EVAL 接线图相同。

    我发现在任何时候 VBST = 4.59V。  从未改变。

    David

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

    尊敬的 David:  

    请给我们留出几天时间来研究您的代码。

    此致、
    悉尼诺斯卡特  

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

    我重新接通了整个电路的 DRV2667、并重置了 R1和 R2的一些值。  现在 R1 = 392k、R2 = 9.76k、这应该会设置 HDW 增益50V 峰值。  我这样做是因为电容器 C (BST)是一个50V 电容器。 我的3.3uH 电感器可以处理2.71A 电流、因此应该没问题。

    我不理解的一点是、FB 上设置的 R1/R2硬件增益与地址0x01 GAIN[1:0]中设置的增益之间的差异是什么?

    现在、当我运行上面的基本相同例程、对 Amp、Freq、Gain 进行一些更新时、我现在看到 V (BST)在设置 GO 位时上升。  请参阅随附的示波器迹线图像。  通道1是 V (BST)、通道2是到 PZT 的+/-输出。   

    V (BST)上升至50V、如迹线中所示。

    现在、我可以更改频率(地址:0x07)或#个周期(地址:0x08)、并且可以看到 V (VBST)在从4.5V 上升到50V 的持续时间内确实发生了变化。  因此、我似乎正确地影响了地址寄存器。  但是、无论发送到何种振幅值(地址:0x06)、V (BST)似乎始终达到最大50V。  另外、在示波器中可以看到、到 PZT 的输出+/-永远不会显示信号。

    另外、我必须说明的是、我正在驱动一个 PZT、这是一个具有800nF 电容和165kHz 谐振的150V PZT、因此它有点少、但我只需要驱动低于50V 的低频、通常只有7Hz 至14Hz。  我将介绍一些背景信息。

    因此、我不确定我是否要处理这么多的代码问题、但我也想听到您对此的输入、但我可能需要更好地设置硬件以运行此特定 PZT。  

    欢迎就这些问题提出任何意见。

    谢谢你

    David

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

    我尝试了另一个 DRV2667芯片、认为可能第一个芯片已熔断、但我得到了完全相同的结果...我现在只得到 V (BST)中具有慢速衰减的临时尖峰、没有什么是 OUT + OUT 的结果-。  请参见下文。

    此外、我已使用压电式(PZT)多年、它们通常是单极器件。  换句话说、它们不喜欢负电压、或者可能会使材料去极。  为什么输出+/- 双极(如图6-15到6-20所示)?  负高电压对于 PZT 通常是不利的事情。  那么、是否有办法用失调电压驱动输出、以免损坏 PZT?

    感谢你的帮助。

    David

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

    尊敬的 David:

    我认为您的整体代码可以接受、但我相信库存储是您的问题。 在写入数据字段(第47行)之前、您能否更改为页2 (i2c_write (slave_adress、0xFF、0x02))? 这可能是个问题。

    第7.3.4节"低延迟启动":"升压转换器和放大器仅在需要时启用、否则会保持较低功耗空闲状态。 当器件通过 FIFO 接口接收到数据字节、或 GO 位生效(处于从 RAM 直接回放或波形合成回放模式)时、升压转换器和放大器唤醒..."  
    '如果 EN_OVERRIDE 位被设定、器件立即进入启动程序并且升压转换器和放大器保持被启用、从而绕过内部控制。'
    您已经通过设置 GO 位完成上述设置、以便查看正确的升压电压、但我想在其中加入澄清部分。  

    [报价 userid="478504" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1376360/drv2667-programming-a-simple-digital-waveform/5265227 #5265227"]我不明白的一件事是在 FB 上设置的 R1/R2硬件增益与在地址0x01 GAIN[1:0]中设置的增益之间的区别是什么?

    FB 引脚上的 R1/R2电阻器设置内部升压的电压、而 GAIN[1:0]设置放大器增益。  放大器只能输出高达升压电压、因此如果您设置了高增益、但具有较低的编程升压、您将看到输出信号上出现削波。 将升压电压保持在高于但接近最大预期输出信号可实现最佳效率。  

    [报价 userid="478504" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1376360/drv2667-programming-a-simple-digital-waveform/5265227 #5265227"]但是、无论发送至的振幅值是多少、V (BST)似乎总是转到最大50V (地址:0x06)。  [报价]

    升压电压将保持由 FB 电阻器编程的电压。 该振幅会改变输入信号的振幅。 图6-10显示了输出信号和升压、该脉冲没有改变。  

    [报价 userid="478504" url="~/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1376360/drv2667-programming-a-simple-digital-waveform/5265227 #5265227"]此外、我必须指出的是、我驱动的 PZT 是电容为800nF、共振频率为165kHz 的150V PZT、因此它不太理想、但我只需驱动电压低于50V 和频率极低的 PZT、通常只有7Hz 至14Hz]

    在如此低的频率下、我认为没关系。

    为什么输出+/- 双极是如图6-15到6-20所示的?  负高电压对于 PZT 通常是不利的事情。  [报价]

    请参考下图。 每个引脚上的输出 OUT+和 OUT-具有正电压、如图6-10所示。 以差分方式测量输出时、您会得到一个图(如6-12)、您将参考。 尽管图形显示电压低于0、但事实并非如此。 "负"电压实际上就是 OUT-上的正电压大于 OUT+的情况。

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    感谢您提供的投入。  我很高兴在写入数据寄存器之前尝试在第2页中添加更改、但这似乎没有任何变化。

    我按您所说的那样执行此操作、并 在写入"Data"段之前添加了 i2c_write (slave_adress、0xFF、0x02)。

    结果与我发送的先前示波器迹线类似、即 V (BST)从4.5V 到7V 的初始跳变、并缓慢衰减回4.5V、OUT 没有变化+/-  

    另外、请注意最终的 i2c_write (addr、0x02、0x01)的返回响应为0x40、表示"器件处于低功耗待机模式"

    我在检查电压时将压电体保留在了 OUT +/-引脚上、但在界定范围时是否有必要在输出端设置压电负载?  我只是想检查是否需要将 PZT 放置在适当的位置以监控输出。

    非常感谢您的帮助。  希望您还有其他想法。

    如果有用、我可以向您发送我的硬件特定图表、其中包含特定的电阻器和电容值(如果有用)。

    谢谢!

    David

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

    尊敬的 David:  

    是的、分享详细的原理图很好。 我将对我的 EVM 和一些脚本进行一些测试、以找出问题所在。  

    无论压电负载连接如何、您都应该会看到输出、因此这不是问题。  

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    这是我的布局。  试验电路板区域以及有关连接和元件的具体详细信息。  我希望这对您有所帮助。

    如您所见、我在提交电路板布局之前会创建试验电路板、直到我弄清这个为止。  那么我显然将切换到 SMD 组件。

    您可以在 pict 右上角看到 PZT。

    David

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

    尊敬的 David:  

    感谢您提供此服务! 很抱歉、我还未能在实验室中对其进行测试、但今天仍能进行测试。 请在明天之前收到回复。

    此致、
    悉尼诺斯卡特  

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

    悉尼没问题。  我还尝试使用 EVM 进行测试、但出于某种原因、我无法获得连接到 DRV2667的外部 I2C 链路。  好像来自外部连接器的用于 SDA/SCL 的3.3/5电压转换器也许干扰了适当的 I2C 连接。  不确定、但这就是我刚刚决定采用裸芯片布局试验电路板的原因。  但祝你好运。

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

    Sydney,

    因此我确实再次返回 EVM 尝试一次、以使外部 I2C 正常工作。  我能够确保使用相同的5V 电源。  我想这是我以前使用该单元测试代码时遇到的问题。  我将 MCP2221连接到 USB 5V、将 DRV2667-EVM 连接到不同的5V。

    现在、我实际上是从 EVM 的 out +/-获得输出、但仍不正确。

    注意: 我正在请求大约660Hz 的正弦波和18个周期。  并不是很正确、但至少在使 OUT 在 EVM 上做出响应方面取得了一些进展。  BTW、Amplitude、Freq 或#周期的变化会改变下面的波形。

    我只是认为有些地方仍然无法正确地对波形进行编程、它仅在 EVM 上"某种程度上"起作用、因为 EVM 上的上电周期设置 DVR2667与我在裸芯片设置上的代码不同。

    下面是与 EVM 通信的代码以及 OUT +/-信号产生的示波器波形波形波形图。

    代码:

    import smbus
    import time
    
    drv2667_adrrs = [0x59]
    
    # I2C write
    def i2c_write(slave_adress :int, reg_adress :int, data :int):
        i2c.write_byte_data(slave_adress, reg_adress, data)
        time.sleep(.01)
        check = i2c.read_byte_data(slave_adress, reg_adress)
        print("written to "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + hex(check))
        return
        
    # I2C read
    def i2c_read(slave_adress :int, reg_adress):
        data = i2c.read_byte_data(slave_adress, reg_adress)
        print("Device: "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + str(data))
        return
        
    def drv2667_setup(slave_adress):
        # Control
        i2c_write(slave_adress, 0x02, 0x00) # Exit STNBY mode
        #i2c_write(slave_adress, 0x01, 0x3D) # DRV2667, Analog Mode, Gain: Vpp=100V
        i2c_write(slave_adress, 0x01, 0x39) # DRV2667, Digital Mode, Gain: Vpp=50V
        #i2c_write(slave_adress, 0x02, 0x02) # EN_OVERRIDE=1
        
        i2c_write(slave_adress, 0x03, 0x01) # Waveform ID# 0x01 to start waveform
        i2c_write(slave_adress, 0x04, 0x00) # Terminate Waveform by clearing this register 0x03
        
        print("DRV2667 @" + str(slave_adress) + "is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V")
        
        return
    
        
    def drv2667_waveform(slave_adress):
        #Following the Example in 8.3.2.1 Single Click Alert Example  (Modified)
        
        #Set to memory page 1
        i2c_write(slave_adress, 0xFF, 0x01)
        time.sleep(.01)
        #Header
        i2c_write(slave_adress, 0x00, 0x05)  #Header Size
        time.sleep(.01)
        i2c_write(slave_adress, 0x01, 0x80)  #Start address upper Byte, Mode 3
        time.sleep(.01)
        i2c_write(slave_adress, 0x02, 0x06)  #Start address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x03, 0x00)  #Stop address Upper Byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x04, 0x09)  #Stop address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x05, 0x01)  #Repeat waveform count, once
        time.sleep(.01)
    
        
        #Change to Page 2
        i2c_write(slave_adress, 0xFF, 0x02)
        time.sleep(.01)
        
        #Data
        i2c_write(slave_adress, 0x06, 0xFF)  #Amplitude, Full scale
        time.sleep(.01)
        i2c_write(slave_adress, 0x07, 0x55)  # Frequency  
        time.sleep(.01)
        i2c_write(slave_adress, 0x08, 0x12)  #Cycles
        time.sleep(.01)
        i2c_write(slave_adress, 0x09, 0x00) # Envelope, no envelope
        time.sleep(.01)
        
        #Set Page Register back to Control Space
        i2c_write(slave_adress, 0xFF, 0x00)
        time.sleep(.01)
        
        
        print("DRV2667 @" + str(slave_adress) + "is ready to Trigger GO for waveform play")
        
        return
        
    if __name__ == "__main__":
        # I2C Setting
        i2c = smbus.SMBus(1)
    
        # DRV2667のAnalog Mode Setup
        for addr in drv2667_adrrs:
            drv2667_setup(addr)
            drv2667_waveform(addr)
        time.sleep(1)
        
        # Check STANDBY bit
        print("DRV2667 STATUS STANDBY")
        #i2c_read(addr, 0x02)
    
        i2c_write(addr, 0x02, 0x00) # Exit Standby
        time.sleep(.01)
     
        i2c_write(addr, 0x02, 0x01) # GO
        
        #data2 = i2c.read_i2c_block_data(addr, 0x02, 1)
        #print ("GO:" ,hex(data2[0]))

    输出到控制台:

    written to 89, register2=0x0
    written to 89, register1=0x39
    written to 89, register3=0x1
    written to 89, register4=0x0
    DRV2667 @89is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V
    written to 89, register255=0x1
    written to 89, register0=0x5
    written to 89, register1=0x80
    written to 89, register2=0x6
    written to 89, register3=0x0
    written to 89, register4=0x9
    written to 89, register5=0x1
    written to 89, register255=0x2
    written to 89, register6=0xff
    written to 89, register7=0x55
    written to 89, register8=0x12
    written to 89, register9=0x0
    written to 89, register255=0x0
    DRV2667 @89is ready to Trigger GO for waveform play
    DRV2667 STATUS STANDBY
    written to 89, register2=0x0
    written to 89, register2=0x1

    EVM 上 OUT +/-的范围

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

    Sydney,

    现在我可以使用 EVM 工作了。

    至少在 EVM 上、我现在可以看到良好的输出+/-、并且我可以更改周期数、频率和振幅。

    因此、我删除了您建议的第2页更改、并将输出范围设置为未连接 PZT。  通过连接它、您会得到被严重过滤的输出信号。  现在它看起来很干净。  那么就是这2个更改。   

    所以我的原始代码看起来不错、我只需让5V 电源相同即可使用 EVM。

    现在、唯一的问题是我的硬件设置无法正常工作的原因。  它应该,我不明白。  您仍然可以帮我解决这个问题。

    下面是下面代码中 OUT +/-上的正弦波输出。

    import smbus
    import time
    
    drv2667_adrrs = [0x59]
    
    # I2C write
    def i2c_write(slave_adress :int, reg_adress :int, data :int):
        i2c.write_byte_data(slave_adress, reg_adress, data)
        time.sleep(.01)
        check = i2c.read_byte_data(slave_adress, reg_adress)
        print("written to "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + hex(check))
        return
        
    # I2C read
    def i2c_read(slave_adress :int, reg_adress):
        data = i2c.read_byte_data(slave_adress, reg_adress)
        print("Device: "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + str(data))
        return
        
    def drv2667_setup(slave_adress):
        # Control
        i2c_write(slave_adress, 0x02, 0x00) # Exit STNBY mode
        #i2c_write(slave_adress, 0x01, 0x3D) # DRV2667, Analog Mode, Gain: Vpp=100V
        i2c_write(slave_adress, 0x01, 0x39) # DRV2667, Digital Mode, Gain: Vpp=50V
        #i2c_write(slave_adress, 0x02, 0x02) # EN_OVERRIDE=1
        
        i2c_write(slave_adress, 0x03, 0x01) # Waveform ID# 0x01 to start waveform
        i2c_write(slave_adress, 0x04, 0x00) # Terminate Waveform by clearing this register 0x03
        
        print("DRV2667 @" + str(slave_adress) + "is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V")
        
        return
    
        
    def drv2667_waveform(slave_adress):
        #Following the Example in 8.3.2.1 Single Click Alert Example  (Modified)
        
        #Set to memory page 1
        i2c_write(slave_adress, 0xFF, 0x01)
        time.sleep(.01)
        #Header
        i2c_write(slave_adress, 0x00, 0x05)  #Header Size
        time.sleep(.01)
        i2c_write(slave_adress, 0x01, 0x80)  #Start address upper Byte, Mode 3
        time.sleep(.01)
        i2c_write(slave_adress, 0x02, 0x06)  #Start address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x03, 0x00)  #Stop address Upper Byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x04, 0x09)  #Stop address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x05, 0x01)  #Repeat waveform count, once
        time.sleep(.01)
    
        
        #Change to Page 2
        #i2c_write(slave_adress, 0xFF, 0x02)
        #time.sleep(.01)
        
        #Data
        i2c_write(slave_adress, 0x06, 0xFF)  #Amplitude, Full scale
        time.sleep(.01)
        i2c_write(slave_adress, 0x07, 0x10)  # Frequency  
        time.sleep(.01)
        i2c_write(slave_adress, 0x08, 0x05)  #Cycles
        time.sleep(.01)
        i2c_write(slave_adress, 0x09, 0x00) # Envelope, no envelope
        time.sleep(.01)
        
        #Set Page Register back to Control Space
        i2c_write(slave_adress, 0xFF, 0x00)
        time.sleep(.01)
        
        
        print("DRV2667 @" + str(slave_adress) + "is ready to Trigger GO for waveform play")
        
        return
        
    if __name__ == "__main__":
        # I2C Setting
        i2c = smbus.SMBus(1)
    
        # DRV2667のAnalog Mode Setup
        for addr in drv2667_adrrs:
            drv2667_setup(addr)
            drv2667_waveform(addr)
        time.sleep(1)
        
        # Check STANDBY bit
        print("DRV2667 STATUS STANDBY")
        #i2c_read(addr, 0x02)
    
        i2c_write(addr, 0x02, 0x00) # Exit Standby
        time.sleep(.01)
     
        i2c_write(addr, 0x02, 0x01) # GO
        
        #data2 = i2c.read_i2c_block_data(addr, 0x02, 1)
        #print ("GO:" ,hex(data2[0]))

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

    尊敬的 David:

    太棒了! 很抱歉让您误写额外的页面。  

    根据硬件设置、您是指您的压电负载? 由于电容压电体如此之高、我认为器件不能在100Hz 下保持50Vpp。 您提到过您需要以大约7-14Hz 的频率驱动。 您是否可以尝试在较低的频率下驾驶、并告知我它是否有所改进?

    从下面的数据表中、您可以看到最大电压随着电容的增加而下降。 但您通常可以在较低的频率下保持较高的电压。  

    此致、
    悉尼诺斯卡特

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

    Sydney,

    在额外页面上没有问题。

    按照硬件设置、我的意思是选择电容器、电感器和电阻器。

    我再次使用完全相同的代码尝试了试验电路板、但仍然没有任何内容+/-。

    现在我不是在两种情况下都将 PZT 负载放在输出上、这样我就得到了我在 EVM 上看到的清晰输出信号。

    我怀疑2件事中的任何一件:

    1) 1) EVM 的 MSP430G2553上的加电代码在 DVR2667上的设置方式与在试验电路板上的代码不同、或者说

    2) 2) 我的电容器、电阻器或电感器选择有问题。  或我的线路上有问题。

    我将所有电容器替换为 X7R 50V 和100V、我更新了电感器(但它仍然是径向功率扼流电感器。  我使用的径向功率扼流电感器可能不正确???)

    只是不确定发生了什么。

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

    Sydney,

    我已经完全返工、检查了连接、甚至更换了试验电路板中的多个 DVR2667、一切都无法正常工作。

    我所看到的是 V (BST)、位于4.5V 处、只需快速弹出到8.25V 然后再降下来、没有出现任何变化。  我只是无法弄清我的试验电路板有什么问题。  我是否需要创建原型 SMD 板并在 EVM 文档中订购 BOM 中完全相同的组件?  这看起来是极端的。

    David

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

    尊敬的 David:  

    原理图中的值、等级和位置看起来都可以。 尝试使用试验电路板时、您是否可以监控示波器上的5V 电源?

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    谢谢。  我监控了来自 USB 的5V 电源。  它看起来根本不受影响或被拉下。  实际上、使用同一个 USB 来为看起来正常工作的 EVM 供电实际上会影响5V 电压甚至更高。  不多、但可能为0.1V 左右。

    我还尝试使用完全相同的电感器和其他一些元件选项、以防我在使用屏蔽铁氧体电感器时错过了一些东西、而我使用的是径向电源扼流圈。  希望我能在本周的某个时间对此进行测试。

    David

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

    尊敬的 David:  

    好的、我明白了。 请随时向我提供最新结果! 为了快速测试电感器是否是问题、您可以尝试使用 EVM 中的一个(注意较低的电流限值并相应地调整 Rrext)。 不过有点小。

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    我真的在为这个芯片的试验电路板为什么不工作而苦恼。

    现在、我已经再次更新连接了可能第10次。

    我现在使用的 SMD 电感器与 EVM BOM 中列出的完全相同。

    我已将电阻器更新为精确的单个电阻器。

    电容器均为新电容器、采用 X7R 样式并具有适当的电压规格或更高规格。

    我甚至在不同的分线 DIP 板上安装了4个不同的 DRV2667芯片。  它们都显示完全相同的症状。  如下所示。

    顶部迹线是具有1X 探头的 V (BST)

    底部迹线是具有1X 探头的 OUT +/-

    只有一个缺口、只有在1V 处、您可以看到、并且 VBST 从4.5V 中弹出到7V 并衰减。

    当将0x01写入地址0x02作为 GO 信号时...我得到一个0x40回复。  对于正在运行的 EVM 设置、我始终会得到0x00的回复。

    我只是不明白。  缺少了一些东西、我已多次查看规格表和 EVM 图。

    David

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

    Sydney,

    是否可能有我应该开始了解的其他系列触觉驱动器?  如果我无法让试验电路板正常工作、可能需要放下此芯片、重新开始使用可以在试验电路板上工作的新产品。  我无法信任为无法在试验电路板上工作的某些东西设计电路。

    谢谢!

    David

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

    尊敬的 David:  

    很抱歉、您仍然有问题。 我不确定目前是否有其他的司机是必要的路线。  

    当您尝试连接压电来驱动波形时、您会看到升压下降、对吗? 您能在不连接压电的情况下试一下吗?

    此外、您是否可以修改代码以不启动波形、而仍然设置器件? 升压电压电平是多少?

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    上述布线未连接 PZT。

    在启动一个波形之前、升压电压处于大约4.7V

    David

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

    抱歉、升压电压在波形之前恰好是4.57V。  作为参考、我在 EVM 上测得的电压恰好是4.60V、所以它们是相同的。

    David

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

    Sydney,

    所以我将 USB/I2C MCP2221板移到了同一个无焊试验电路板部分、以便消除 GND 和 VDD 上不必要的长天线、并且我开始在 OUT +/-上看到一点生命+/-、但这仍然很奇怪并且不可重复。

    因此、我现在认为此试验电路板上的连接可能会有一些间歇性或不良。  我需要消除这种可能性。

    我正在订购一个新的、并计划使用短的实心跳线大幅收紧布线、以形成干净的试验电路板。

    我将在本周末拍摄一张新设置的照片、让您知道它是否只是糟糕的连接一直困扰着我。

    David

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

    Sydney,

    一些更新。  取得了一定的进展。

    我将试验电路板完全重新接线到了全新的无焊试验电路板设置上。  我担心我有一些粗略的联系。  我想是这样。  实际上、我最后还硬焊接了许多关键元件、如 L1、C (BULK)、R1、R2、 C (pump)和 R (ext)直接到芯片板上以完全消除连接问题。

    现在、它看起来更加可重现。  不过、我仍然看到以下情况。。

    在 OUT +/-上没有使用 PZT 或示波器探头、我可以看到以下2个图中 V (BST)的输出在这2个状态之间来回切换。   每次运行程序时、V (BST)都可以。

    第一个是我预期的结果。  但我可以重新运行-重新运行-重新运行我的代码、它有时会出现5-6次错误、然后突然开始可以正常运行几次。  这是不可预测的,但当它是好的,它似乎会在正确的时间达到正确的水平。

    不一会、V (BST)将上升到正确的电平、但只需保持该电平、永远不会下降。

    下一个观察结果是、当我将范围添加到 out +/-时、上述 V (BST)会发生变化。

    请参阅下面的、显示了迹线"何时"看起来 V (BST)正在"尝试" 升压、但显然不会达到完整电平、通道2是 OUT +/-上的10X 探头。

    我希望其中的一些内容会告诉您一些东西。  请告诉我。

    谢谢!

    David

    下面是用于上述所有运行的代码。。

    import smbus
    import time
    
    drv2667_adrrs = [0x59]
    
    # I2C write
    def i2c_write(slave_adress :int, reg_adress :int, data :int):
        i2c.write_byte_data(slave_adress, reg_adress, data)
        time.sleep(.01)  #This was noted as a solution for Solving Standby mode issue addressed in above code source
        check = i2c.read_byte_data(slave_adress, reg_adress)
        print("written to "+ str(slave_adress) +", register "+hex(reg_adress)+ " = "  + hex(check))
        return
        
    # I2C read
    def i2c_read(slave_adress :int, reg_adress):
        data = i2c.read_byte_data(slave_adress, reg_adress)
        print("Device: "+ str(slave_adress) +", register"+str(reg_adress)+ "="  + str(data))
        return
    
    # DRV2667 Setup
    def drv2667_setup(slave_adress):
        # Control
        #i2c_write(slave_adress, 0x02, 0x80) # Send Reset
        #time.sleep(.1)
        
        i2c_write(slave_adress, 0x02, 0x00) # Normal Operation & Exit STNBY mode
        time.sleep(.01)
        
        """ 
        #Section for Optional Analog Mode
        i2c_write(slave_adress, 0x01, 0x3D) # DRV2667, Analog Mode, Gain: Vpp=100V
        i2c_write(slave_adress, 0x02, 0x02) # EN_OVERRIDE=1
        print("DRV2667 @" + str(slave_adress) + "is ready on Analog Amplifier Mode, Vout=50V when Vdd=3.6V")
        """
        
        #Section for Digital Mode Drive with Waveform
        i2c_write(slave_adress, 0x01, 0x3B) # DRV2667, Digital Mode, Gain: Vpp=50V (0:1)
        i2c_write(slave_adress, 0x03, 0x01) # Waveform ID# 0x01 to start waveform
        i2c_write(slave_adress, 0x04, 0x00) # Terminate Waveform by clearing this register 0x03
        print("DRV2667 @" + str(slave_adress) + "is ready on Digital Amplifier Mode, Vout=50V when Vdd=3.6V")
        
        return
    
        
    def drv2667_waveform(slave_adress):
        #Following the Example in 8.3.2.1 Single Click Alert Example  (Modified)
        
        #Set to memory page 1
        i2c_write(slave_adress, 0xFF, 0x01)
        time.sleep(.01)
        #Header
        i2c_write(slave_adress, 0x00, 0x05)  #Header Size
        time.sleep(.01)
        i2c_write(slave_adress, 0x01, 0x80)  #Start address upper Byte, Mode 38.25V
        time.sleep(.01)
        i2c_write(slave_adress, 0x02, 0x06)  #Start address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x03, 0x00)  #Stop address Upper Byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x04, 0x09)  #Stop address lower byte
        time.sleep(.01)
        i2c_write(slave_adress, 0x05, 0x01)  #Repeat waveform count, once
        time.sleep(.01)
        
        #i2c_write(slave_adress, 0xFF, 0x02)
        
        #Data
        i2c_write(slave_adress, 0x06, 0x05)  #Amplitude, Half scale
        time.sleep(.01)
        i2c_write(slave_adress, 0x07, 0x01)  # Frequency  
        time.sleep(.01)
        i2c_write(slave_adress, 0x08, 0x09)  #Cycles
        time.sleep(.01)
        i2c_write(slave_adress, 0x09, 0x00) # Envelope, no envelope
        time.sleep(.01)
        
        #Set Page Register back to Control Space
        i2c_write(slave_adress, 0xFF, 0x00)
        
        
        print("DRV2667 @" + str(slave_adress) + "is ready to Trigger GO for waveform play")
        
        return
        
    if __name__ == "__main__":
        # I2C Setting
        i2c = smbus.SMBus(1)
    
        # DRV2667のAnalog Mode Setup
        for addr in drv2667_adrrs:
            drv2667_setup(addr)
            drv2667_waveform(addr)
        time.sleep(1)
        
        # Check STANDBY bit
        print("DRV2667 STATUS STANDBY")
        #i2c_read(addr, 0x02)
    
        #i2c_write(addr, 0x02, 0x00) # Exit Standby
        #time.sleep(.01)
     
        i2c_write(addr, 0x02, 0x01) # GO
        
        #data2 = i2c.read_i2c_block_data(addr, 0x02, 1)
        #print ("GO:" ,hex(data2[0]))

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

    尊敬的 David:  

    我明白了。 对我来说、这听起来仍然是一个设置问题。 您能够在 EVM 上运行代码并看到良好的效果。 您发现不良结果的硬件已通过更改为不同的电路板并改进连接而得到了改进。 由于 EVM 的布局已经针对器件进行了优化、与终端设计更相似、您是否能够将 EVM 组件更换为原理图的组件? 我认为这会更快、更高效地进行测试。  

    此致、
    悉尼诺斯卡特  

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

    悉尼、

    将 EVM 上的表面贴装组件交换到我的布局根本不是很容易。  这些元件非常小、我可能会在此过程中杀死我的 EVM。  或者您是建议我将通孔组件焊接到 EVM 上、这样做有类似的困难。

    David

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

    Sydney,

    如果我们做到这一点、则可能是时候考虑使用 EVM BOM 上的确切元件制作快速 SMD 电路板、看看能从何处获取。

    David

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

    尊敬的 David:  

    很抱歉耽误你的时间。  

    似乎布局就是这里的问题。 如果您能制作电路板、我认为这是 最好的下一步。  

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    是的、我同意。  我订购了新的 Proto SMD 板、请参见下文。  如果我懒惰地不使用 GPIO 来设置它、将 MCP2221 (抱歉您的产品)用于 USB 转 I2C、并使用一些跳线选项进行增益设置。   我将在 EVM BOM 中使用所有相同的元件、只是一些电容器对于我使用的电路板来说太小、因此我使用的是0603、而不是0402、不过那应该没问题。

    几周后就会发布。

    David

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

    尊敬的 David:  

    好、很棒! 请在归还电路板时通知我并进行一些测试。  

    仅供参考、我将于7月15日至26日结束。

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    我刚收到新电路板、他们立刻就开始工作了。  因此、在我的无焊试验电路板上、这段时间很可能只是连接不佳。  我很高兴地说、我现在可以进步了。

    谢谢!

    David

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

    Sydney,

    我还有一个与该相同线程相关的问题。  现在一切都正常、我在了解输出为何在低侧削波之前遇到了问题。

    我已将电阻器增益设置为最大100V 输出(使用 R1 = 768k 和 R2 = 9.76k)。

    但不管我将地址设置为什么:0x01增益为25V、50V、75V 或100V、输出波形始终在底部被削波。  请参见下文。

    您或任何人可以帮助我理解为什么波形不会因偏移而得到纯正弦波输出、而不是削波输出吗?

    谢谢!

    David

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

    Sydney,

    我想是示波器探头影响输出的方式。  如果我拆下示波器探头、VBST 会大幅升高、PZT 将按预期振动。  如果我在连接或不连接 PZT 的情况下探测输出、则我认为 PZT 自身连接时、不会反映实际的输出。  我将使用干扰计测试 PZT 响应以进行验证、但这可能只是示波器探测问题。

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

    尊敬的 David:  

    您是否能够测试 干扰计?

    您是否还可以提供 OUT+和 OUT-的示波器屏幕截图?  

    添加示波器探头确实会消耗一些电流、但流耗非常小。 如果您使用具有更高电源规格的其他电源、您是否仍然会看到这个问题?

    此致、
    悉尼诺斯卡特  

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

    Sydney,

    我向您承诺了有关干扰计结果的一些反馈。

    好吧,我无法在我们的主要仪器干涉仪上得到时间,所以我继续,并放弃我自己的房子自建的米歇尔森干涉仪。  (如下所示)

    它是一个由废金属、光学、镜子、偏振 BS 和波形板组成的家用建筑、所有这些都与5分钟的环氧树脂夹在一起。

    下面是整体介绍。  PZT 进行测试、其左上角是干涉仪的测量桥臂。

    右上后视镜是参考支路。  在测量桥臂和参考桥臂上都有一个1/4波板。

    探测器在底部,小管在中间是一个廉价的激光指示器,由5V 供电

    右侧红色框是检测器信号的跨阻放大器。

    下面是打开激光指示器时的情况。  左下角的镜片将测量光束指向探测器。

    下面、我将定制 DRV2667驱动器板连接到 PZT 进行测量。

    下面是示波器上的干扰信号输出。  我仍在尝试获取更多增益和清除尖峰、但效果是很好的。

    这是25Hz 正弦波(或对于 Freq 为0x03)和25V 增益设置上振幅0x40的输出。

    这表示大约266nm (532nm 激光的1/2波长)的振幅。  所以我现在可以测量非常小的位移、然后查看振幅和频率的变化、从而确定我的应用中驱动的特征。

    一旦清除输出信号并获得一些更多的增益、我就可以测量到大约1-5Nm 的较低值。  此外、我还可以测量高达约100kHz 的频率。

    我最终可能会采用正交设置、因为我使用正弦波测量正弦波、这会在使位移结果线性化方面带来一些挑战。

    总之、感谢大家的帮助。

    David