EE445M RTOS
Taken at the University of Texas Spring 2015
ir.hpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset: 4; */
2 #ifndef __irpp__
3 #define __irpp__
4 
5 #include "circularbuffer.hpp"
6 #include "semaphorepp.hpp"
7 #include "adcpp.hpp"
8 
9 #include <stdbool.h>
10 #include <stdint.h>
11 
12 #define IR_BUFFER_LENGTH 32
13 #define IR_BUFFER_TYPE int16_t
14 
15 class ir {
16 
17  /*
18  IR Sensor Calibration:
19 
20  1 / (d + k) = a * ADC + b
21 
22  d - distance in millimeters.
23  k - corrective constant (fund using tial-and-error method)
24  ADC - digitalized value of voltage.
25  a - linear member (value is determined by the trend line equation)
26  b - free member(value is determined by the trend line equation)
27 
28  d = (1 / (a * ADC + B)) - k
29  d = [(1 / a) / (ADC + B / a)] - k // circumvent floating point values
30 
31  Example: YELLOW
32  a = 0.000003392083496396130
33  b = 0.000157499374810688000
34  k = 7
35 
36  (1/a) = 294804.06395138431054320313024055
37  (b/a) = 46.431455763993112340595936913376
38 
39  d = (294804 / (ADC + 46)) - 7 millimeters
40  calibrate(294804, 46, 7);
41  */
42 
43  typedef struct calibration_data {
44  int32_t a;
45  int32_t b;
46  int32_t k;
48 
49 private:
54 
55  int32_t cached_average;
56 public:
57  ir();
58  /* the default calibration is ideal as per the GP2Y0A21YK spec sheet*/
59  ir(uint8_t ir_adc_sequence_step, adc* ir_assoc_adc,
60  int32_t ir_a=240333, int32_t ir_b=-314, int32_t ir_k=0);
61  void calibrate(int32_t a, int32_t b, int32_t k);
62  void sample(void);
63  int32_t average();
64  int32_t distance();
65 
66  static const int32_t max_distance = 500;
67  static const int32_t min_distance = 0;
68 };
69 
70 #endif /* __IR__ */
71 
72 /* Local Variables: */
73 /* firestarter: (compile "make -k -j32 -C ~/workspace/ee445m-labs/build/") */
74 /* End: */
Definition: ir.hpp:15
void calibrate(int32_t a, int32_t b, int32_t k)
Definition: ir.cpp:15
static const int32_t max_distance
Definition: ir.hpp:66
adc * assoc_adc
Definition: ir.hpp:53
circularbuffer< int16_t, 32 > buf
Definition: ir.hpp:51
int32_t cached_average
Definition: ir.hpp:55
void sample(void)
Definition: ir.cpp:22
struct ir::calibration_data calibration_data
int32_t average()
Definition: ir.cpp:27
calibration_data calibration
Definition: ir.hpp:50
int32_t distance()
Definition: ir.cpp:40
Definition: adcpp.hpp:18
uint8_t adc_sequence_step
Definition: ir.hpp:52
ir()
Definition: ir.cpp:4
static const int32_t min_distance
Definition: ir.hpp:67