blob: 6abb7ec141bfa8b93c560bae6b154d35adbf6e9f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
#ifndef MEASURE_H_
#define MEASURE_H_
#include "fixpt.h"
#include "util.h"
/* Multiplexer selections */
#define MEAS_MUX_ADC0 ((0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
#define MEAS_MUX_ADC1 ((0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0))
#define MEAS_MUX_ADC2 ((0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0))
#define MEAS_MUX_ADC3 ((0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0))
#define MEAS_MUX_ADC4 ((0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0))
#define MEAS_MUX_ADC5 ((0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (1 << MUX0))
#define MEAS_MUX_ADC6 ((0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
#define MEAS_MUX_ADC7 ((0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
#define MEAS_MUX_ADC8 ((1 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0))
#define MEAS_MUX_BG ((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0))
#define MEAS_MUX_GND ((1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0))
/* Digital-input-disable selections */
#define MEAS_DID_NONE 0u
#define MEAS_DID_ADC0 (1u << ADC0D)
#define MEAS_DID_ADC1 (1u << ADC1D)
#define MEAS_DID_ADC2 (1u << ADC2D)
#define MEAS_DID_ADC3 (1u << ADC3D)
#define MEAS_DID_ADC4 (1u << ADC4D)
#define MEAS_DID_ADC5 (1u << ADC5D)
/* Prescaler selections */
#define MEAS_PS_2 ((0 << ADPS2) | (0 << ADPS1) | (1 << ADPS0))
#define MEAS_PS_4 ((0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
#define MEAS_PS_8 ((0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
#define MEAS_PS_16 ((1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))
#define MEAS_PS_32 ((1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0))
#define MEAS_PS_64 ((1 << ADPS2) | (1 << ADPS1) | (0 << ADPS0))
#define MEAS_PS_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
/* Reference selection */
#define MEAS_REF_AREF ((0 << REFS1) | (0 << REFS0))
#define MEAS_REF_AVCC ((0 << REFS1) | (1 << REFS0))
#define MEAS_REF_RESERVED ((1 << REFS1) | (0 << REFS0))
#define MEAS_REF_INT1P1V ((1 << REFS1) | (1 << REFS0))
#define MEASURE_MAX_RESULT 0x3FFu
enum measure_chan {
MEAS_CHAN_CURRENT,
MEAS_CHAN_TEMP,
};
#define NR_MEAS_CHANS 2
enum measure_plausibility {
MEAS_PLAUSIBLE,
MEAS_NOT_PLAUSIBLE,
MEAS_PLAUS_TIMEOUT,
};
typedef void (*measure_result_cb_t)(fixpt_t measured_phys_value,
enum measure_plausibility plaus);
typedef uint16_t (*measure_filter_cb_t)(uint16_t raw_adc);
struct measure_config {
/* A short two-character name. Just for debugging. */
char name[3];
/* The ADC multiplexer setting. One of MEAS_MUX_... */
uint8_t mux;
/* The digital-input-disable setting. One of MEAS_DID_... */
uint8_t did;
/* The ADC prescaler setting. One of MEAS_PS_... */
uint8_t ps;
/* The ADC reference setting. One of MEAS_REF_... */
uint8_t ref;
/* The time (in milliseconds) we keep adding samples for the
* averaging.
* The actual sample rate is: F_CPU / prescaler / 13
* The sum buffer is of size uint32_t.
*/
uint16_t averaging_timeout_ms;
/* The scale() parameters for raw -> phys scaling. */
uint16_t scale_raw_lo;
uint16_t scale_raw_hi;
fixpt_t scale_phys_lo;
fixpt_t scale_phys_hi;
/* The plausibility limits. */
fixpt_t plaus_neglim;
fixpt_t plaus_poslim;
uint16_t plaus_timeout_ms;
};
void measure_adjust_set(enum measure_chan chan,
fixpt_t adjustment);
fixpt_t measure_adjust_get(enum measure_chan chan);
void measure_start(void);
void measure_work(void);
void measure_init(void);
#endif /* MEASURE_H_ */
|