您好、先生:
我们在逐次逼近模式下使用前端0 (EADC 和 DAC 一起)、同时我们发现了一些时序问题;
当在 V33上升之前或期间 EAP0/EAN0上存在偏置电压(大约1V)时、最终 的 SAR 计算始终为零、您知道原因吗? 如果偏置电压不可避免、如何在这种情况下使用 SAR? 非常感谢;
已连接波形;CH1:V33、CH2:EAP0/EAN0;
非常感谢;
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.
e2e.ti.com/.../LAB-EADC0-20181128.zip
附加了源代码、您可以使用开环板上的 UCD3138进行尝试、EAP0/EAN0=1.033V;
你好、Jun
我可以在开环板上重复这个问题。 感谢您的关注。
即使前端输入电压在3.3V 达到标称值几毫秒后从0升至1.0V、也会发生这种情况、因此这似乎是一个真正的问题。
我对前端 SAR 模式的理解不够、无法为您提供可行的解决方案。
除此之外、遗憾的是、我们的大多数设计人员目前正在旅行或度假(由于圣诞节假期)、这似乎是一个需要一些时间才能理解的问题、因此我不能保证很快就能解决任何问题。
有一种解决方案肯定会起作用、但它涉及在固件中运行逐次逼近算法。 它可以在标准中断中定期运行。 我们以前使用过这种解决方案、它非常可靠。 如果这对您有效、我建议您选择这条路线。
这种方法的缺点是
-它受带宽限制(如果您每100us 调用一次标准中断、则有效采样率将为1ms)
-它使用 MIPS 和程序闪存,因为它基于固件
无论如何、请参阅下面的内容。 目标是移动 EADCDAC、直到它处于输入电压范围内、然后获取 ABS_VALUE。
我只是测试了这个、以确保它正常工作、您看到的问题不存在。
首先删除 main.c 文件中与前端0相关的所有代码。
然后将下面的代码添加到后台循环之前的 main.c 中(作为初始化的一部分)。 我已将其设置为平均值计算、如果您需要更高的带宽、请将 EADC_MODE 设置为0、将 AFE_GAIN 设置为0、并删除 AVG_MODE_SEL 设置。
FeCtrl0Regs.EADCDAC.bit.DAC_value = 16384>>>1; //将 DAC 初始值设置为 DAC 范围的一半
FeCtrl0Regs.EADCCTRL.bit.AFE_GAIN = 3; //增益=功率(2、AFE_GAIN)
FeCtrl0Regs.EADCCTRL.bit.SCFE_GAIN_FILTER_SEL = 1; //启用开关电容噪声滤波器
FeCtrl0Regs.EADCCTRL.bit.SCFE_CLK_DIV_2=0; // 0 =采样@ 8MHz、1 =采样@ 16MHz
// EADC_MODE
// 0 =标准模式、基于 DPWM 模块采样触发器的 EADC 采样(默认)
// 1 =平均模式、由 AVG_MODE_SEL 配置
// 2 =非连续 SAR 模式
// 3 =连续 SAR 模式
FeCtrl0Regs.EADCCTRL.bit.EADC_MODE = 1;
FeCtrl0Regs.EADCCTRL.bit.AVG_MODE_SEL = 2;//为每个 EADC 触发器选择要平均的2^(AVG_MODE_SEL+1)样本
我假设您已经设置了代码来定期调用 IRQ、比如100us? 您需要执行此操作才能使算法正常工作(实际上、您还可以在后台循环中运行它、我没有尝试过、但它应该可以正常运行)。
接下来、将以下函数添加到 standard_interrupt.c 中
内联 void front_end0_SAR (void)
{
//逐次逼近搜索输出电压预偏置电平
//此测量可用于设置 EADC 斜坡的启动代码
//请注意、我们将 EADCDAC 视为14位 DAC、即使它实际上是具有4个抖动位的10位 DAC
//将其视为14位 DAC 意味着我们可以将字直接写入整个 EADCDAC 寄存器
//在中标度代码(14位 DAC、因此2^14 = 16384个代码)处开始搜索
//将搜索步骤初始化为四分之一量程代码
静态 uint32 eadcdac_step = 16384>>2;
// eadcvalue:用于提高效率的 EADCVAUE 本地副本
易失性联合 EADCVALUE_REG eadcvalue;
eadcvalue = FeCtrl0Regs.EADCVAUE;
// eADC_Value = Veadcdac - V (EAP - EAN)、其中 Veadcdac 是 EADCDAC 的输出电压
//如果 eADC_SAT_HIGH =1:V (EAP - EAN)< Veadcdac:通过减少 DAC 代码来减少 Veadcdac
//如果 eADC_SAT_LOW = 1:V (EAP - EAN)> Veadcdac:通过增加 DAC 代码来增加 Veadcdac
//如果 eADC_SAT_HIGH =0且 eADC_SAT_LOW =0:取绝对值并从该值计算 EADCDAC 斜坡启动值
如果((eadcvalue.bit.eADC_SAT_HIGH =0)&&(eadcvalue.bit.eADC_SAT_LOW ==0))
{
// EADC 未饱和、因此 ABS_VALUE 有效
//将结果放置在 fe0_SAR_READING 中,这是一个全局变量
fe0_SAR_reading = eadcvalue.bit.abs_value;
eadcdac_step = 16384>>2;//重置搜索步骤
}
其他
{
// EADC 为高饱和或低饱和
//首先检查搜索步骤是否已减小到 LSB 大小,如果是这样,搜索已结束,因此我们需要重新开始搜索
if (eadcdac_step == 0x8)
{
// EADCDAC 寄存器:10位 DAC 字被4位偏移。 4 LSB =抖动位、因此我们将其视为14位 DAC、然后可以执行寄存器大小写入
//因此、当 eadcdac_step = 0x8时、连续逼近型搜索的结论是10位 DAC 的 LSB 已经被使用
//在本例中,再次开始搜索
FeCtrl0Regs.EADCDAC.ALL = 16384>>1;//将 DAC 值重置为中标度代码
eadcdac_step = 16384>>2;//将搜索步骤重置为四分之一标度代码
}
否则// EADC 已饱和,且连续逼近搜索尚未结束
{
if (eadcvalue.bit.eADC_SAT_HIGH)
{
// EADC 饱和高,因此 V (EAP - EAN)< Veadcdac:减少 veadcdac
FeCtrl0Regs.EADCDAC.ALL = FeCtrl0Regs.EADCDAC.ALL - eadcdac_step;
}
否则// eadcvalue.bit.eADC_SAT_LOW = 1.
{
// EADC 饱和低,因此 V (EAP - EAN)> Veadcdac:增加 veadcdac
FeCtrl0Regs.EADCDAC.ALL = FeCtrl0Regs.EADCDAC.ALL + eadcdac_step;
}
eadcdac_step = eadcdac_step>>>1;// step = step /2
}
}
}
将以下全局变量添加到 variables.h 它用于存储 SAR 结果、因此从内存调试器上的该变量中读取结果。
extern uint32 fe0_SAR_reading;
最后、调用函数 FRONT_end0_SAR 作为标准中断 ISR 的一部分、如下所示
#pragma INTERRUPT (standard_interrupt、IRQ)
#pragma CODE_STATE (STANDARD_INTERRUPT、32)// 16 = Thumb 模式、32 = ARM 模式
void standard_interrupt (void)
{
FRONT_end0_SAR ();
您可以根据需要将其从逐次逼近更改为线性搜索、采样率将会更低、但固件将更简单、更小。
如果您有疑问或意见、请告诉我。
此致
Cormac