力传感器电压信号采集与转换

最近购买了新的六维力传感器,信号采集过程一波三折,下面进行了梳理,防止以后再遇到类似问题。

相关硬件参数

六维力传感器

±15v供电,输出差分信号,每一维力/力矩信号各有两根线,分别标定了基础电压和满量程电压。

基础电压:力传感器0N时对应的电压值;

满量程电压:力传感器满量程时对应的电压值。

稳压电源

明伟电源(淘宝有售),D-30F15,输出电压±15v,功率30w

采集卡

阿尔泰USB3131A-16位 100K采集(淘宝有售),最多支持8路差分信号采集。

每个通道的采样速率设置为15000,15000 * 6 = 90000 < 100000,合理。

采用模拟量输入电压连续采样方式,nRefGround设置为ACTS2200_AI_REFGND_DIFF,其他采集卡的相关设置程序不再赘述。

电压信号转换

我使用的传感器的基础电压zero_voltages_[6]、满量程电压full_scale_voltages_[6]、量程full_scale_fts[6]分别如下:

double zero_voltages_[6] = {1.038, 1.128, 1.412, 0.432, 0.263, 0.697};
double full_scale_voltages_[6] = {5.948, 6.270, 6.760, 5.670, 5.321, 5.684};
double full_scale_fts[6] = {200, 200, 200, 10, 10, 10};

假设采集卡采集到的六维力/力矩原始电压信号放在voltage_origin[6]中,转换程序如下:

for(int i = 0; i < 6; i++)
{
    // 获取当前通道相关参数
    int channel_idx = i;
    double voltage = voltage_origin[channel_idx];
    double zero_voltage = zero_voltages_[channel_idx];
    double full_scale_ft = full_scale_fts[channel_idx];
    double full_scale_voltage = full_scale_voltages_[channel_idx];
    
    // 计算当前通道力/力矩数值
    fx_n_6d[i] = (zero_voltage - voltage) / (full_scale_voltage - zero_voltage) * full_scale_ft;
}

每一维的“电压-力/力矩”值图像关系基本如图所示(以Fx为例)

虽然上面的程序已经可以实际应用(在替换原本的传感器时基本无需任何修改),但是将其可视化之后,我发现还是跟我描述的有一些不一致,力值应该是和电压成正比的,图中画出的关系是反比的,在实际应用中

过程中遇到的问题

问题1

由于原始的配套的线裸露部分较短,我采用了接线端子进行延长,再将延长之后的信号线接入采集卡,发现对传感器施力,检测不到电压变化。

经过排查发现,采用接线端子,虽然锁死了线头,但是并没有真实形成连接,万用表通断检测不出连通。

之后我还是采用了焊接延长线的方式,问题解决,测量到的传感器输出电压可以随着施加的外力进行变化。

问题2

在与机械臂联调姿态阻抗控制时,发现力矩部分图像显示错误。

第一反应我以为是传感器坏了,因为六维力/力矩的转换程序都是采用一样的算法,力部分的图像显示没有问题,但是力矩部分三维的图像显示均存在问题。

在排查过程中,手动对传感器施加外力,观测电压信号,在一定范围内力矩-电压的变化仍然符合线性,但是超过“某个临界值”后,图像跳变到零点了。

感觉还是程序问题,原本使用的程序如下:

for(int i = 0; i < 6; i++)
{
    // 获取当前通道相关参数
    int channel_idx = i;
    double voltage = voltage_origin[channel_idx];
    double zero_voltage = zero_voltages_[channel_idx];
    double full_scale_ft = full_scale_fts[channel_idx];
    double full_scale_voltage = full_scale_voltages_[channel_idx];

    double voltage_offset = voltage - zero_voltage;
    double voltage_range;

    if(voltage_origin[i] >= zero_voltage)
    {
        voltage_range = full_scale_voltage - zero_voltage;
    }
    else
    {
        voltage_range = zero_voltage - full_scale_voltage;
    }
    fx_n_6d[i] = (voltage_offset / voltage_range) * full_scale_ft;
}

最后在检查程序时,发现原本的程序(AI编写)存在一个临界值判断,去掉该部分,直接进行电压转换,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值