百度网盘免费下载网站快照优化公司
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:03
当前位置: 首页 > news >正文
百度网盘免费下载,网站快照优化公司,ps制作网站过程,顺企网官网企业名录文章目录 1. trim的概念和目的2. trim方式2.1 OTP#xff08;One-Time Programmable#xff09;一次性修调2.2 EEPROM#xff08;Electrically Erasable PROM#xff09;修调 3. trim算法3.1 电压trim code table3.2 电压测量函数3.3 公式法验证3.4 线性法验证3.5 二分法验… 文章目录 1. trim的概念和目的2. trim方式2.1 OTPOne-Time Programmable一次性修调2.2 EEPROMElectrically Erasable PROM修调 3. trim算法3.1 电压trim code table3.2 电压测量函数3.3 公式法验证3.4 线性法验证3.5 二分法验证并对比结果 1. trim的概念和目的 概念trim 是芯片制造后通过改变内部器件连接或工作状态的技术本质上是对芯片参数的微调校准。它是提升良率和功能灵活性的关键步骤。 目的 2.1 补偿工艺问题半导体制造存在固有波动如线宽、掺杂浓度导致芯片参数如电压、频率与设计值产生偏差通过熔断熔丝Fuse、写入寄存器eFuse/OTP或激光修调等方式调整电阻/电容网络或偏置电路将芯片参数拉回目标范围。 2.2 实现单芯片多功能需求客户可能需要同一芯片的不同规格如LDO输出1.8V/2.5V/3.3V传统方案需设计多款芯片增加制造成本。Trim 方案设计一个基础内核Core测试时通过Trim改变反馈分压比、电流源大小等生成不同衍生型号如Vout可调的LDO。
- trim方式
2.1 OTPOne-Time Programmable一次性修调
可以永久改变电路连接仅允许单次写入无法逆转有如下实现方式 齐纳二极管Zener Trim未修调时齐纳二极管开路修调时施加反向高压将其永久击穿短路使并联的电阻从电路中被剔除。 熔丝Fuse Trim在电路中设计金属或多晶硅熔丝施加 5V 的高压使其熔断形成开路从而改变电路参数。 激光调阻Laser Trim使用激光切割薄膜电阻调整电阻值精度。 EPROMErasable Programmable ROM修调将修调数据写入浮栅晶体管构成的存储器通过紫外线照射擦除数据封装后无法擦除因为芯片封盖会阻挡紫外线实际应用中属于类OTP方案。
2.2 EEPROMElectrically Erasable PROM修调 通过电信号擦写浮栅晶体管数据无需物理破坏。 狭义EEPROM可修改任意单字节Flash按区块操作如1KB速度快但小数据修改效率低广泛用于MCU程序存储如固件不适用频繁改写的小数据。 EEPROM Trim 的电路结构是 电阻网络 MOS 开关矩阵 每个修调电阻Trim Resistor并联一个 MOS 晶体管开关MOS 开关的通断状态由 EEPROM 存储单元的 0/1 值直接控制1 导通0 关断对于8 位修调系统 8个电阻 8个MOS开关 → 可产生 28 256 种阻值组合。 - trim算法
我将使用c98创建一个class来模拟trim算法的公式法线性法二分法可以通过下面的代码学习trim的原理因为是模拟并不包含93k测试机相关的API函数仅仅是学习使用。
3.1 电压trim code table
首先我们来实现一个电压trim code表假设电压的范围是1.5V到2.5V一共有32个code也就是0~31电压的步长为0.03226V。
#include iostream
#include iomanip
#include utility // 用于std::pair
#include cstdlib // 用于rand()和srand()
#include ctime // 用于time()
#include cmath // 用于round()和fabs()class TrimSimulator {
private:// 电压校准表存储32个(code, voltage)键值对std::pairint, double trimTable[32];// 电压范围参数double MIN_VOLTAGE 1.5;double MAX_VOLTAGE 2.5;// 电压步进值 (2.5-1.5)/31 ≈ 0.0323Vdouble VOLTAGE_STEP (MAX_VOLTAGE - MIN_VOLTAGE) / 31;public:// 构造函数初始化校准表TrimSimulator() {for (int code 0; code 32; code) {double voltage MIN_VOLTAGE code * VOLTAGE_STEP;trimTable[code] std::make_pair(code, voltage); // 填充校准表}}
};
3.2 电压测量函数
我们在class中实现一个电压测量函数以模拟芯片测试机的电压测量动作这个函数通过code作为输入参数然后将code减去3假设这是实际值与理论值的偏差查找code表中的电压值后再减去一个随机数小量假设这是测量误差然后返回这个值作为电压测量值。
#include iostream
#include iomanip
#include utility // 用于std::pair
#include cstdlib // 用于rand()和srand()
#include ctime // 用于time()
#include cmath // 用于round()和fabs()class TrimSimulator {
private:// 电压校准表存储32个(code, voltage)键值对std::pairint, double trimTable[32];// 电压范围参数double MIN_VOLTAGE 1.5;double MAX_VOLTAGE 2.5;// 电压步进值 (2.5-1.5)/31 ≈ 0.0323Vdouble VOLTAGE_STEP (MAX_VOLTAGE - MIN_VOLTAGE) / 31;// 测量误差范围 ±10mVdouble MEASUREMENT_ERROR_RANGE 0.01;// 生成[-0.01, 0.01]范围内的随机测量误差double generateRandomError() const {return (2.0 * rand() / RAND_MAX - 1.0) * MEASUREMENT_ERROR_RANGE;}public:// 构造函数初始化校准表TrimSimulator() {srand(static_castunsigned(time(0))); // 用当前时间初始化随机种子for (int code 0; code 32; code) {double voltage MIN_VOLTAGE code * VOLTAGE_STEP;trimTable[code] std::make_pair(code, voltage); // 填充校准表}}// 电压测量函数含随机误差double measureVoltage(int code) const {int adjustedCode code - 3; // 硬件偏差补偿// 边界保护确保code在[0,31]范围内if (adjustedCode 0) adjustedCode 0;if (adjustedCode 32) adjustedCode 31;double baseVoltage trimTable[adjustedCode].second;double measuredVoltage baseVoltage generateRandomError(); // 添加随机误差// 电压钳位确保测量值在物理范围内if (measuredVoltage MIN_VOLTAGE) return MIN_VOLTAGE;if (measuredVoltage MAX_VOLTAGE) return MAX_VOLTAGE;return measuredVoltage;}
};
3.3 公式法验证
假设芯片初始code是5trim的目标范围是下限 2.2 - 0.02 V上限 2.2 0.02 V目标值是 2.2 V。
我们先实现公式法目标电压值 - 初始电压值/ 电压步长 code目标电压值和初始电压值作为公式法函数输入参数code作为返回值。
在main函数中设置一个变量使code 5调用测量电压的函数返回值作为初始电压值然后调用公式法的函数返回一个修调后的code再将这个code调用测量电压的函数与上下限比较看看是不是在范围内在输出pass不在输出fail。
#include iostream
#include iomanip
#include utility // 用于std::pair
#include cstdlib // 用于rand()和srand()
#include ctime // 用于time()
#include cmath // 用于round()和fabs()class TrimSimulator {
private:// 电压校准表存储32个(code, voltage)键值对std::pairint, double trimTable[32];// 电压范围参数double MIN_VOLTAGE 1.5;double MAX_VOLTAGE 2.5;// 电压步进值 (2.5-1.5)/31 ≈ 0.0323Vdouble VOLTAGE_STEP (MAX_VOLTAGE - MIN_VOLTAGE) / 31;// 测量误差范围 ±10mVdouble MEASUREMENT_ERROR_RANGE 0.01;// 生成[-0.01, 0.01]范围内的随机测量误差double generateRandomError() const {return (2.0 * rand() / RAND_MAX - 1.0) * MEASUREMENT_ERROR_RANGE;}public:// 构造函数初始化校准表TrimSimulator() {srand(static_castunsigned(time(0))); // 用当前时间初始化随机种子for (int code 0; code 32; code) {double voltage MIN_VOLTAGE code * VOLTAGE_STEP;trimTable[code] std::make_pair(code, voltage); // 填充校准表}}// 电压测量函数含随机误差double measureVoltage(int code) const {int adjustedCode code - 3; // 硬件偏差补偿// 边界保护确保code在[0,31]范围内if (adjustedCode 0) adjustedCode 0;if (adjustedCode 32) adjustedCode 31;double baseVoltage trimTable[adjustedCode].second;double measuredVoltage baseVoltage generateRandomError(); // 添加随机误差// 电压钳位确保测量值在物理范围内if (measuredVoltage MIN_VOLTAGE) return MIN_VOLTAGE;if (measuredVoltage MAX_VOLTAGE) return MAX_VOLTAGE;return measuredVoltage;}// 公式法计算目标Code增量int calculateTrimCode(double targetVoltage, double initialVoltage) const {double deltaVoltage targetVoltage - initialVoltage;// 根据电压差和步进值计算Code增量int codeDelta static_castint(round(deltaVoltage / VOLTAGE_STEP));return codeDelta;}};int main() {TrimSimulator tester; // 创建校准模拟器实例// 目标电压参数设置const double TARGET_VOLTAGE 2.2; // 目标电压2.2Vconst double TOLERANCE 0.02; // 允许误差±20mVconst double LOWER_BOUND TARGET_VOLTAGE - TOLERANCE; // 电压下限2.18Vconst double UPPER_BOUND TARGET_VOLTAGE TOLERANCE; // 电压上限2.22V// 初始状态设置int initialCode 5; // 起始Code值double initialVoltage tester.measureVoltage(initialCode); // 测量初始电压// 公式法计算目标Codeint formulaCode tester.calculateTrimCode(TARGET_VOLTAGE, initialVoltage);double formulaVoltage tester.measureVoltage(formulaCode);// 验证公式法结果是否在目标范围内bool isFormulaPass (formulaVoltage LOWER_BOUND) (formulaVoltage UPPER_BOUND);// 输出公式法验证结果std::cout 公式法验证 std::endl;std::cout 初始Code: initialCode | 初始电压: std::fixed std::setprecision(4) initialVoltage V\n;std::cout 目标电压: TARGET_VOLTAGE V ± TOLERANCE * 1000 mV\n;std::cout 公式法目标Code: formulaCode | 实测电压: formulaVoltage V\n;std::cout 公式法结果: (isFormulaPass ? PASS : FAIL) [ LOWER_BOUND V ~ UPPER_BOUND V]\n;return 0;
}一般情况下公式法可以作为粗调先快速与目标值拉近距离然后在使用其他方法精调。
公式法执行结果 3.4 线性法验证
因为一般情况下粗调的结果是fail的而且这次模拟的trim code表是线性递增的在fail的情况下我们可以使用线性法。
我们实现一个线性法函数code和limit作为输入值若起始电压 目标下限 → 需升压 → direction1 增大Code值若起始电压 目标上限 → 需降压 → direction-1 减小Code值直至测量电压进入目标范围返回此时的code。
#include iostream
#include iomanip
#include utility // 用于std::pair
#include cstdlib // 用于rand()和srand()
#include ctime // 用于time()
#include cmath // 用于round()和fabs()class TrimSimulator {
private:// 电压校准表存储32个(code, voltage)键值对std::pairint, double trimTable[32];// 电压范围参数double MIN_VOLTAGE 1.5;double MAX_VOLTAGE 2.5;// 电压步进值 (2.5-1.5)/31 ≈ 0.0323Vdouble VOLTAGE_STEP (MAX_VOLTAGE - MIN_VOLTAGE) / 31;// 测量误差范围 ±10mVdouble MEASUREMENT_ERROR_RANGE 0.01;// 生成[-0.01, 0.01]范围内的随机测量误差double generateRandomError() const {return (2.0 * rand() / RAND_MAX - 1.0) * MEASUREMENT_ERROR_RANGE;}public:// 构造函数初始化校准表TrimSimulator() {srand(static_castunsigned(time(0))); // 用当前时间初始化随机种子for (int code 0; code 32; code) {double voltage MIN_VOLTAGE code * VOLTAGE_STEP;trimTable[code] std::make_pair(code, voltage); // 填充校准表}}// 电压测量函数含随机误差double measureVoltage(int code) const {int adjustedCode code - 3; // 硬件偏差补偿// 边界保护确保code在[0,31]范围内if (adjustedCode 0) adjustedCode 0;if (adjustedCode 32) adjustedCode 31;double baseVoltage trimTable[adjustedCode].second;double measuredVoltage baseVoltage generateRandomError(); // 添加随机误差// 电压钳位确保测量值在物理范围内if (measuredVoltage MIN_VOLTAGE) return MIN_VOLTAGE;if (measuredVoltage MAX_VOLTAGE) return MAX_VOLTAGE;return measuredVoltage;}// 公式法计算目标Code增量int calculateTrimCode(double targetVoltage, double initialVoltage) const {double deltaVoltage targetVoltage - initialVoltage;// 根据电压差和步进值计算Code增量int codeDelta static_castint(round(deltaVoltage / VOLTAGE_STEP));return codeDelta;}// 线性搜索法调整Codeint linearSearchTrim(int startCode, double lowerBound, double upperBound) const {// 确定调整方向升压1或降压-1int direction (measureVoltage(startCode) lowerBound) ? 1 : -1;int currentCode startCode;int stepCount 0; // 迭代计数器bool found false; // 目标标记std::cout \n 线性法执行过程 std::endl;// 在[0,31]范围内线性搜索while (currentCode 0 currentCode 31) {double voltage measureVoltage(currentCode);stepCount;// 实时输出搜索状态std::cout 迭代 stepCount : Code currentCode | 电压 std::fixed std::setprecision(4) voltage V\n;// 检查是否达到目标电压范围if (voltage lowerBound voltage upperBound) {std::cout √ 找到目标: Code currentCode (迭代 stepCount 次)\n;found true;break;}currentCode direction; // 沿方向调整Code}// 未找到有效解的失败处理if (!found) {std::cout × 搜索失败最终Code currentCode \n;}return currentCode;}};int main() {TrimSimulator tester; // 创建校准模拟器实例// 目标电压参数设置const double TARGET_VOLTAGE 2.2; // 目标电压2.2Vconst double TOLERANCE 0.02; // 允许误差±20mVconst double LOWER_BOUND TARGET_VOLTAGE - TOLERANCE; // 电压下限2.18Vconst double UPPER_BOUND TARGET_VOLTAGE TOLERANCE; // 电压上限2.22V// 初始状态设置int initialCode 5; // 起始Code值double initialVoltage tester.measureVoltage(initialCode); // 测量初始电压// 公式法计算目标Codeint formulaCode tester.calculateTrimCode(TARGET_VOLTAGE, initialVoltage);double formulaVoltage tester.measureVoltage(formulaCode);// 验证公式法结果是否在目标范围内bool isFormulaPass (formulaVoltage LOWER_BOUND) (formulaVoltage UPPER_BOUND);// 输出公式法验证结果std::cout 公式法验证 std::endl;std::cout 初始Code: initialCode | 初始电压: std::fixed std::setprecision(4) initialVoltage V\n;std::cout 目标电压: TARGET_VOLTAGE V ± TOLERANCE * 1000 mV\n;std::cout 公式法目标Code: formulaCode | 实测电压: formulaVoltage V\n;std::cout 公式法结果: (isFormulaPass ? PASS : FAIL) [ LOWER_BOUND V ~ UPPER_BOUND V]\n;// 公式法失败时执行线性法if (!isFormulaPass) {// 线性搜索法执行int linearCode tester.linearSearchTrim(formulaCode, LOWER_BOUND, UPPER_BOUND);double linearVoltage tester.measureVoltage(linearCode);bool linearPass (linearVoltage LOWER_BOUND) (linearVoltage UPPER_BOUND);// 输出报告std::cout \n 线性法报告 std::endl;std::cout | 方法 | 最终Code | 最终电压 | 结果 |\n;std::cout |——–|———-|————|——-|\n;std::cout | 线性法 | std::setw(8) linearCode | std::setw(8) linearVoltage V | (linearPass ? PASS : FAIL) |\n;}return 0;
}线性法的结果
3.5 二分法验证并对比结果 再实现一个二分法函数code和limit作为输入值取中点并测量电压电压过低需升压 → 右移区间电压过高需降压 → 左移区间电压命中目标范围 → 返回当前Code。 #include iostream #include iomanip #include utility // 用于std::pair #include cstdlib // 用于rand()和srand() #include ctime // 用于time() #include cmath // 用于round()和fabs()class TrimSimulator { private:// 电压校准表存储32个(code, voltage)键值对std::pairint, double trimTable[32];// 电压范围参数double MIN_VOLTAGE 1.5;double MAX_VOLTAGE 2.5;// 电压步进值 (2.5-1.5)/31 ≈ 0.0323Vdouble VOLTAGE_STEP (MAX_VOLTAGE - MIN_VOLTAGE) / 31;// 测量误差范围 ±10mVdouble MEASUREMENT_ERROR_RANGE 0.01;// 生成[-0.01, 0.01]范围内的随机测量误差double generateRandomError() const {return (2.0 * rand() / RAND_MAX - 1.0) * MEASUREMENT_ERROR_RANGE;}public:// 构造函数初始化校准表TrimSimulator() {srand(static_castunsigned(time(0))); // 用当前时间初始化随机种子for (int code 0; code 32; code) {double voltage MIN_VOLTAGE code * VOLTAGE_STEP;trimTable[code] std::make_pair(code, voltage); // 填充校准表}}// 电压测量函数含随机误差double measureVoltage(int code) const {int adjustedCode code - 3; // 硬件偏差补偿// 边界保护确保code在[0,31]范围内if (adjustedCode 0) adjustedCode 0;if (adjustedCode 32) adjustedCode 31;double baseVoltage trimTable[adjustedCode].second;double measuredVoltage baseVoltage generateRandomError(); // 添加随机误差// 电压钳位确保测量值在物理范围内if (measuredVoltage MIN_VOLTAGE) return MIN_VOLTAGE;if (measuredVoltage MAX_VOLTAGE) return MAX_VOLTAGE;return measuredVoltage;}// 公式法计算目标Code增量int calculateTrimCode(double targetVoltage, double initialVoltage) const {double deltaVoltage targetVoltage - initialVoltage;// 根据电压差和步进值计算Code增量int codeDelta static_castint(round(deltaVoltage / VOLTAGE_STEP));return codeDelta;}// 线性搜索法调整Codeint linearSearchTrim(int startCode, double lowerBound, double upperBound) const {// 确定调整方向升压1或降压-1int direction (measureVoltage(startCode) lowerBound) ? 1 : -1;int currentCode startCode;int stepCount 0; // 迭代计数器bool found false; // 目标标记std::cout \n 线性法执行过程 std::endl;// 在[0,31]范围内线性搜索while (currentCode 0 currentCode 31) {double voltage measureVoltage(currentCode);stepCount;// 实时输出搜索状态std::cout 迭代 stepCount : Code currentCode | 电压 std::fixed std::setprecision(4) voltage V\n;// 检查是否达到目标电压范围if (voltage lowerBound voltage upperBound) {std::cout √ 找到目标: Code currentCode (迭代 stepCount 次)\n;found true;break;}currentCode direction; // 沿方向调整Code}// 未找到有效解的失败处理if (!found) {std::cout × 搜索失败最终Code currentCode \n;}return currentCode;}// 二分法搜索目标Codeint binarySearchTrim(int startCode, double lowerBound, double upperBound) const {int low 0; // 搜索下界int high 31; // 搜索上界int bestCode startCode; // 最佳Code记录int stepCount 0; // 迭代计数器std::cout \n 二分法执行过程 std::endl;// 二分搜索主循环while (low high) {int mid (low high) / 2; // 计算中点double voltage measureVoltage(mid);stepCount;// 输出当前搜索状态std::cout 迭代 stepCount : Code mid | 电压 std::fixed std::setprecision(4) voltage V | 区间[ low , high ]\n;// 检查是否命中目标范围if (voltage lowerBound voltage upperBound) {std::cout √ 找到目标: Code mid (迭代 stepCount 次)\n;return mid;}// 电压不足时向右半区搜索else if (voltage lowerBound) {low mid 1;}// 电压超限时向左半区搜索else {high mid - 1;}}// 未找到精确解时返回最佳近似std::cout × 未找到精确解返回最佳Code bestCode \n;return bestCode;} };int main() {TrimSimulator tester; // 创建校准模拟器实例// 目标电压参数设置const double TARGET_VOLTAGE 2.2; // 目标电压2.2Vconst double TOLERANCE 0.02; // 允许误差±20mVconst double LOWER_BOUND TARGET_VOLTAGE - TOLERANCE; // 电压下限2.18Vconst double UPPER_BOUND TARGET_VOLTAGE TOLERANCE; // 电压上限2.22V// 初始状态设置int initialCode 5; // 起始Code值double initialVoltage tester.measureVoltage(initialCode); // 测量初始电压// 公式法计算目标Codeint formulaCode tester.calculateTrimCode(TARGET_VOLTAGE, initialVoltage);double formulaVoltage tester.measureVoltage(formulaCode);// 验证公式法结果是否在目标范围内bool isFormulaPass (formulaVoltage LOWER_BOUND) (formulaVoltage UPPER_BOUND);// 输出公式法验证结果std::cout 公式法验证 std::endl;std::cout 初始Code: initialCode | 初始电压: std::fixed std::setprecision(4) initialVoltage V\n;std::cout 目标电压: TARGET_VOLTAGE V ± TOLERANCE * 1000 mV\n;std::cout 公式法目标Code: formulaCode | 实测电压: formulaVoltage V\n;std::cout 公式法结果: (isFormulaPass ? PASS : FAIL) [ LOWER_BOUND V ~ UPPER_BOUND V]\n;// 公式法失败时执行线性法和二分法if (!isFormulaPass) {// 线性搜索法执行int linearCode tester.linearSearchTrim(formulaCode, LOWER_BOUND, UPPER_BOUND);double linearVoltage tester.measureVoltage(linearCode);bool linearPass (linearVoltage LOWER_BOUND) (linearVoltage UPPER_BOUND);// 二分搜索法执行int binaryCode tester.binarySearchTrim(formulaCode, LOWER_BOUND, UPPER_BOUND);double binaryVoltage tester.measureVoltage(binaryCode);bool binaryPass (binaryVoltage LOWER_BOUND) (binaryVoltage UPPER_BOUND);// 输出对比报告std::cout \n 方法对比报告 std::endl;std::cout | 方法 | 最终Code | 最终电压 | 结果 |\n;std::cout |——–|———-|————|——-|\n;std::cout | 线性法 | std::setw(8) linearCode | std::setw(8) linearVoltage V | (linearPass ? PASS : FAIL) |\n;std::cout | 二分法 | std::setw(8) binaryCode | std::setw(8) binaryVoltage V | (binaryPass ? PASS : FAIL) |\n;}return 0; }对比线性法和二分法的结果
- 上一篇: 百度网盟推广有哪些网站开发小程序软件的公司
- 下一篇: 百度网站html验证公众号开发者权限怎么开
相关文章
-
百度网盟推广有哪些网站开发小程序软件的公司
百度网盟推广有哪些网站开发小程序软件的公司
- 技术栈
- 2026年03月21日
-
百度网盟 网站定向做网站还是做app好
百度网盟 网站定向做网站还是做app好
- 技术栈
- 2026年03月21日
-
百度网络公司杭州网站seo价格
百度网络公司杭州网站seo价格
- 技术栈
- 2026年03月21日
-
百度网站html验证公众号开发者权限怎么开
百度网站html验证公众号开发者权限怎么开
- 技术栈
- 2026年03月21日
-
百度网站ip地址山东岩海建设资源有限公司网站
百度网站ip地址山东岩海建设资源有限公司网站
- 技术栈
- 2026年03月21日
-
百度网站安全在线检测网站部署
百度网站安全在线检测网站部署
- 技术栈
- 2026年03月21日






