Class similar to AnalogIn that uses burst mode to run continious background conversions so when the input is read, the last value can immediatly be returned.

Fork of FastAnalogIn by Erik -

Obsolete!

Has been already merged with Erik's original repository => take the original!

  • Added support for LPC4088.
  • Fixed linker error (missing definition of static member "channel_usage")
Committer:
humlet
Date:
Mon Apr 21 07:17:39 2014 +0000
Revision:
5:55274430c8df
Parent:
4:cd84739f7640
* minor docu changes; * added definition of "channel_usage" also to KLXX-implementation

Who changed what in which revision?

UserRevisionLine numberNew 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
humlet 4:cd84739f7640 10 #if !defined TARGET_LPC1768 && !defined TARGET_KL25Z && !defined TARGET_KL46Z && !defined TARGET_KL05Z && !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