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.
工具与软件:
你(们)好
我具有 ADS1115设置并按预期工作(大多数情况下)、使用连接的电路。
我需要通过光电二极管检测 UV 照度级别(这一侧的效果都很好)
我的问题是通道0在300 - 600 "点"左右波动、而其他读数稳定且不变。
这使得准确地控制光照度水平几乎是不可能的、我已经在几个不同的板上进行了测试、因此它不仅仅是一个。
我在线阅读过、更改多路复用器可能会导致问题、但这只会发生在4个通道中的一个通道上。
当我只从一个通道(任何一个)读取时、电平相当稳定、可能会波动1或2分。
奇怪的是、当我在代码中使用断点来检测该值何时被更改100以上时、即使 I2C 线始终获得新值也不会出现问题、但当我从主机 PC 端请求该断点时、断点会触发。 (从主机 PC 到 MCU 的通信采用 UART 1.5M 波特)
因此发送命令似乎是个问题(从主机到 MCU、而不是始终运行的 ADS1115)、但仅对于通道0、我已在其他通道上尝试过执行此操作、即使通常会触发问题、我也没有看到问题。
但如果我将其更改为仅从一个通道读取并使用相同的命令、则不会出现问题。
我正在使用的代码如下所示:
void UV_Process() { // need a switch case to keep this to none blocking code. unsigned char UV_ADSwrite[6]; unsigned char UV_ADSread[6]; UV_ADSwrite[0] = 0x01; // channel info setting. UV_ADSwrite[2] = 0x83; //10000011 LSB // Run to adjust / set the PWM UV level CHECK that the hood is closed first, set to ZERO unless the hood is closed. if(UV_Control.setpoint > 0 && HAL_GPIO_ReadPin(Hood_Close1_GPIO_Port, Hood_Close1_Pin) && HAL_GPIO_ReadPin(Hood_Close2_GPIO_Port, Hood_Close2_Pin)) { if(UV_CHN == 0) { //uv_dc = UV_PID_Set(&UV_Control, &UV_status); __HAL_TIM_SET_COMPARE(UV_PWM_TIM, UV_PWM_CH, UV_Control.setpoint); } } else { __HAL_TIM_SET_COMPARE(UV_PWM_TIM, UV_PWM_CH, 0); } switch(UV_reader_steps) { case(UV_send): if(UV_CHN == 0) { UV_ADSwrite[1] = 0x42; // select channel and start conversion // Try 0xC1 } else if(UV_CHN == 1) { UV_ADSwrite[1] = 0x52; // select channel and start conversion // Try 0xD1 } else if(UV_CHN == 2) { UV_ADSwrite[1] = 0x62; // select channel and start conversion // Try 0xE1 } else if(UV_CHN == 3) { UV_ADSwrite[1] = 0x72; // select channel and start conversion // Try 0xF1 } // Send the info and then move on to the next part HAL_I2C_Master_Transmit(&hi2c1, UV_ADDRESS << 1, UV_ADSwrite, 3, 100); // specify format and send data command UV_ADSwrite[0] = 0x00; HAL_I2C_Master_Transmit(&hi2c1, UV_ADDRESS << 1 , UV_ADSwrite, 1 ,100); UV_reader_steps = UV_wait; // go to next step UV_Wait = HAL_GetTick(); break; case(UV_wait): // this needs to wait until 20mS has passed for conversion to work after change of MUX Reg in ADC if((HAL_GetTick() - UV_Wait) > 20) { UV_reader_steps = UV_read; } break; case(UV_read): // get the reading HAL_I2C_Master_Receive(&hi2c1, UV_ADDRESS <<1, UV_ADSread, 2, 100); UV_Data_Send.UV_Levels[UV_CHN] = (UV_ADSread[0] << 8 | UV_ADSread[1] ); UV_reader_steps = UV_send; UV_CHN++; // go to the next channel. if(UV_CHN > 3) // loop back to the first channel. { UV_CHN = 0; if(UV_Send_Data) { // Function call to send UV data to Controller } } break; } }
任何输入都很好、我通过4个单端电压测量0到3.3V 之间的电压。
我曾尝试过降低 SPS、但没有太大改善。
我想知道是否设置了时序和 Reg 命令以便它们不会相互干扰、整个代码处于超循环中、其他函数和进程正在运行。
EG、这需要处于瞬时模式还是连续模式可以工作?
MCU 采用 STM32F103并采用 C 语言编写
尊敬的 Travis:
让我看看,我会在一周结束时回到你。
此致、
天使
尊敬的 Travis:
您提到仅从一个通道读取时、输出是稳定的、但在循环使用多路复用器(读取4个单端输入)时、您会遇到该问题。
器件是在单次转换模式下运行还是在连续转换模式下运行?
如果配置寄存器在正在进行的转换期间(或在连续转换模式下运行)发生更改、新配置将在正在进行的转换完成之前生效。 与许多其他 Δ-Σ 器件不同、新配置不会重置数字滤波器并重新启动转换。 这可能使人不清楚上一次转换何时完成以及新一次转换何时开始。
建议在多路复用器的持续循环时使用单次模式。
此外、我们建议在 ADC 的输入端添加限流电阻/输入滤波、以防止过压和 噪声/抗混叠 、因为您的原理图捕获中不存在这些电阻器/滤波器。
您是否测试了输出(OUT_A/OUT_B)、以防此处出现噪声、而噪声又会反映在输出代码中?
[quote userid="568800" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1387699/ads1115-ads1115-3-out-of-4-channels-steady-readings-but-the-4th-has-too-much-noise 我想知道计时和 Reg 命令是否设置为不相互干扰、整个代码处于超级循环中、其他函数和进程正在运行。验证时序和寄存器命令是否设置正确的理想方法是在向寄存器发出读取或写入命令时使用逻辑分析仪或示波器并探测数字通信线路。 这将使您能够验证数字通信是否符合数据表中显示的规格和图表。
对于问题是否与您设置微控制器和代码的方式有关、我们没有太多的意见可以评论。
此致、
天使
你(们)好
我想知道的一点是、我使用的寄存器设置是否正确且顺序正确。
我已将寄存器设置从0x42/0x52/0x62 0x72 (也具有寄存器的0x83标准部分)更改为/ 0xC3/0xD3/0xE3 / 0xF3这应该告诉它可以使用单次模式并保持断电模式、但与继续模式中的第一个选项相比、这些 Reg 值产生的噪声更高、而且当我只从一个通道读取时读取数据时、它的读数完全稳定。
这些设置产生的噪声会跨所有通道产生、而不仅仅是一个通道。
尊敬的 Travis:
我明天会回到你身边。
此致、
天使
你好、Travis
[报价 userid="568800" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1387699/ads1115-ads1115-3-out-of-4-channels-steady-readings-but-the-4th-has-too-much-noise/5318524 #5318524"]我已将寄存器设置从0x42/0x52/0x62 0x72 (也具有0x83标准寄存器的一半)更改为/ 0xC3/0xD3/0xE3/0xF3这应该告诉它使用一次性模式[/QUOT]这些寄存器设置看起来是正确的。
在循环中、要设置配置、等待转换完成、读取转换结果、然后设置下一个配置和重复、或者程序中使用的流程是什么?
与继续模式下的第一个选项相比、这些 Reg 值产生的噪声更大、
您能详细说明一下看到的内容吗? 在相同的数据速率下、使用单次转换模式与连续转换模式时的噪声水平不应有太大差异、因此这是奇数。
[报价 userid="568800" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1387699/ads1115-ads1115-3-out-of-4-channels-steady-readings-but-the-4th-has-too-much-noise/5318524 #5318524"]当我仅从一个通道读取数据时、读取结果非常稳定。
这些设置产生的噪声会跨所有通道产生、而不仅仅是一个通道。
[报价]这似乎很不清楚你看到了什么。 只读取一个通道时、您会看到良好的结果、但通过多路复用器循环时、所有通道都会出现不良结果、您在这里意味着什么?
[quote userid="568800" url="~/support/data-converters-group/data-converters/f/data-converters-forum/1387699/ads1115-ads1115-3-out-of-4-channels-steady-readings-but-the-4th-has-too-much-noise 我想知道计时和 Reg 命令是否设置为不相互干扰、整个代码处于超级循环中、其他函数和进程正在运行。我建议使用逻辑分析仪来探测通信线路、并验证您的代码是否按预期工作。
此致、
天使
你好、Angel
我的循环序列是:
发送0x83C3 //指定设置并开始读取
发送0x00 //这我被告知指定数据格式(我尝试了没有这一点,它似乎没有区别)
等待20ms //让 ADC 转换读数。
从 ADS1115读取并保存至通道0数据
这会 对通道0、1、2和3重复使用0x83C3/0x83D3/0x83E3 /0x83F3
然后返回并重新开始。
所有通道上的噪声都是一个代码问题、我认为这个问题已经解决、因为它不再出现。
但当我从通道0 (或任何单通道)连续读取并且不更改多路复用器时、读数是稳定的、只有当我开始更改周围的信号时、它才会出现第一次重复的循环。
我最后两次从通道0读取并丢弃第一个值、这给了我一个更干净的读数、但我仍然不知道为什么。
尊敬的 Travis:
循环序列似乎没有问题。
所有通道的噪声是一个代码问题、我认为该问题已经解决、因为它不再出现。
问题似乎可能来自代码/固件。 同样、最好探测通信线路、以确保一切正常。
如果您确保等待足够的时间、使用延迟来等待转换完成应该是可以的、但您也可以使用转换就绪引脚来查看转换何时完成。 如果读取的转换结果是新结果或不是新结果、这有助于消除歧义。
此致、
天使