Patch Submodule CV in calibration

Hi everyone.
I started to make a digital VCO with a patch submodule cause I was tired to get my VCOs out of tune during live shows and I was wondering something.
When it receives no signal (and even connected to GND) the adc result of a CV_Input is not zero at all.
For instance :
float cvValue = patch.GetAdcValue(CV_1);
Here cvValue will note be equal 0.0f when no signal will come to it.
If I add a kind of small offset (something like 0.02) I can fix the value.
So my question is : is it normal? I could imagine ADC converter could have some noisy results … Also the value tends to fluctuate a litlle when the Patch Submodule is warming up.
Does somebody have ever experienced this same particular issue? How to fix this?
I imagine many solutions :

  • adding an offset (but this could fluctuate with time)
  • automatically “retune” the VCO when there’s not a lot of movement in the CV input
  • make something like, if the CV value is < x (like 0.02 or something) make it equal 0 (but this sounds like a bad idea)

Thanks for your help

These offsets are normal due to part tolerances etc in the CV scaling and offset circuits.

In my commercially available module, Warp Core, I am also using Patch SM, and in order to calibrate tuning for “perfect” predictability in the absence of CV, I am taking an ADC reading of each CV input with nothing connected and storing that in flash as the “actual” 0V value. Then I just subtract the recorded 0V value from every reading during normal usage. This ensures that I get a true 0.0 from the ADCs (or something very close to it). I did not do any sort of deadzoning for CV inputs (the last bullet point, what you said “sounds like a bad idea”) but I do that for potentiometers, especially bipolar ones, so it’s easy to get to the true zero point, minimum, and maximum on the knobs regardless of any offsets between units.

This has worked very well so far. From my observations over building, calibrating, and testing over 100 units, the offsets don’t really fluctuate over time; they are a little different on each unit but the 0V readings captured during calibration remain accurate over repeated usage, etc.

The big selling point of this all is very easy to get “perfect” nominal tuning out of the module, which it sounds like you’re trying to achieve as well :slight_smile:

1 Like

Thanks for your answer !

Yes I figured out that every CV_IN have its own offset; after some measurement and calibration it is fine.

I also saw that the curve needs to be calibrated too … I mean for a VCO, I have something like 0.97V/oct or 0.98V/oct on CV_IN to get a strong accuracy.

I also figured out it’s normal for a VCO to need some little calibration, since I multiply the voltage value per 60 and then make a mtof on it, every little imprecision gives a little out of tune effect.

I was wondering what you meant by “mtof”. I googled it and found:
https://paulbatchelor.github.io/sndkit/mtof/
is that what you meant?

Yes, exactly.
There is already a mtof function inside daisysp by the way, so it is very easy to use.