压电执行器动态刚度怎么测?频率、负载与Python分析

摘要

压电执行器动态刚度是特定频率、负载、位移幅值和边界条件下,力变化与位移变化的频域比值。它不能用一条静态力位移曲线代替,也不能把驱动器电流限值直接当成执行器刚度。

工程验证应固定安装和预紧条件,在多个频率点施加小幅正弦扰动,同步采集工作端力和位移,计算幅值比与相位差,并分别报告静态刚度、动态刚度和闭环等效刚度。本文代码为可运行的教学分析示例,不代表任何产品实测指标。

1. 静态刚度、动态刚度和闭环等效刚度

名称定义主要边界
静态刚度准静态力变化除以位移变化加载速率、预紧、摩擦和位移范围
动态刚度同一频率下力和位移交流分量的幅值比频率、激励幅值、相位、负载和安装
闭环等效刚度控制器参与后工作端的扰动响应特性传感器位置、控制带宽、延迟和限幅
结构刚度安装件、柔性铰链和夹具对力位移的贡献边界约束、接触、偏载和装配重复性

2. 测试架构与信号链

在这里插入图片描述
动态刚度测试同时需要力通道、位移通道和同步采样。

3. 频率扫描与数据处理流程

  1. 固定执行器、柔性机构、力传感器、位移传感器和预紧结构,记录安装方向和接触状态。
  2. 选择小幅正弦激励,先做低频检查,确认力和位移没有削顶、失真或接触分离。
  3. 按对数或等间隔频点扫描,保持每个频点的负载、激励幅值和稳定周期一致。
  4. 对每个频点截取整数周期,分别计算力和位移的交流幅值,并计算动态刚度幅值。
  5. 用互相关或锁相方法估计力与位移的相位差,记录采样率、滤波器和窗口。
  6. 重复不同预紧、负载或位移幅值,判断动态刚度变化来自结构、材料还是测量链。
  7. 若有闭环控制,分别记录开环和闭环条件,不能把控制器增益造成的等效刚度写成器件本体刚度。

4. 软件、硬件与测试条件

类别应记录内容
执行器型号和版本、驱动波形、预紧方式、负载、安装边界和工作温度
力通道力传感器量程、灵敏度、校准状态、安装刚度和采样率
位移通道传感器类型、测量基准、带宽、分辨率和工作端位置
激励与采集频率范围、激励幅值、采样率、同步时钟、滤波和窗口长度
软件Windows 11 64位,Python 3.12.13,仅使用csv、math和statistics标准库
统计口径每个频点周期数、幅值估计方法、重复次数、均值、标准差和异常剔除规则

5. Python动态刚度分析代码

CSV列名为 case_idfrequency_hzforce_amplitude_ndisplacement_amplitude_um。代码计算动态刚度,单位为 N/um,并输出每个频点的结果。输入数据是教学数据。

python dynamic_stiffness.py --self-test
python dynamic_stiffness.py stiffness_data.csv
from __future__ import annotations

import argparse
import csv
import json
import math
from pathlib import Path

FIELDS = ("frequency_hz", "force_amplitude_n", "displacement_amplitude_um")

def number(value: str, field: str, line: int) -> float:
    try:
        result = float(value)
    except (TypeError, ValueError) as exc:
        raise ValueError(f"invalid {field} at line {line}") from exc
    if not math.isfinite(result):
        raise ValueError(f"non-finite {field} at line {line}")
    return result

def load(path: Path):
    with path.open("r", encoding="utf-8-sig", newline="") as handle:
        reader = csv.DictReader(handle)
        required = {"case_id", *FIELDS}
        missing = required - set(reader.fieldnames or [])
        if missing:
            raise ValueError(f"missing columns: {sorted(missing)}")
        rows = []
        for line, raw in enumerate(reader, start=2):
            row = {"case_id": raw["case_id"]}
            for field in FIELDS:
                row[field] = number(raw[field], field, line)
            rows.append(row)
    if not rows:
        raise ValueError("CSV contains no rows")
    return rows

def analyze(row):
    displacement = row["displacement_amplitude_um"]
    if displacement <= 0:
        raise ValueError("displacement_amplitude_um must be positive")
    return {"case_id": str(row["case_id"]), "frequency_hz": row["frequency_hz"], "dynamic_stiffness_n_per_um": row["force_amplitude_n"] / displacement}

def self_test():
    rows = [
        {"case_id": "F10", "frequency_hz": 10.0, "force_amplitude_n": 0.50, "displacement_amplitude_um": 0.10},
        {"case_id": "F100", "frequency_hz": 100.0, "force_amplitude_n": 0.60, "displacement_amplitude_um": 0.10},
        {"case_id": "F1000", "frequency_hz": 1000.0, "force_amplitude_n": 0.80, "displacement_amplitude_um": 0.10},
    ]
    result = [analyze(row) for row in rows]
    expected = (5.0, 6.0, 8.0)
    for item, target in zip(result, expected):
        assert abs(item["dynamic_stiffness_n_per_um"] - target) < 1e-12
    print("SELF_TEST_OK")
    print(json.dumps(result, ensure_ascii=False, indent=2))

