SOLVED: How can I reduce ADC jitter


+ Reply to Thread
Results 1 to 40 of 96

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,161


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    The Vdd that resistors are connected to, is the exact same point that PIC Vdd pin is connected also?

    Ioannis

  2. #2
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    Quote Originally Posted by Ioannis View Post
    The Vdd that resistors are connected to, is the exact same point that PIC Vdd pin is connected also?

    Ioannis

    Yes, it is.
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

  3. #3
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,161


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    Temperature (heating or cooling PIC) has any effect on the drift?

    Ioannis

  4. #4
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    Quote Originally Posted by Ioannis View Post
    Temperature (heating or cooling PIC) has any effect on the drift?

    Ioannis
    I'm curious how can this help me?

    It is room temperature, just like target customer environment (gaming).

    It's not like I'm overclocking the PIC like a PC CPU...?
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

  5. #5
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,161


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    If the ADC result has no or minimal effect because of temp then we have to look elsewhere for the drift.

    Ioannis

  6. #6
    Join Date
    Jan 2011
    Location
    Sydney, Australia
    Posts
    172


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    I would try the following:

    1/. Use the Fixed Voltage Reference (FVR) instead of Vdd as your ADC reference voltage.
    2/. Add some capacitance - say 100nF - between the pot wiper and ground.

    Cheers
    Barry
    VK2XBP

  7. #7
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    Quote Originally Posted by Aussie Barry View Post
    I would try the following:

    1/. Use the Fixed Voltage Reference (FVR) instead of Vdd as your ADC reference voltage.
    2/. Add some capacitance - say 100nF - between the pot wiper and ground.

    Cheers
    Barry
    VK2XBP
    1. Yeah, FVR is on my TO-DO list (Richard mentioned it up there).

    2. Does it matter if the cap is at the switch or up against PIC (like decoupler caps).

    3. Temp is also on my TO-DO list.
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

  8. #8
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: How can I reduce ADC drift

    Quote Originally Posted by Aussie Barry View Post
    I would try the following:

    1/. Use the Fixed Voltage Reference (FVR) instead of Vdd as your ADC reference voltage.
    2/. Add some capacitance - say 100nF - between the pot wiper and ground.

    Cheers
    Barry
    VK2XBP

    Ok, finally got back to working on my ADC jitters:

    - FOSC/128, 111111, 4.0 uS at 32 MHz
    - using FVR x 4
    - added 0.1uF at ADC pin

    No change, still jitters. I took at the manual averaging routine; it doesn't go to the extreme ends (rarely get completely to 0 or 1024 because of jittter).

    I'd like to try one of those COMPUTATION FEATURES, but I'm not sure which is better for me, nor what I need to properly set in the registers:

    - Basic: essentially what I'm doing now.
    - Accumulate,
    - Average,
    - Burst Average,
    - Low-Pass Filter.


    I'm testing 2 pots on this board; 1 regular, 1 with switch.

    Code:
    #CONFIG
        __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON
        __config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
        __config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_OFF & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
        __config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_OFF
        __config _CONFIG5, _CP_OFF & _CPD_OFF
    #ENDCONFIG
    
    DEFINE OSC 32
    
    DEFINE  ADC_BITS 10                 ' 10-bit Analog to digital
                                            
    DEFINE  LCD_DREG      PORTB         ' Set LCD data port
    DEFINE  LCD_DBIT      0             ' Set starting data bit
    DEFINE  LCD_RSREG     PORTC         ' Set LCD register select port
    DEFINE  LCD_RSBIT     4             ' Set LCD register select bit
    DEFINE  LCD_EREG      PORTC         ' Set LCD enable port
    DEFINE  LCD_EBIT      5             ' Set LCD enable bit
    DEFINE  LCD_BITS      4             ' Set LCD bus size
    DEFINE  LCD_LINES     4             ' Set number of lines on LCD
    DEFINE  LCD_COMMANDUS 1000          ' Set command delay time in microseconds
    DEFINE  LCD_DATAUS    50            ' Set data delay time in microseconds
    
    define  CCP1_REG     0              ' Must clear unused CCP pins or else unpredictable results
    DEFINE  CCP1_BIT     0
    define  CCP2_REG     0
    DEFINE  CCP2_BIT     0
    define  CCP3_REG     PORTB          ' PWM Pulse out to LCD backlight
    DEFINE  CCP3_BIT     5
    define  CCP4_REG     0              ' Must clear unused CCP pins or else unpredictable results
    DEFINE  CCP4_BIT     0
    define  CCP5_REG     0
    DEFINE  CCP5_BIT     0
    
    FVRCON = %10000011                  ' FIXED VOLTAGE REFERENCE CONTROL REGISTER
    '   bit 7   FVREN: Fixed Voltage Reference Enable bit
    '       --->    1 = Fixed Voltage Reference is enabled
    '               0 = Fixed Voltage Reference is disabled
    '   bit 6   FVRRDY: Fixed Voltage Reference Ready Flag bit(1)
    '               1 = Fixed Voltage Reference output is ready for use
    '               0 = Fixed Voltage Reference output is not ready or not enabled
    '   bit 5   TSEN: Temperature Indicator Enable bit(3)
    '               1 = Temperature Indicator is enabled
    '               0 = Temperature Indicator is disabled
    '   bit 4   TSRNG: Temperature Indicator Range Selection bit(3)
    '               1 = VOUT = VDD - 4VT (High Range)
    '               0 = VOUT = VDD - 2VT (Low Range)
    '   bit 3-2 CDAFVR<1:0>: Comparator FVR Buffer Gain Selection bits
    '               11 = Comparator FVR Buffer Gain is 4x, (4.096V)(2)
    '               10 = Comparator FVR Buffer Gain is 2x, (2.048V)(2)
    '               01 = Comparator FVR Buffer Gain is 1x, (1.024V)
    '               00 = Comparator FVR Buffer is off
    '   bit 1-0 ADFVR<1:0>: ADC FVR Buffer Gain Selection bit
    '       --->    11 = ADC FVR Buffer Gain is 4x, (4.096V)(2)
    '               10 = ADC FVR Buffer Gain is 2x, (2.048V)(2)
    '               01 = ADC FVR Buffer Gain is 1x, (1.024V)
    '               00 = ADC FVR Buffer is off
    '
    ' Note  1: FVRRDY is always ‘1’ for PIC16F18855/75 devices only.
    '       2: Fixed Voltage Reference output cannot exceed VDD.
    
    CCP3CON = %10001111                 ' CCP3 CONTROL REGISTER
    '   bit 7   EN: CCPx Module Enable bit
    '               1 = CCPx is enabled
    '               0 = CCPx is disabled
    '   bit 6   Unimplemented: Read as ‘0’
    '   bit 5   OUT: CCP3 Output Data bit (read-only)
    '   bit 4   FMT: CCPW (Pulse Width) Alignment bit
    '       MODE = Capture mode
    '           Unused
    '       MODE = Compare mode
    '           Unused
    '       MODE = PWM mode
    '           1 = Left-aligned format
    '           0 = Right-aligned format
    '   bit 3-0 MODE<3:0>: CCPx Mode Select bits(1)
    '     --->  1111 = PWM mode
    '           1110 = Reserved
    '           1101 = Reserved
    '           1100 = Reserved
    '           1011 = Compare mode: output will pulse 0-1-0; Clears TMR1
    '           1010 = Compare mode: output will pulse 0-1-0
    '           1001 = Compare mode: clear output on compare match
    '           1000 = Compare mode: set output on compare match
    '           0111 = Capture mode: every 16th rising edge of CCPx input
    '           0110 = Capture mode: every 4th rising edge of CCPx input
    '           0101 = Capture mode: every rising edge of CCPx input
    '           0100 = Capture mode: every falling edge of CCPx input
    '           0011 = Capture mode: every edge of CCPx input
    '           0010 = Compare mode: toggle output on match
    '           0001 = Compare mode: toggle output on match; clear TMR1
    '           0000 = Capture/Compare/PWM off (resets CCPx module)
    
    ADCON0 = %10000100                  ' ADC CONTROL REGISTER 0
    '   bit 7   ADON: ADC Enable bit
    '        --->   1 = ADC is enabled
    '               0 = ADC is disabled
    '   bit 6   ADCONT: ADC Continuous Operation Enable bit
    '               1 = ADGO is retriggered upon completion of each conversion trigger until ADTIF is set (if ADSOI is
    '                   set) or until ADGO is cleared (regardless of the value of ADSOI)
    '        --->   0 = ADGO is cleared upon completion of each conversion trigger
    '   bit 5   Unimplemented: Read as ‘0’
    '   bit 4   ADCS: ADC Clock Selection bit
    '               1 = Clock supplied from FRC dedicated oscillator
    '        --->   0 = Clock supplied by FOSC, divided according to ADCLK register
    '   bit 3   Unimplemented: Read as ‘0’
    '   bit 2   ADFRM0: ADC results Format/alignment Selection
    '        --->   1 = ADRES and ADPREV data are right-justified
    '               0 = ADRES and ADPREV data are left-justified, zero-filled
    '   bit 1   Unimplemented: Read as ‘0’
    '   bit 0   ADGO: ADC Conversion Status bit
    '               1 = ADC conversion cycle in progress. Setting this bit starts an ADC conversion cycle. The bit is
    '                   cleared by hardware as determined by the ADCONT bit
    '        --->   0 = ADC conversion completed/not in progress
    
    ADCLK = %00111111                   ' ADC CLOCK SELECTION REGISTER
    '   bit 7-6 Unimplemented: Read as ‘0’
    '   bit 5-0 ADCCS<5:0>: ADC Conversion Clock Select bits
    '        --->   111111 = FOSC/128
    '               111110 = FOSC/126
    '               111101 = FOSC/124
    '                  •
    '               000000 = FOSC/2
    
    ADPCH = %00000000                   ' ADC POSITIVE CHANNEL SELECTION REGISTER
    '   bit 7-6 Unimplemented: Read as ‘0’
    '   bit 5-0 ADPCH<5:0>: ADC Positive Input Channel Selection bits
    '               111111 = Fixed Voltage Reference (FVR)
    '               111110 = DAC1 output
    '               111101 = Temperature Indicator
    '               111100 = AVSS (Analog Ground)
    '               111011 = Reserved. No channel connected.
    '               •
    '               •
    '               •
    '               100010 = ANE2       * 16F18877 only
    '               100001 = ANE1       * 16F18877 only
    '               100000 = ANE0       * 16F18877 only
    '               011111 = AND7       * 16F18877 only
    '               011110 = AND6       * 16F18877 only
    '               011101 = AND5       * 16F18877 only
    '               011100 = AND4       * 16F18877 only
    '               011011 = AND3       * 16F18877 only
    '               011010 = AND2       * 16F18877 only
    '               011001 = AND1       * 16F18877 only
    '               011000 = AND0       * 16F18877 only
    '               010111 = ANC7
    '               010110 = ANC6
    '               010101 = ANC5
    '               010100 = ANC4
    '               010011 = ANC3
    '               010010 = ANC2
    '               010001 = ANC1
    '               010000 = ANC0
    '               001111 = ANB7
    '               001110 = ANB6
    '               001101 = ANB5
    '               001100 = ANB4
    '               001011 = ANB3
    '               001010 = ANB2
    '               001001 = ANB1
    '               001000 = ANB0
    '               000111 = ANA7
    '               000110 = ANA6
    '               000101 = ANA5
    '               000100 = ANA4
    '               000011 = ANA3
    '               000010 = ANA2
    '        --->   000001 = ANA1
    '        --->   000000 = ANA0
    
    ANSELA = %00000011                      ' Pin A1 = ADC
                                            ' Pin A0 = ADC
    ANSELB = %00000000
    ANSELC = %00000000
    
    TRISA = %00000111                       ' Pin A2 = SW input 1
                                            ' Pin A1 = ADC input 1
                                            ' Pin A0 = ADC input 0
    TRISB = %00000000
    TRISC = %00000000
    
    SW1                 var PORTA.2
    
    ADCinput            var WORD
    
    OldADC0             var WORD
    OldADC1             var WORD
    OldSW1              var BYTE
    NewADC0             var WORD
    NewADC1             var WORD
    
    HPWMbacklight       var BYTE
    
    '    Pause 200                           ' Let PIC and LCD stabilize
        ADCinput = 0
        OldADC0 = 9999
        OldADC1 = 9999
        OldSW1 = 9
        NewADC0 = 0
        NewADC1 = 0
        HPWMbacklight = 150
    
        HPWM 3,HPWMbacklight,1953
        LCDOUT $FE, 1 : Pauseus 1
        LCDOUT $FE, $80, "      ADC test" : Pauseus 1
        LCDOUT $FE, $94, "ADC 0:" : Pauseus 1
        LCDOUT $FE, $D4, "ADC 1:       SW:" : Pauseus 1
    
    Mainloop:
    
    rem                             ADC 0
    
        ADPCH = %00000000
        adcin 0, ADCinput
        NewADC0 = 1023 - ADCinput
        
        if NewADC0 <> oldadc0 then
            oldadc0 = NewADC0
            LCDOUT $FE, $94+7, DEC4 oldadc0 : Pauseus 1
        endif
    
    rem                             ADC 1
    
        ADPCH = %00000001
        adcin 1, ADCinput
        NewADC1 = 1023 - ADCinput
    
        if NewADC1 <> oldadc1 then
            oldadc1 = NewADC1
            LCDOUT $FE, $D4+7, DEC4 oldadc1 : Pauseus 1
        endif
    
    rem                             SW 1
        
        if SW1 <> oldSW1 then
            oldSW1 = SW1
            IF OldSW1 = 0 THEN
                LCDOUT $FE, $D4+17, "Off" : Pauseus 1
            else
                LCDOUT $FE, $D4+17, "On " : Pauseus 1
            endif
        endif
    
        HPWMbacklight = 255 - (NewADC0 / 4)
        HPWM 3,HPWMbacklight,1953
    
      GOTO Mainloop
    end
    My Creality Ender 3 S1 Plus is a giant paperweight that can't even be used as a boat anchor, cause I'd be fined for polluting our waterways with electronic devices.

    Not as dumb as yesterday, but stupider than tomorrow!

Similar Threads

  1. SOLVED - IOC works on B0 but not B5
    By Demon in forum General
    Replies: 19
    Last Post: - 26th September 2024, 21:11
  2. Replies: 6
    Last Post: - 5th November 2023, 16:26
  3. trying to reduce current consumption on a 12HV615
    By Max Power in forum mel PIC BASIC Pro
    Replies: 8
    Last Post: - 30th November 2011, 14:57
  4. Unwanted output signal jitter
    By LinkMTech in forum mel PIC BASIC Pro
    Replies: 20
    Last Post: - 18th January 2008, 02:31
  5. Dmx Solved !!!!!!!
    By oscar in forum mel PIC BASIC Pro
    Replies: 18
    Last Post: - 2nd July 2005, 21:57

Members who have read this thread : 16

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts