Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 3 of 3

Thread: adc->setConversionSpeed(ADC_VERY_LOW_SPEED, ADC_1) isn't working for me anymore

  1. #1

    adc->setConversionSpeed(ADC_VERY_LOW_SPEED, ADC_1) isn't working for me anymore

    The code lines in question can be found in the examples adc_adb and analogRead.

    Both of these lines fail for me under Arduino 1.8.5 and Teensyduino 1.41:

    Code:
    adc_pdb:45: error: 'VERY_LOW_SPEED' was not declared in this scope
         adc->setConversionSpeed(VERY_LOW_SPEED, ADC_1);
    
    adc_pdb:45: error: 'ADC_VERY_LOW_SPEED' was not declared in this scope
         adc->setConversionSpeed(ADC_VERY_LOW_SPEED, ADC_1);
    In contrast, this line does work (as seen in the analogRead example):

    Code:
    adc->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_LOW _SPEED, ADC_1);

    I noticed this problem during an attempt to update a project that I had started in September 2017 (probably using Arduino 1.8.0 and whatever Teensyduino was current at that time). The code that I can't compile now was never a problem within that prior environment, throughout dozens of compile cycles.

    OS: Windows 7 64-bit
    Target: Teensy 3.5

    My project is back on track using that working version. I posting here on the chance that there is either a bug or a new paradigm that can affect the existing projects of other people.

  2. #2

  3. #3
    Quote Originally Posted by manitou View Post
    Thank you for that reference.

    Submitted with respect to the author of the ADC library, here is a working update of adc_pdb:

    Code:
    /* Example for triggering the ADC with PDB
    *   Valid for Teensy 3.0 and 3.1, not LC
    *   
    *   In Teensyduino version 1.41 and above there are new forms of the following calls. 
    *     (conversionspeed can be VERY_LOW_SPEED, LOW_SPEED, MED_SPEED, HIGH_SPEED_16BITS, HIGH_SPEED or VERY_HIGH_SPEED)
    *     (samplingspeed   can be VERY_LOW_SPEED, LOW_SPEED, MED_SPEED, HIGH_SPEED or VERY_HIGH_SPEED)
    *     (adcnumber       can be ADC_0 or ADC_1)
    *   Obsolete forms:
    *     adc->setConversionSpeed(conversionspeed, adcnumber);  
    *     adc->setSamplingSpeed(samplingspeed, adcnumber);
    *   Current forms:
    *     adc->setConversionSpeed(ADC_CONVERSION_SPEED::conversionspeed, adcnumber);
    *     adc->setSamplingSpeed(ADC_SAMPLING_SPEED::samplingspeed, adcnumber);
    *     
    *   Serial monitor commands
    *     v [Enter]    print values
    *     s Hz [Enter] start pdb, frequency in Hz
    *     p [Enter]    pdb stats
    */
    
    
    #include <ADC.h>
    
    const int readPin  = A9; // ADC0
    const int readPin2 = A2; // ADC1
    
    ADC *adc = new ADC();    // adc object;
    
    void setup() {
    
        pinMode(LED_BUILTIN, OUTPUT);
        pinMode(readPin, INPUT);
        pinMode(readPin2, INPUT);
    
        Serial.begin(9600);
    
        Serial.println("Begin setup");
    
        ///// ADC0 ////
        // reference can be ADC_REFERENCE::REF_3V3, ADC_REFERENCE::REF_1V2 (not for Teensy LC) or ADC_REF_EXT.
        //adc->setReference(ADC_REFERENCE::REF_1V2, ADC_0); // change all 3.3 to 1.2 if you change the reference to 1V2
    
        adc->setAveraging(1);  // set number of averages
        adc->setResolution(8); // set bits of resolution
        
        // it can be VERY_LOW_SPEED, LOW_SPEED, MED_SPEED, HIGH_SPEED_16BITS, HIGH_SPEED or VERY_HIGH_SPEED
        // see the documentation for more information
        adc->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_HIGH_SPEED, ADC_0); // change the conversion speed 
        
        // it can be VERY_LOW_SPEED, LOW_SPEED, MED_SPEED, HIGH_SPEED or VERY_HIGH_SPEED
        adc->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED, ADC_0); // change the sampling speed
        adc->enableInterrupts(ADC_0);    // it's necessary to enable interrupts for PDB to work (why?)
    
        adc->analogRead(readPin, ADC_0); // call this to setup everything before the pdb starts
    
    
        ////// ADC1 /////
        #if ADC_NUM_ADCS>1
        adc->setAveraging(32, ADC_1);  // set number of averages
        adc->setResolution(16, ADC_1); // set bits of resolution
    
        adc->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_LOW_SPEED, ADC_1); // change the conversion speed 
        adc->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_LOW_SPEED, ADC_1); // change the sampling speed
        
        adc->enableInterrupts(ADC_1);
    
        adc->analogRead(readPin2, ADC_1); // call this to setup everything before the pdb starts
        #endif
    
        Serial.println("End setup");
    
    }
    
    char c=0;
    int value;
    int value2;
    
    void loop() {
    
        if (Serial.available()) {
            c = Serial.read();
            if(c=='v') { // value
                Serial.print("Value ADC0: ");
                value = (uint16_t)adc->analogReadContinuous(ADC_0); // the unsigned is necessary for 16 bits, otherwise values larger than 3.3/2 V are negative!
                Serial.println(value*3.3/adc->getMaxValue(ADC_0), DEC);
                #if ADC_NUM_ADCS>1
                Serial.print("Value ADC1: ");
                value2 = (uint16_t)adc->analogReadContinuous(ADC_1); // the unsigned is necessary for 16 bits, otherwise values larger than 3.3/2 V are negative!
                Serial.println(value2*3.3/adc->getMaxValue(ADC_1), DEC);
                #endif
            } else if(c=='s') { // start pdb, before pressing enter write the frequency in Hz
                uint32_t freq = Serial.parseInt();
                Serial.print("Start pdb with frequency ");
                Serial.print(freq);
                Serial.println(" Hz.");
                adc->adc0->stopPDB();
                adc->adc0->startPDB(freq); //frequency in Hz
                #if ADC_NUM_ADCS>1
                adc->adc1->stopPDB();
                adc->adc1->startPDB(freq); //frequency in Hz
                #endif
            } else if(c=='p') { // pbd stats
                Serial.print("Prescaler:");
                Serial.println( (PDB0_SC&0x7000)>>12 , HEX);
                Serial.print("Mult:");
                Serial.println( (PDB0_SC&0xC)>>2, HEX);
            }
    
        }
    
    
    
        /* fail_flag contains all possible errors,
            They are defined in  ADC_Module.h as
    
            ADC_ERROR_OTHER
            ADC_ERROR_CALIB
            ADC_ERROR_WRONG_PIN
            ADC_ERROR_ANALOG_READ
            ADC_ERROR_COMPARISON
            ADC_ERROR_ANALOG_DIFF_READ
            ADC_ERROR_CONT
            ADC_ERROR_CONT_DIFF
            ADC_ERROR_WRONG_ADC
            ADC_ERROR_SYNCH
    
            You can compare the value of the flag with those masks to know what's the error.
        */
    
        if(adc->adc0->fail_flag) {
            Serial.print("ADC0 error flags: 0x");
            Serial.println(adc->adc0->fail_flag, HEX);
            if(adc->adc0->fail_flag == ADC_ERROR_COMPARISON) {
                adc->adc0->fail_flag &= ~ADC_ERROR_COMPARISON; // clear that error
                Serial.println("Comparison error in ADC0");
            }
        }
        #if ADC_NUM_ADCS>1
        if(adc->adc1->fail_flag) {
            Serial.print("ADC1 error flags: 0x");
            Serial.println(adc->adc1->fail_flag, HEX);
            if(adc->adc1->fail_flag == ADC_ERROR_COMPARISON) {
                adc->adc1->fail_flag &= ~ADC_ERROR_COMPARISON; // clear that error
                Serial.println("Comparison error in ADC1");
            }
        }
        #endif
    
        //digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN));
    
        //delay(100);
    }
    
    
    // If you enable interrupts make sure to call readSingle() to clear the interrupt.
    void adc0_isr() {
            adc->adc0->readSingle();
            //digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN) );
    }
    
    #if ADC_NUM_ADCS>1
    void adc1_isr() {
            adc->adc1->readSingle();
            digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN) );
    }
    #endif
    
    // pdb interrupt is enabled in case you need it.
    void pdb_isr(void) {
            PDB0_SC &=~PDB_SC_PDBIF; // clear interrupt
            //digitalWriteFast(LED_BUILTIN, !digitalReadFast(LED_BUILTIN) );
    }
    All of the other provided ADC examples do work.

    However, the headers in the examples readAllPins and readPin are non-relevant copies of the header from analogContinuousRead

Posting Permissions

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