AS7341 ADC Fullscale and LED Illumination Control
Getting interactive control over AS7341 sensor parameters helped me better understand their effect on resulting data. Interactive control over sensor integration time (photography analogy: exposure time) made it easy for me to see how the data reacted mostly linearly until they reach their limit. I had known the AS7341 ADCs were 16-bit, so I thought the limit is always 65535. This is wrong: it is actually 65535 OR ADCfullscale, whichever is lower.
I came across ADCfullscale in the datasheet but I didn't understand what that information meant at the time. I had mistakenly thought it placed a limit on integration time, as it is calculated from integration time parameters "atime" and "astep" with the formula (atime+1)*(astep+1). Now I know it does not limit integration time but is actually a cap on ADC values if that formula results in less than 65535. For example, right now I'm running with a fixed "astep" of 3596 which corresponded roughly to 10 milliseconds per "atime". If I configure "atime" to 9, (atime+1)*(astep+1) = (10)*(3597) = 35970 is the sensor saturation limit ADCfullscale. Not 65535.
Another thing I learned was that my original plan for "LED stay on" parameter wouldn't work. I had designed it to be a parameter sent alongside atime, astep, and gain at the beginning of sensor read. It seemed reasonable enough until I tried to design a control to toggle whether we are going to read the sensor continuously. When will the user toggle that to be "OFF"? Odds are, such toggle would happen while we are in the middle of sensor integration. By that time, it was too late to communicate LED should be turned off.
Oh well, mistakes like this happen. That useless "led_stay_on" parameter was removed, and I added code so "led_ma" could be a valid operation by itself without triggering a sensor read. This lets me adjust the LED illumination (usually turning it off) without performing a sensor read. Just another instance where iterative development is useful, updating my design as I go.
Code for this project is publicly available on GitHub