David's dead reckoning code for the LVBots competition on March 6th. Uses the mbed LPC1768, DRV8835, QTR-3RC, and two DC motors with encoders.

Dependencies:   PololuEncoder Pacer mbed GeneralDebouncer

Files at this revision

API Documentation at this revision

Comitter:
DavidEGrayson
Date:
Tue Mar 04 02:09:54 2014 +0000
Parent:
29:cfcf08d8ac79
Child:
31:739b91331f31
Commit message:
Seems like the QTR-3RC could work, based on my tests on P10.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
test.cpp Show annotated file Show diff for this revision Revisions of this file
test.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Mar 04 00:46:18 2014 +0000
+++ b/main.cpp	Tue Mar 04 02:09:54 2014 +0000
@@ -46,7 +46,7 @@
     //testCalibrate();
     //testLineFollowing();
     //testAnalog();
-    testAnalogReadWithFilter();
+    testSensorGlitches();
 
     // Real routines for the contest.
     loadCalibration();
--- a/test.cpp	Tue Mar 04 00:46:18 2014 +0000
+++ b/test.cpp	Tue Mar 04 02:09:54 2014 +0000
@@ -16,27 +16,102 @@
 void __attribute__((noreturn)) infiniteReckonerReportLoop();
 void printBar(const char * name, uint16_t adcResult);
 
-void testAnalogReadWithFilter()
+uint16_t readPin18()
+{
+    // Set PCADC bit in PCONP register.  (Table 46).
+    LPC_SC->PCONP |= (1 << 12);
+    
+    // Select PCLK_ADC in PCLKSEL0 register. (Table 40, Table 531).
+    LPC_SC->PCLKSEL0 |= (3 << 24);  // PCLK for ADC = CCLK/8 
+    
+    // Enable ADC0 through PINSEL registers.  (Section 8.5).
+    LPC_PINCON->PINSEL1 = (LPC_PINCON->PINSEL1 & ~(3 << 20)) | (1 << 20);
+    
+    // Pin 18: P0.26/AD0.3/AOUT/RXD3
+    
+    // 7:0   Bitmap to select what channel to use
+    // 15:8  Select clock.
+    // 16    BURST = 0
+    // 20:17 Reserved
+    // 21    PDN = 1, A/D converter is operational
+    // 26:24 START = 001 to start conversion now
+    LPC_ADC->ADCR = (1 << 3) | (0xFF << 8) | (1 << 21);
+    LPC_ADC->ADCR |=  (1 << 24);  
+    
+    while(!(LPC_ADC->ADGDR >> 31 & 1))  // while not done
+    {
+    }
+    //return 2;
+    return LPC_ADC->ADGDR & 0xFFFF;
+}
+
+uint16_t readP10()
+{
+    DigitalInOut pin(p10);
+    pin.output();
+    pin = 1;
+    wait_us(20);
+    uint16_t value = 0x8000;
+    Timer timer;
+    timer.start();
+    pin.input();
+    while(timer.read_us() < 0x8000)
+    {
+        if(pin.read() == 0)
+        {
+            return timer.read_us();   
+        }
+    }
+    return value;
+}
+
+void testSensorGlitches()
 {
     AnalogIn testInput(p18);
     Pacer reportPacer(1000000);
     uint32_t badCount = 0, goodCount = 0;
+    pc.printf("hi\r\n");
+    
+    //uint16_t riseCount = 0;
+    uint16_t reading = 0xFF;
+    
     while(1)
     {
-        uint16_t reading = analogReadWithFilter(&testInput);
+        /** This digital filtering did not work
+        {
+            wait(0.01);
+            uint16_t raw = testInput.read_u16();
+            if (raw < reading)
+            {
+                riseCount = 0;
+                reading = raw;
+            }
+            else
+            {
+                riseCount++;
+                if (riseCount == 10)
+                {
+                    riseCount = 0;
+                    reading = raw;   
+                }
+            }
+        }
+        **/
+        reading = readP10();
+        
         if(reading > 100)
         {
             badCount += 1;
-            pc.printf("f %5d %11d %11d\r\n", reading, badCount, goodCount);   
+            //pc.printf("f %5d %11d %11d\r\n", reading, badCount, goodCount);
         }
         else
         {
-            goodCount += 1;   
+            goodCount += 1;
         }
         
         if (reportPacer.pace())
         {
-            pc.printf("Hello\r\n");   
+            pc.printf("h %5d %11d %11d\r\n", reading, badCount, goodCount);
         }
     }
 }
--- a/test.h	Tue Mar 04 00:46:18 2014 +0000
+++ b/test.h	Tue Mar 04 02:09:54 2014 +0000
@@ -10,4 +10,4 @@
 void __attribute__((noreturn)) testCalibrate();
 void __attribute__((noreturn)) testLineFollowing();
 void __attribute__((noreturn)) testAnalog();
-void __attribute__((noreturn)) testAnalogReadWithFilter();
+void __attribute__((noreturn)) testSensorGlitches();