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