def main():
    parser = argparse.ArgumentParser(description="Analyze piezo actuator dynamic stiffness")
    parser.add_argument("csv_path", nargs="?", type=Path)
    parser.add_argument("--self-test", action="store_true")
    args = parser.parse_args()
    if args.self_test:
        self_test()
    elif args.csv_path is None:
        parser.error("csv_path is required")
    else:
        print(json.dumps([analyze(row) for row in load(args.csv_path)], ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()

代码只计算力幅值除以位移幅值,不计算相位、不做传感器校准,也不替代有限元分析或产品规格验证。

6. 教学结果与曲线解释

自检输入在10 Hz、100 Hz和1000 Hz分别给出0.50 N、0.60 N和0.80 N的力幅值,位移幅值均为0.10 um,得到5.0、6.0和8.0 N/um。它只用于验证代码计算链路,不代表任何产品的动态刚度。

频率力幅值位移幅值动态刚度数据属性
10 Hz0.50 N0.10 um5.0 N/um教学输入
100 Hz0.60 N0.10 um6.0 N/um教学输入
1000 Hz0.80 N0.10 um8.0 N/um教学输入

在这里插入图片描述
动态刚度曲线必须标注频率、激励幅值、负载和数据属性。

7. 常见失效原因

  • **把静态刚度当动态刚度:**频率升高后,材料、结构和测量链的相位都会变化。
  • **力和位移不在同一工作端:**夹具变形或接触间隙会把结构误差混入结果。
  • **传感器带宽不足:**力通道或位移通道的带宽不足,会造成幅值衰减和相位偏差。
  • **激励幅值过大:**迟滞、非线性或碰撞会破坏小信号动态刚度假设。
  • **采样率和同步不当:**不同步采样会使力位移相位估计失真。
  • **闭环控制未单独记录:**控制器增益和延迟会改变工作端等效刚度,不能归因于陶瓷本体。

8. 常见问题

8.1 动态刚度和谐振频率是什么关系

两者相关但不是同一个指标。谐振附近幅值和相位变化明显,动态刚度可能快速变化,必须结合频响曲线判断。

8.2 动态刚度可以用阻塞力计算吗

不能直接替代。阻塞力是特定边界下的静态或准静态指标,动态刚度需要频域力位移比。
在这里插入图片描述

8.3 为什么要控制位移幅值

小幅激励更接近线性化条件。幅值变化后,迟滞、预紧和接触非线性可能使结果发生变化。

8.4 闭环压电平台的动态刚度怎么定义

应明确扰动输入、控制器状态、传感器基准和工作端输出。闭环结果是系统等效特性,不等同于执行器本体刚度。

8.5 动态刚度单位为什么是N/um

因为力幅值用N、位移幅值用um。换算到N/m时要明确单位转换,不能混用。
在这里插入图片描述

8.6 频率扫描一定要使用正弦信号吗

不一定,也可用随机或多正弦激励,但数据处理需说明激励谱、窗函数、频率分辨率和相干性。

8.7 传感器噪声会怎样影响结果

当位移幅值接近噪声底时,刚度比值会被放大。应先做静止噪声和空载基线测试。

8.8 教学曲线能否作为选型依据

不能。选型需要具体型号、负载、预紧、温度、频率范围和实测或规格书数据。

9. 结论

压电执行器动态刚度测试的关键,是在明确的频率、负载、预紧、激励幅值和工作端测量基准下,同步获取力和位移。先验证传感器带宽与同步,再计算幅值比和相位,最后区分器件本体、安装结构与闭环控制的贡献。
在这里插入图片描述

本文代码、表格和曲线均为可复现教学示例,不代表鸿芯微控或其他具体产品的实测性能。正式发布动态刚度数据前,必须补充仪器、采样率、样本数、环境、校准和原始记录。

参考资料

  1. IEEE,ANSI/IEEE Std 176-1987,IEEE Standard on Piezoelectricity。IEEE官方来源
  2. ISO,ISO 5725-1:1994,Accuracy of measurement methods and results - Part 1。ISO标准页面
  3. JCGM,JCGM 100:2008,Evaluation of measurement data - Guide to the expression of measurement uncertainty。BIPM官方页面
  4. ISO,ISO 230-2:2014,Test code for machine tools - Part 2。ISO标准组织页面
  5. Python Software Foundation,csv模块文档,Python 3.12。Python官方文档
  6. Python Software Foundation,math模块文档,Python 3.12。Python官方文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值