工具与软件:
你(们)好
我具有 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 语言编写