• AVR Freaks

Hot!Help with instrument tuner code

Page: 12 > Showing page 1 of 2
Author
didierleplae
Super Member
  • Total Posts : 214
  • Reward points : 0
  • Joined: 2019/03/31 16:57:50
  • Location: 0
  • Status: offline
2021/01/03 17:30:01 (permalink)
0

Help with instrument tuner code

Hi,
I'm writing code for a chromatic tuner. It's part of a larger project I'm working on using a PIC16F1769, so memory is running low and I'd like to figure out a more efficient way of doing this and hopefully more accurate as well.
 
My code is quite verbose and I'm not sure that I'm using floating point math correctly. This is actually the first time I've tried using a "float" variable, so any suggestions would be greatly appreciated.
This code also only covers two octaves but I will eventually want it to span at least a few octaves
 
The only float variable is the "freqHz". TMR2 and TMR4 are both 8-bit timers set to 500ms interval using LFINTOSC and 1:64 prescaler. 
 
The DISPLAY() functions are for a 7 segment display. 
tunerFlashDelay is incremented by another timer.
 

while (tunerMode){
if (PIR1bits.TMR2IF == 1){ ///Timer2 interrupt
PIR1bits.TMR2IF = 0;
freqHz = (CCPinterrupts + (TMR4/0xFF))*2;
CCPinterrupts = 0;
TMR2sync = 1;
}

if (PIR1bits.CCP1IF){ ///CCP interrupt
PIR1bits.CCP1IF = 0;
if (TMR2sync == 1) TMR2 = 0;
TMR2sync = 0;
CCPinterrupts++;
TMR4 = 0;
}

if (tunerFlash){ ///Display flash
if (tunerFlashDelay > 15) {
numDisplay = ~numDisplay;
tunerFlashDelay = 0;
}
}
else numDisplay = 1;

if (numDisplay){
if (freqHz < 124) {DISPLAY(13); DSPLY_5_LAT = 1; tunerFlash = 1;} ///Lower Line
else if (freqHz >= 124 && freqHz < 132.5) { //C3
DISPLAY(19);
DSPLY_5_LAT = 1;
if (freqHz > 129 && freqHz < 132.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 0;
}
else if (freqHz >= 132.5 && freqHz < 140) { //Db3
DISPLAY(21);
DSPLY_5_LAT = 0;
if (freqHz > 136 && freqHz < 140) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 1;
}
else if (freqHz >= 140 && freqHz < 147) { //D3
DISPLAY(21);
DSPLY_5_LAT = 1;
if (freqHz > 144 && freqHz < 147) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 2;
}
else if (freqHz >= 147 && freqHz < 156.25) { //Eb3
DISPLAY(22);
DSPLY_5_LAT = 0;
if (freqHz > 153.75 && freqHz < 156.25) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 3;
}
else if (freqHz >= 156.25 && freqHz < 165) { //E3
DISPLAY(22);
DSPLY_5_LAT = 1;
if (freqHz > 162 && freqHz < 165) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 4;
}
else if (freqHz >= 165 && freqHz < 175) { //F3
DISPLAY(24);
DSPLY_5_LAT = 1;
if (freqHz > 174 && freqHz < 175) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 5;
}
else if (freqHz >= 175 && freqHz < 186) { //Gb3
DISPLAY(25);
DSPLY_5_LAT = 0;
if (freqHz > 183.5 && freqHz < 186) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 6;
}
else if (freqHz >= 186 && freqHz < 196.5) { //G3
DISPLAY(25);
DSPLY_5_LAT = 1;
if (freqHz > 193.5 && freqHz < 196.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 7;
}
else if (freqHz >= 196.5 && freqHz < 208.25) { //Ab3
DISPLAY(16);
DSPLY_5_LAT = 0;
if (freqHz > 205.5 && freqHz < 208.25) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 8;
}
else if (freqHz >= 208.25 && freqHz < 220.5) { //A3
DISPLAY(16);
DSPLY_5_LAT = 1;
if (freqHz > 217.5 && freqHz < 220.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 9;
}
else if (freqHz >= 220.5 && freqHz < 234) { //Bb3
DISPLAY(18);
DSPLY_5_LAT = 0;
if (freqHz > 231 && freqHz < 234) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 10;
}
else if (freqHz >= 234 && freqHz < 248) { //B3
DISPLAY(18);
DSPLY_5_LAT = 1;
if (freqHz > 245 && freqHz < 248) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 11;
}
else if (freqHz >= 248 && freqHz < 261) { //C4
DISPLAY(19);
DSPLY_5_LAT = 1;
if (freqHz > 259 && freqHz < 261) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 0;
}
else if (freqHz >= 261 && freqHz < 276.5) { //Db4
DISPLAY(21);
DSPLY_5_LAT = 0;
if (freqHz > 274 && freqHz < 276.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 1;
}
else if (freqHz >= 276.5 && freqHz < 293) { //D4
DISPLAY(21);
DSPLY_5_LAT = 1;
if (freqHz > 291 && freqHz < 293) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 2;
}
else if (freqHz >= 293 && freqHz < 310.5) { //Eb4
DISPLAY(22);
DSPLY_5_LAT = 0;
if (freqHz > 307.75 && freqHz < 310.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 3;
}
else if (freqHz >= 310.5 && freqHz < 328.5) { //E4
DISPLAY(22);
DSPLY_5_LAT = 1;
if (freqHz > 325.5 && freqHz < 328.5) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 4;
}
else if (freqHz >= 328.5 && freqHz < 349) { //F4
DISPLAY(24);
DSPLY_5_LAT = 1;
if (freqHz > 345.5 && freqHz < 349) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 5;
}
else if (freqHz >= 349 && freqHz < 370) { //Gb4
DISPLAY(25);
DSPLY_5_LAT = 0;
if (freqHz > 367 && freqHz < 370) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 6;
}
else if (freqHz >= 370 && freqHz < 391) { //G4
DISPLAY(25);
DSPLY_5_LAT = 1;
if (freqHz > 388 && freqHz < 391) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 7;
}
else if (freqHz >= 391 && freqHz < 414) { //Ab4
DISPLAY(16);
DSPLY_5_LAT = 0;
if (freqHz > 411 && freqHz < 414) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 8;
}
else if (freqHz >= 414 && freqHz < 439) { //A4
DISPLAY(16);
DSPLY_5_LAT = 1;
if (freqHz > 435 && freqHz < 439) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 9;
}
else if (freqHz >= 439 && freqHz < 465) { //Bb4
DISPLAY(18);
DSPLY_5_LAT = 0;
if (freqHz >= 460 && freqHz < 465) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 10;
}
else if (freqHz >= 465 && freqHz < 492) { //B4
DISPLAY(18);
DSPLY_5_LAT = 1;
if (freqHz > 489 && freqHz < 492) {tunerFlash = 0; numDisplay = 1;}
else tunerFlash = 1;
rootNote = 11;
}
else if (freqHz >492) {DISPLAY(12); DSPLY_5_LAT = 1; tunerFlash = 1;} ///Upper Line
}
else {DISPLAY(10); DSPLY_5_LAT = 1;}   ///Blank display
}

post edited by didierleplae - 2021/01/10 17:08:05
#1

39 Replies Related Threads

    Murton Pike Systems
    Super Member
    • Total Posts : 139
    • Reward points : 0
    • Joined: 2020/09/10 02:13:01
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/03 18:01:03 (permalink)
    +1 (1)
    I would have thought simplest way would be to square up signal then measure length of pulses for one cycle.
     
    I must admit I have tried inputting guitar signals before into a micro and its not always simple.
    The signal is often not a good sine wave.
     
    A more complicated way is to do a fast Fourier transform on the signal.
    But it needs quite a bit of memory and is heavy on calculations so maybe not the best idea.
     
     
    #2
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/03 19:47:03 (permalink)
    0
    I should have mentioned, this will not be used for guitar, just nice clean synth waves, so no need for fast Fourier transform.

    Doing the way you’re suggesting I think would require the clock to interrupt at something like every couple of microseconds which I think was bogging down the code, but maybe I’m missing something.

    Essentially what I am doing is measuring the number of cycles per 1/2 second clock cycle and then trying to get the remainder (fraction of a clock cycle from another clock)
    #3
    davea
    Super Member
    • Total Posts : 585
    • Reward points : 0
    • Joined: 2016/01/28 13:12:13
    • Location: Tampa Bay FL USA
    • Status: offline
    Re: Help with instrument tuner code 2021/01/03 21:26:01 (permalink)
    0
    it seams like a divide and concur would be faster
    and gating a timer for 1/2 sec would results in +/- 2hz  (1sec 1hz)
    or measuring the period, averaged over 1/2 sec using a CCP and ZCD
    you would most likely not need a float
    500hz is not that fast
    #4
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/03 21:54:09 (permalink)
    +1 (1)
    davea
    it seams like a divide and concur would be faster

    Can you explain what you mean by this? Is “ divide and concur” an actual thing or a typo?

    500hz is not that fast

    I would like to get it working into higher frequencies, perhaps up to 5 kHz.
    #5
    davea
    Super Member
    • Total Posts : 585
    • Reward points : 0
    • Joined: 2016/01/28 13:12:13
    • Location: Tampa Bay FL USA
    • Status: offline
    Re: Help with instrument tuner code 2021/01/03 22:05:25 (permalink)
    0
    its like pic a number from (1 to 20)  and have some guess it then you say higher or lower
    there first guess would be 10 and so on...
     
    #6
    NKurzman
    A Guy on the Net
    • Total Posts : 19106
    • Reward points : 0
    • Joined: 2008/01/16 19:33:48
    • Location: 0
    • Status: online
    Re: Help with instrument tuner code 2021/01/03 23:59:17 (permalink)
    +1 (1)
    One thing your code doesn’t require a floating point number. Your current code could actually deal with a 16 but number. Where 156.25 could be the integer 15625.
    Now at 5 kHz 16 bit number would only get to one decimal point. If you needed more decimal points you would need to go up to a 32 bit number. The math would be bigger than 16 bit but still smaller than a float.
    But if that is your only concern it would make more sense to use a chip with more memory.
    #7
    ric
    Super Member
    • Total Posts : 29434
    • Reward points : 0
    • Joined: 2003/11/07 12:41:26
    • Location: Australia, Melbourne
    • Status: online
    Re: Help with instrument tuner code 2021/01/04 00:08:20 (permalink)
    +2 (2)
    You could just multiply all the numbers by 4 to eliminate the fractions.
    Half of the comparisons in the if else blocks are redundant.

    I also post at: PicForum
    Links to useful PIC information: http://picforum.ric323.co...opic.php?f=59&t=15
    NEW USERS: Posting images, links and code - workaround for restrictions.
    To get a useful answer, always state which PIC you are using!
    #8
    blue_led
    New Users
    • Total Posts : 28
    • Reward points : 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 03:08:22 (permalink)
    +1 (1)
    NKurzman
    One thing your code doesn’t require a floating point number. Your current code could actually deal with a 16 but number. Where 156.25 could be the integer 15625.
    Now at 5 kHz 16 bit number would only get to one decimal point. If you needed more decimal points you would need to go up to a 32 bit number. The math would be bigger than 16 bit but still smaller than a float.
    But if that is your only concern it would make more sense to use a chip with more memory.



    With external quartz at 20 Mhz ...5 MIPS ... 5 kHz signal ... 5000 loops/second ...one loop is maximum 1000 instructions to make all decisions needed . I have doubt any C compiler can make code with 32 bits calculations that fit into 1000 instructions. 
    Personally I choose capture compare module with asm code and lookup tables.
     
    Instead of endless if statements more elegant code use switch statement ( with intervals ) like this example:
     
    switch(frequency)
    {
        case 4 ... 7:    
            ...... ; break;
        case 9 ... 12:
            .......; break;
        case 3 ... 13:    
            .......; break;
        case 14 ... 69:
            .......; break;
        default:
            .......;
    }


     
    post edited by blue_led - 2021/01/04 08:29:25
    #9
    1and0
    Access is Denied
    • Total Posts : 11747
    • Reward points : 0
    • Joined: 2007/05/06 12:03:20
    • Location: Harry's Gray Matter
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 03:44:20 (permalink)
    +2 (2)
    didierleplae
    The only float variable is the "freqHz". TMR2 and TMR4 are both 8-bit timers ...
     
    freqHz = (CCPinterrupts + (TMR4/0xFF))*2;

    if (numDisplay){
      if (freqHz < 124) {DISPLAY(13); DSPLY_5_LAT = 1; tunerFlash = 1;} ///Lower Line
      else if (freqHz >= 124 && freqHz < 132.5) { //C3
        DISPLAY(19);
        DSPLY_5_LAT = 1;
        if (freqHz > 129 && freqHz < 132.5) {tunerFlash = 0; numDisplay = 1;}
        else tunerFlash = 1;
        rootNote = 0;
      }
      else if (freqHz >= 132.5 && freqHz < 140) { //Db3
      // snipped
    }


    This
    freqHz = (CCPinterrupts + (TMR4/0xFF))*2;

    will NOT result in a number with any fractional digits other than zero, since it's all integer math. ;)

    Your maximum value for "freqHz" is just >492, meaning "CCPinterrupts" must be an 8-bit value. So, replace the above statement with this
    freqHz = (CCPinterrupts << 8) | TMR4;

    to use a 16-bit integer instead of a float variable, and at the same time it avoids a division and multiplication.

    As Ric said, half of the comparisons in your if-else are redundant, and this
    numDisplay = 1;

    inside the if-else is also redundant, unless it is supposed to be assigned a value of 0 too.

    By the way, the [ code ] tags use [ ] and not < >.
     
    #10
    Antipodean
    Super Member
    • Total Posts : 1984
    • Reward points : 0
    • Joined: 2008/12/09 10:19:08
    • Location: Didcot, United Kingdom
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 05:15:02 (permalink)
    +2 (2)
    didierleplae
    davea
    it seams like a divide and concur would be faster

    Can you explain what you mean by this? Is “ divide and concur” an actual thing or a typo?

     
    What he means is an English expression "divide and conquer". You divide up a problem into smaller pieces then 'conquer' each piece in turn.
    didierleplae
    500hz is not that fast

    I would like to get it working into higher frequencies, perhaps up to 5 kHz.



    I suspect you are approching this the wrong way. there is a very old microchip application note for a frequency counter using a 16C family chip that goes into the megahertz region which I believe could be modified for the chip you are using.

    Do not use my alias in your message body when replying, your message will disappear ...

    Alan
    #11
    1and0
    Access is Denied
    • Total Posts : 11747
    • Reward points : 0
    • Joined: 2007/05/06 12:03:20
    • Location: Harry's Gray Matter
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 06:09:23 (permalink)
    0
    Anti-podean
    didierleplae
    Can you explain what you mean by this? Is “ divide and concur” an actual thing or a typo?

    What he means is an English expression "divide and conquer". You divide up a problem into smaller pieces then 'conquer' each piece in turn.

    I thought Dave meant to do a binary search. ;)
     
    Anti-podean
    didierleplae
    I would like to get it working into higher frequencies, perhaps up to 5 kHz.

    I suspect you are approching this the wrong way. there is a very old microchip application note for a frequency counter using a 16C family chip that goes into the megahertz region which I believe could be modified for the chip you are using.

    AN592 describes a frequency counter using Timer0 to read frequencies up to 50 MHz.
     
    post edited by 1and0 - 2021/01/04 06:12:13
    #12
    Antipodean
    Super Member
    • Total Posts : 1984
    • Reward points : 0
    • Joined: 2008/12/09 10:19:08
    • Location: Didcot, United Kingdom
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 12:40:02 (permalink)
    +1 (1)
    1and0
    Anti-podean
    didierleplae
    Can you explain what you mean by this? Is “ divide and concur” an actual thing or a typo?

    What he means is an English expression "divide and conquer". You divide up a problem into smaller pieces then 'conquer' each piece in turn.

    I thought Dave meant to do a binary search. ;)
     
    Anti-podean
    didierleplae
    I would like to get it working into higher frequencies, perhaps up to 5 kHz.

    I suspect you are approching this the wrong way. there is a very old microchip application note for a frequency counter using a 16C family chip that goes into the megahertz region which I believe could be modified for the chip you are using.

    AN592 describes a frequency counter using Timer0 to read frequencies up to 50 MHz.
     

     
    Well, a binary search is one option - depends how many and what sort of bugs one is chasing ... 
     
    Yas, that is the AN I was thinking of.
     
     

    Do not use my alias in your message body when replying, your message will disappear ...

    Alan
    #13
    Howard Long
    Super Member
    • Total Posts : 861
    • Reward points : 0
    • Joined: 2005/04/04 08:50:32
    • Status: online
    Re: Help with instrument tuner code 2021/01/04 13:47:30 (permalink)
    +3 (3)
    How frequently does the OP require a result? Presumably not that often considering it's updating a display. Maybe a 10Hz update frequency?
     
    How accurate does it have to be? You say it's a "nice clean synth wave" but haven't said how you've derived the frequency, or how the synth wave is captured - is it from an ADC or a digital IO? What signal conditioning is there?
     
    As it stands, a const struct lookup table would dramatically reduce the amount of code, and would be more scalable.
     
    Definitely avoid float if at all possible, as others have suggested, by scaling.
     
    There are a lot of ways to skin this cat!
     
     
    #14
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 17:55:13 (permalink)
    0
    I really appreciate all of these suggestions!
    I had a look at AN592 and am trying a different approach based on that. 
    I'm setting my incoming signal as the clock source of a 16bit timer, TMR5. I'm using another 16bit timer to interupt 3 times a second, making my freqHz = TMR5*3 and then resetting TMR5.
     
    This seems to be a much simpler approach. 
    post edited by didierleplae - 2021/01/04 18:08:30
    #15
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 18:06:52 (permalink)
    0
    Howard Long
    How frequently does the OP require a result? Presumably not that often considering it's updating a display. Maybe a 10Hz update frequency?

    I think 10Hz would be ideal but a bit slower could be ok as well. It seems a higher update frequency may lower the accuracy
     
    Howard Long
    How accurate does it have to be? You say it's a "nice clean synth wave" but haven't said how you've derived the frequency, or how the synth wave is captured - is it from an ADC or a digital IO? What signal conditioning is there?

    The signal to be measured is being inputted from an external synthesizer and then fed through an op amp comparator circuit and then a 1k resistor to RA5. 
    I had been using the CCP capture to read the frequency but as I mentioned above i'm using it as the clock source of TMR5 currently. No ADC.
    Accuracy should probably be around +-5 cents. 
     
    post edited by didierleplae - 2021/01/04 18:11:47
    #16
    dan1138
    Super Member
    • Total Posts : 4157
    • Reward points : 0
    • Joined: 2007/02/21 23:04:16
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 20:31:41 (permalink)
    +2 (2)
    From what I can comprehend of the content provided by the Original Poster(OP) I do not see anything like a coherent description of the waveform to be measured.
     
    If this project is supposed to be a frequency counter that displays the input on a tempered chromatic scale using 7-segment LED displays then the code posted so far seem kind of broken.
     
    What is the resolution of the chromatic scale you want to use? (how many notes and their center frequencies)
     
    What is the acceptance band of each note? (lowest and highest frequency acceptable for each note to be displayed)
     
    Do the acceptance bands overlap or is there a dead band between notes?
     
    Perhaps the OP could do with some more experience with embedded controller project jargon.
    #17
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/04 23:40:38 (permalink)
    0
    dan1138
    What is the resolution of the chromatic scale you want to use? (how many notes and their center frequencies)
     
    What is the acceptance band of each note? (lowest and highest frequency acceptable for each note to be displayed)
     
    Do the acceptance bands overlap or is there a dead band between notes?

    Some details I am still working out, but the code I uploaded above covers the chromatic scale in a two octave range (C3 - B4)
    I mentioned above that I would like to expand the range to a few octaves. In reality, I will expand it to as many octaves as I can realistically accomplish with my constraints. 
    The display is a single 7-segment display (one digit), so in the above code, the letter representing the note flashes when flat and becomes solid within a narrow range of the correct pitch for that note. (~ +-5 cents)
    There would not be any overlap or dead band between notes. 
     
    dan1138
    Perhaps the OP could do with some more experience with embedded controller project jargon.

    I agree and that is why I’m here asking questions. I am very open to suggestions.
    #18
    blue_led
    New Users
    • Total Posts : 28
    • Reward points : 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/05 04:01:15 (permalink)
    +1 (1)
    Aditionally you can add something like that : led bargraph. Simetrical ( green led in the middle and red outside ) or like that below, when blue remaining you have perfect pitch .
    16F1769 is a powerfull machine.
    What do you thik to measure, period of the signal or you count periods in amount of time ?
    #19
    didierleplae
    Super Member
    • Total Posts : 214
    • Reward points : 0
    • Joined: 2019/03/31 16:57:50
    • Location: 0
    • Status: offline
    Re: Help with instrument tuner code 2021/01/05 11:25:01 (permalink)
    0
    blue_led
    Aditionally you can add something like that : led bargraph. Simetrical ( green led in the middle and red outside ) or like that below, when blue remaining you have perfect pitch .16F1769 is a powerfull machine.

    Unfortunately, this is just a small part of a larger project, so I don’t have room for anything more, otherwise I would certainly add something like the led bar graph.



    What do you thik to measure, period of the signal or you count periods in amount of time ?

    So far I have been counting periods in amount of time, but I would consider the other way as well. Would that perhaps be more accurate?
    post edited by didierleplae - 2021/01/05 11:27:38
    #20
    Page: 12 > Showing page 1 of 2
    Jump to:
    © 2021 APG vNext Commercial Version 4.5