defines changed from TARGET_LPC1768 to TARGET_LPC176X to support LPC1769 target
Fork of FastAnalogIn by
FastAnalogIn.h@6:e2a98449ae58, 2014-04-21 (annotated)
- Committer:
- Sissors
- Date:
- Mon Apr 21 10:02:07 2014 +0000
- Revision:
- 6:e2a98449ae58
- Parent:
- 5:55274430c8df
- Child:
- 7:965a2b0e477f
Small fix in ifdef
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sissors | 0:c2a7b899e6c7 | 1 | #ifndef FASTANALOGIN_H |
Sissors | 0:c2a7b899e6c7 | 2 | #define FASTANALOGIN_H |
Sissors | 0:c2a7b899e6c7 | 3 | |
Sissors | 0:c2a7b899e6c7 | 4 | /* |
Sissors | 0:c2a7b899e6c7 | 5 | * Includes |
Sissors | 0:c2a7b899e6c7 | 6 | */ |
Sissors | 0:c2a7b899e6c7 | 7 | #include "mbed.h" |
Sissors | 0:c2a7b899e6c7 | 8 | #include "pinmap.h" |
Sissors | 0:c2a7b899e6c7 | 9 | |
Sissors | 6:e2a98449ae58 | 10 | #if !defined TARGET_LPC1768 && !defined TARGET_KLXX && !defined TARGET_LPC408X |
Sissors | 0:c2a7b899e6c7 | 11 | #error "Target not supported" |
Sissors | 0:c2a7b899e6c7 | 12 | #endif |
Sissors | 0:c2a7b899e6c7 | 13 | |
humlet | 5:55274430c8df | 14 | /** A class similar to AnalogIn, only faster, for LPC1768, LPC408X and KLxx |
frankvnk | 2:9b61d0792927 | 15 | * |
frankvnk | 2:9b61d0792927 | 16 | * AnalogIn does a single conversion when you read a value (actually several conversions and it takes the median of that). |
frankvnk | 2:9b61d0792927 | 17 | * This library runns the ADC conversion automatically in the background. |
frankvnk | 2:9b61d0792927 | 18 | * When read is called, it immediatly returns the last sampled value. |
frankvnk | 3:a9b753c25073 | 19 | * |
humlet | 5:55274430c8df | 20 | * LPC1768 / LPC4088 |
humlet | 5:55274430c8df | 21 | * Using more ADC pins in continuous mode will decrease the conversion rate (LPC1768:200kHz/LPC4088:400kHz). |
frankvnk | 2:9b61d0792927 | 22 | * If you need to sample one pin very fast and sometimes also need to do AD conversions on another pin, |
frankvnk | 2:9b61d0792927 | 23 | * you can disable the continuous conversion on that ADC channel and still read its value. |
frankvnk | 3:a9b753c25073 | 24 | * |
frankvnk | 3:a9b753c25073 | 25 | * KLXX |
frankvnk | 3:a9b753c25073 | 26 | * Multiple Fast instances can be declared of which only ONE can be continuous (all others must be non-continuous). |
frankvnk | 3:a9b753c25073 | 27 | * |
frankvnk | 3:a9b753c25073 | 28 | * When continuous conversion is disabled, a read will block until the conversion is complete |
frankvnk | 3:a9b753c25073 | 29 | * (much like the regular AnalogIn library does). |
frankvnk | 2:9b61d0792927 | 30 | * Each ADC channel can be enabled/disabled separately. |
frankvnk | 2:9b61d0792927 | 31 | * |
frankvnk | 3:a9b753c25073 | 32 | * IMPORTANT : It does not play nicely with regular AnalogIn objects, so either use this library or AnalogIn, not both at the same time!! |
frankvnk | 2:9b61d0792927 | 33 | * |
frankvnk | 2:9b61d0792927 | 34 | * Example for the KLxx processors: |
frankvnk | 2:9b61d0792927 | 35 | * @code |
frankvnk | 2:9b61d0792927 | 36 | * // Print messages when the AnalogIn is greater than 50% |
frankvnk | 2:9b61d0792927 | 37 | * |
frankvnk | 2:9b61d0792927 | 38 | * #include "mbed.h" |
frankvnk | 2:9b61d0792927 | 39 | * |
frankvnk | 3:a9b753c25073 | 40 | * FastAnalogIn temperature(PTC2); //Fast continuous sampling on PTC2 |
frankvnk | 3:a9b753c25073 | 41 | * FastAnalogIn speed(PTB3, 0); //Fast non-continuous sampling on PTB3 |
frankvnk | 2:9b61d0792927 | 42 | * |
frankvnk | 2:9b61d0792927 | 43 | * int main() { |
frankvnk | 2:9b61d0792927 | 44 | * while(1) { |
frankvnk | 2:9b61d0792927 | 45 | * if(temperature > 0.5) { |
frankvnk | 2:9b61d0792927 | 46 | * printf("Too hot! (%f) at speed %f", temperature.read(), speed.read()); |
frankvnk | 2:9b61d0792927 | 47 | * } |
frankvnk | 2:9b61d0792927 | 48 | * } |
frankvnk | 2:9b61d0792927 | 49 | * } |
frankvnk | 2:9b61d0792927 | 50 | * @endcode |
frankvnk | 2:9b61d0792927 | 51 | * Example for the LPC1768 processor: |
frankvnk | 2:9b61d0792927 | 52 | * @code |
frankvnk | 2:9b61d0792927 | 53 | * // Print messages when the AnalogIn is greater than 50% |
frankvnk | 2:9b61d0792927 | 54 | * |
frankvnk | 2:9b61d0792927 | 55 | * #include "mbed.h" |
frankvnk | 2:9b61d0792927 | 56 | * |
frankvnk | 3:a9b753c25073 | 57 | * FastAnalogIn temperature(p20); |
frankvnk | 2:9b61d0792927 | 58 | * |
frankvnk | 2:9b61d0792927 | 59 | * int main() { |
frankvnk | 2:9b61d0792927 | 60 | * while(1) { |
frankvnk | 2:9b61d0792927 | 61 | * if(temperature > 0.5) { |
frankvnk | 2:9b61d0792927 | 62 | * printf("Too hot! (%f)", temperature.read()); |
frankvnk | 2:9b61d0792927 | 63 | * } |
frankvnk | 2:9b61d0792927 | 64 | * } |
frankvnk | 2:9b61d0792927 | 65 | * } |
frankvnk | 2:9b61d0792927 | 66 | * @endcode |
Sissors | 0:c2a7b899e6c7 | 67 | */ |
Sissors | 0:c2a7b899e6c7 | 68 | class FastAnalogIn { |
Sissors | 0:c2a7b899e6c7 | 69 | |
Sissors | 0:c2a7b899e6c7 | 70 | public: |
Sissors | 0:c2a7b899e6c7 | 71 | /** Create a FastAnalogIn, connected to the specified pin |
Sissors | 0:c2a7b899e6c7 | 72 | * |
Sissors | 0:c2a7b899e6c7 | 73 | * @param pin AnalogIn pin to connect to |
Sissors | 0:c2a7b899e6c7 | 74 | * @param enabled Enable the ADC channel (default = true) |
Sissors | 0:c2a7b899e6c7 | 75 | */ |
Sissors | 0:c2a7b899e6c7 | 76 | FastAnalogIn( PinName pin, bool enabled = true ); |
Sissors | 0:c2a7b899e6c7 | 77 | |
frankvnk | 2:9b61d0792927 | 78 | ~FastAnalogIn( void ) |
frankvnk | 2:9b61d0792927 | 79 | { |
frankvnk | 2:9b61d0792927 | 80 | disable(); |
frankvnk | 2:9b61d0792927 | 81 | } |
Sissors | 0:c2a7b899e6c7 | 82 | |
Sissors | 0:c2a7b899e6c7 | 83 | /** Enable the ADC channel |
Sissors | 0:c2a7b899e6c7 | 84 | * |
Sissors | 0:c2a7b899e6c7 | 85 | * @param enabled Bool that is true for enable, false is equivalent to calling disable |
Sissors | 0:c2a7b899e6c7 | 86 | */ |
Sissors | 0:c2a7b899e6c7 | 87 | void enable(bool enabled = true); |
Sissors | 0:c2a7b899e6c7 | 88 | |
Sissors | 0:c2a7b899e6c7 | 89 | /** Disable the ADC channel |
Sissors | 0:c2a7b899e6c7 | 90 | * |
Sissors | 0:c2a7b899e6c7 | 91 | * Disabling unused channels speeds up conversion in used channels. |
Sissors | 0:c2a7b899e6c7 | 92 | * When disabled you can still call read, that will do a single conversion (actually two since the first one always returns 0 for unknown reason). |
Sissors | 0:c2a7b899e6c7 | 93 | * Then the function blocks until the value is read. This is handy when you sometimes needs a single conversion besides the automatic conversion |
Sissors | 0:c2a7b899e6c7 | 94 | */ |
Sissors | 0:c2a7b899e6c7 | 95 | void disable( void ); |
Sissors | 0:c2a7b899e6c7 | 96 | |
Sissors | 0:c2a7b899e6c7 | 97 | /** Returns the raw value |
Sissors | 0:c2a7b899e6c7 | 98 | * |
Sissors | 0:c2a7b899e6c7 | 99 | * @param return Unsigned integer with converted value |
Sissors | 0:c2a7b899e6c7 | 100 | */ |
Sissors | 0:c2a7b899e6c7 | 101 | unsigned short read_u16( void ); |
Sissors | 0:c2a7b899e6c7 | 102 | |
Sissors | 0:c2a7b899e6c7 | 103 | /** Returns the scaled value |
Sissors | 0:c2a7b899e6c7 | 104 | * |
Sissors | 0:c2a7b899e6c7 | 105 | * @param return Float with scaled converted value to 0.0-1.0 |
Sissors | 0:c2a7b899e6c7 | 106 | */ |
frankvnk | 2:9b61d0792927 | 107 | float read( void ) |
frankvnk | 2:9b61d0792927 | 108 | { |
frankvnk | 2:9b61d0792927 | 109 | unsigned short value = read_u16(); |
humlet | 4:cd84739f7640 | 110 | return (float)value * (1.0f/65535.0f); |
frankvnk | 2:9b61d0792927 | 111 | } |
Sissors | 0:c2a7b899e6c7 | 112 | |
Sissors | 0:c2a7b899e6c7 | 113 | /** An operator shorthand for read() |
Sissors | 0:c2a7b899e6c7 | 114 | */ |
Sissors | 0:c2a7b899e6c7 | 115 | operator float() { |
Sissors | 0:c2a7b899e6c7 | 116 | return read(); |
Sissors | 0:c2a7b899e6c7 | 117 | } |
Sissors | 0:c2a7b899e6c7 | 118 | |
Sissors | 0:c2a7b899e6c7 | 119 | |
Sissors | 0:c2a7b899e6c7 | 120 | private: |
Sissors | 0:c2a7b899e6c7 | 121 | static int channel_usage[8]; |
Sissors | 0:c2a7b899e6c7 | 122 | bool running; |
Sissors | 0:c2a7b899e6c7 | 123 | char ADCnumber; |
Sissors | 0:c2a7b899e6c7 | 124 | uint32_t *datareg; |
Sissors | 0:c2a7b899e6c7 | 125 | }; |
Sissors | 0:c2a7b899e6c7 | 126 | |
frankvnk | 2:9b61d0792927 | 127 | #endif |