Newer
Older
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
#pragma once
#include <stdint.h>
#include <avr/io.h>
class Potenciometr
{
private:
enum
{
ADC_BUFFER_SIZE = 10
};
volatile uint8_t attempt;
public:
volatile uint16_t buffer[ADC_BUFFER_SIZE];
volatile uint16_t adc_value;
public:
Potenciometr()
{
adc_ini();
};
void adc_ini()
{
//55kHz, 2.56V reference
ADMUX = (1<<REFS1) | (1<<REFS1);
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1);
//cca 13Hz
TCCR0 = (1<<CS01) | (1<<CS00);
TIMSK |= (1<<TOIE0);
};
void irq_handler()
{
buffer[attempt++] = ADC;
if(attempt >= ADC_BUFFER_SIZE)
{
uint16_t adc_sum = 0;
for (uint8_t i = 0; i < ADC_BUFFER_SIZE; i++)
{
adc_sum += buffer[i];
}
adc_value = adc_sum / ADC_BUFFER_SIZE;
attempt = 0;
}
};
void start_conversion()
{
ADCSRA |= (1<<ADSC);
};
};