板子:线性基

简述

线性相关:可以通过一些元素异或出集合中其它元素。

线性基的一些性质:
- 线性基内所有元素线性无关
- 对于原集合任意元素异或的值域和线性基任意元素异或的值域相同
- 线性基的个数就是二进制下位的个数
- 线性基a[i]如果存在,则满足第i位是1,且前面的位都是0

不用太在意如何求出的线性基

一些操作

  • 最大值查询可以询问当前元素,只需要把ret改成当前元素即可

  • 最小应该也可以用类似的贪心方法

对于第K小的判定的理解

对于第i位的元素,如果选择,将会带来2^i个较大元素,所以如果K第i位有元素,就需要选择当前线性基

注意

  • 第一位应该是第0位
  • 注意位运算要对1ll做
  • 线性基要求不能异或出0,所以需要特判0,在插入的时候判断时候有0元素

论线性基和二进制trie的区别:

都是处理异或运算的手段

二进制trie是查找当前元素与一堆元素里面某一元素的最大异或和;

线性基是查找一堆元素任意选取一个子集的最大异或和

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int oo=60;/=log2n
struct LinearBasis{
    static const int maxn=65;
    bool o;//o=0表示没有0 
    int cnt;
    LL d[maxn],p[maxn];
    void Initial()
    {
        cnt=o=0;
        memset(d,0,sizeof(d));
        memset(p,0,sizeof(p));
    }
    bool Insert(LL val)//在原集合中插入val 
    {
        for(int i=oo;i>=0;i--)
        {
            if(val&(1ll<<i))
            {
                if(!d[i])
                {
                    d[i]=val;
                    break;
                }
                val^=d[i];
            }
        }
        if(!val)o=1;
        return val;//成功则返回true 
    }
    LL query_max()//贪心策略:从大往小只要当前元素更大,则异或
    {
        LL ret=0;
        for(int i=oo;i>=0;i--)
            ret=max(ret,ret^d[i]);
        return ret; 
    }
    LL query_min()
    {
        if(o)return 0;
        for(int i=0;i<=oo;i++)
            if(d[i])
                return d[i];
        return 0;
    }
    void rebuild()//这应该是还原成高斯消元后的结果?需要在找第K大的时候使用 
    {
        for(int i=oo;i>=0;i--)
            for(int j=i-1;j>=0;j--)
                if(d[i]&(1ll<<j))
                    d[i]^=d[j];
        for(int i=0;i<=oo;i++)
            if(d[i])p[cnt++]=d[i];
    }
    LL Kth(LL k)//查询第K小的元素 
    {
        LL ret=0;
        if(o)k--;
        if(k>=(1ll<<cnt))//一共有2^cnt-1个元素 
            return -1;
        for(int i=oo;i>=0;i--)//如果K的第i位有元素,则异或 
            if(k&(1ll<<i))ret^=p[i];
        return ret;
    }

}lb;
typedef LinearBasis L_B;
L_B Merge(const L_B &n1,const L_B &n2)//两个线性基合并:暴力插入
{
    L_B ret=n1;
    for(int i=oo;i>=0;i--)
        if(n2.d[i])ret.Insert(n2.d[i]);
    return ret;
}
<think>嗯,用户问的是在嘉立创设计了一个波形发生器的PCB板子,然后拿到板子后要怎么测试波形。首先,我需要理清楚整个测试流程,确保用户能够一步步进行验证。首先,用户可能对PCB测试不太熟悉,所以需要从基础开始讲起。 首先,肯定是目视检查。用户拿到板子后,应该先看看有没有明显的焊接问题、短路或者元器件错位。这一步很重要,因为如果板子有物理损坏,后面的测试都白搭。然后,电源测试,确保电源电压正常,没有短路或者过压的情况。特别是波形发生器可能有不同的电源轨,比如数字和模拟部分,需要分别检查。 接下来是核心功能测试,可能需要分步骤来。比如先测试时钟信号,如果有晶振或者时钟源的话,用示波器看看频率对不对。然后是控制电路,比如MCU或者FPGA,需要确认程序是否正常烧录,GPIO是否工作。接着是DAC模块,这是生成波形的关键部分,需要检查参考电压、输出范围,是否能够正确转换数字信号到模拟信号。 然后是波形输出的部分,不同的波形比如正弦波、方波、三角波,需要逐个测试,看看频率、幅度是否符合设计。如果有滤波电路,需要用示波器看看输出是否平滑。用户可能需要调整参数,比如频率、幅度,这时候需要检查控制接口,比如按键、旋钮或者通信接口是否正常。 通信接口测试,如果板子有UART、SPI、I2C之类的,需要确认数据传输是否正确,是否能够正确配置波形参数。保护电路部分,比如过流、过压保护,需要模拟故障情况,看保护机制是否生效。 辅助功能测试,比如显示模块、按键功能是否正常,存储配置是否保存成功。长期稳定性测试,让板子运行一段时间,看看有没有发热、波形漂移的情况。最后,如果发现问题,需要逐步排查,从电源到信号路径,用示波器、万用表等工具检查各个节点。 用户可能需要一些注意事项,比如静电防护,正确接地,避免短路。还有可能遇到常见问题,比如无输出、波形失真,这时候需要分步骤排查,检查电源、信号路径、元件焊接等。 可能需要用到的工具有示波器、万用表、信号发生器、电源供应器、逻辑分析仪等。用户可能没有全部设备,但至少需要基本的示波器和万用表。需要提醒用户注意安全,比如正确接地,避免高压部分触电。 总结来说,测试流程需要系统化,从外观到电源,再到各个模块逐步验证,确保每个部分正常工作,最后整体测试波形输出。如果用户是第一次测试,可能需要更详细的步骤,比如如何连接示波器,如何设置测量参数等。可能需要给出具体的例子,比如测试正弦波时,如何调整频率,观察波形是否失真,幅度是否正确。 另外,用户可能在设计时可能有特定的功能,比如频率可调、多种波形切换,测试时需要针对这些功能逐一验证。如果有软件控制部分,可能需要检查固件是否正确烧录,通信协议是否正常。总之,需要全面覆盖硬件和软件的各个方面,确保整个波形发生器正常工作。</think>在嘉立创完成波形发生器PCB制板后,可按以下系统化步骤进行测试: --- ### **一、基础检测阶段** 1. **目视检查** - 检查PCB是否存在明显缺陷:焊盘脱落、铜箔断裂、焊锡短路 - 确认元件型号/方向:重点检查DAC芯片、运放、晶振等关键元件 - 用放大镜观察0402/0603封装的小型贴片元件焊接质量 2. **电源测试** - 使用万用表测量: $$ V_{CC} = 设计值 \pm 5\% $$ $$ GND网络阻抗 < 1\Omega $$ - 上电后手触芯片温度,异常发热立即断电 - 数字/模拟电源分离时,测试隔离效果 --- ### **二、核心功能验证** 3. **时钟系统测试** - 用示波器测量晶振输出: $$ f_{osc} = 标称频率 \pm 50ppm $$ $$ V_{pp} \geq 0.7V $$ - 检查PLL输出频率(如有) 4. **控制电路验证** - 通过SWD/JTAG接口确认MCU正常通讯 - 测试GPIO控制信号: ```c // 示例:PWM输出验证 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); ``` - 检查EEPROM/Flash参数存储功能 5. **DAC模块测试** - 输入全0/全1数字量: $$ V_{out(min)} = 0V \pm 10mV $$ $$ V_{out(max)} = V_{ref} \pm 0.5\% $$ - 测试线性度:输入等差数字量,测量输出电压梯度 6. **波形生成测试** - **正弦波**:FFT分析THD < 1% $$ f_{test} = [1Hz, 1MHz] \quad (按设计指标) $$ - **方波**:上升时间测量 $$ t_r = \frac{0.35}{f_{3dB}} $$ - **三角波**:线性度误差 < 2% - 使用XY模式验证李萨如图形(双通道时) --- ### **三、系统联调** 7. **滤波电路验证** - 对比滤波前后信号: $$ \text{截止频率} f_c = \frac{1}{2\pi RC} $$ - 测试20kHz处衰减量(音频应用) 8. **幅度控制测试** - 验证衰减网络: $$ 衰减比 = \frac{R_2}{R_1+R_2} $$ - 测试自动增益控制(AGC)响应时间 9. **接口协议测试** - UART:115200bps下连续发送1小时无丢帧 - SPI:用逻辑分析仪捕捉MOSI/MISO时序 - USB设备枚举时间 < 500ms --- ### **四、可靠性测试** 10. **环境测试** - 温度循环测试:-10℃~+60℃ 循环5次 - 振动测试:10~500Hz 扫频30分钟 - 持续老化:72小时满负荷运行 --- ### **五、故障排查技巧** - **无输出**: 1. 示波器检测DAC输出引脚 2. 检查运放供电极性 3. 测量基准电压 $V_{ref}$ - **波形失真**: 1. 增大示波器时基观察完整周期 2. 检查电源去耦电容(0.1μF需靠近芯片) 3. 测试PCB走线阻抗: $$ Z = \frac{87}{\sqrt{\varepsilon_r+1.41}}\ln\left(\frac{5.98h}{0.8w+t}\right) $$ --- ### **六、推荐测试设备** | 设备类型 | 推荐型号 | 关键参数要求 | |----------------|-----------------------|-----------------------| | 示波器 | Rigol DS1202Z-E | 200MHz BW, 1GSa/s | | 信号分析仪 | Siglent SSA3021X | 9kHz~2.1GHz | | 可编程负载 | ITECH IT8811B | 0~60V/0~10A | | 温度试验箱 | ESPEC TDB-2-40 | -40℃~+150℃ | --- 通过以上步骤可系统化验证波形发生器性能,建议保存测试数据建立质量档案。遇到具体问题时可配合嘉立创的**PCB Gerber查看器**对照设计文件进行定位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值