-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathADC.c
More file actions
85 lines (84 loc) · 3.5 KB
/
Copy pathADC.c
File metadata and controls
85 lines (84 loc) · 3.5 KB
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
//Includes the public interface file and the private register definitions for the ADC driver.
#include "ADC_Interface.h"
#include "ADC_Private.h"
void ADC_Init(adc_reference_t reference, adc_prescaler_t prescaler){//Function to initialize the ADC with:voltage reference,clock prescaler
switch (reference)//Checks which voltage reference source will be used.
{
case AVCC://Selects AVCC as reference voltage.
clearBit(ADMUX, 7); //Clear REFS1 bit
setBit(ADMUX, 6); //Set REFS0 bit
break;
case AREF:
clearBit(ADMUX, 7); //Clear REFS1 bit
clearBit(ADMUX, 6); //Clear REFS0 bit
break;
case INTERNAL:
setBit(ADMUX, 7); //Set REFS1 bit
setBit(ADMUX, 6); //Set REFS0 bit
break;
}
switch (prescaler)//Selects ADC clock division factor.
{
case DIV_2:
clearBit(ADCSRA, 2); //Clear ADPS2 bit
clearBit(ADCSRA, 1); //Clear ADPS1 bit
clearBit(ADCSRA, 0); //Clear ADPS0 bit
break;
case DIV_4:
clearBit(ADCSRA, 2); //Clear ADPS2 bit
setBit(ADCSRA, 1); //Set ADPS1 bit
clearBit(ADCSRA, 0); //Clear ADPS0 bit
break;
case DIV_8:
clearBit(ADCSRA, 2); //Clear ADPS2 bit
setBit(ADCSRA, 1); //Set ADPS1 bit
setBit(ADCSRA, 0); //Set ADPS0 bit
break;
case DIV_16:
setBit(ADCSRA, 2); //Set ADPS2 bit
clearBit(ADCSRA, 1); //Clear ADPS1 bit
clearBit(ADCSRA, 0); //Clear ADPS0 bit
break;
case DIV_32:
setBit(ADCSRA, 2); //Set ADPS2 bit
clearBit(ADCSRA, 1); //Clear ADPS1 bit
setBit(ADCSRA, 0); //Set ADPS0 bit
break;
case DIV_64:
setBit(ADCSRA, 2); //Set ADPS2 bit
setBit(ADCSRA, 1); //Set ADPS1 bit
clearBit(ADCSRA, 0); //Clear ADPS0 bit
break;
case DIV_128:
setBit(ADCSRA, 2); //Set ADPS2 bit
setBit(ADCSRA, 1); //Set ADPS1 bit
setBit(ADCSRA, 0); //Set ADPS0 bit
break;
}
setBit(ADCSRA, 7); //Enable ADC (ADEN bit)
}
u16 ADC_Read(adc_channel_t channel){//Reads analog signal from selected channel and returns digital value.
//Select the ADC channel by setting the MUX bits in ADMUX register
ADMUX &= 0xE0; //Clear MUX bits (keep REFS bits)
ADMUX |= channel; //Set the desired channel
setBit(ADCSRA, 6); //Start conversion (ADSC bit)
while(readBit(ADCSRA, 6)); //Wait for conversion to complete
u8 low = ADCL; //Read low byte first (triggers latch)
u8 high = ADCH; //Read high byte
return (high << 8) | low; //Return ADC result
}
f32 ADC_read_v(adc_channel_t channel, f32 vref)//Reads ADC value and converts it into voltage.
{
u16 adc_value = ADC_Read(channel);//Gets raw digital ADC value.
f32 voltage = (adc_value / 1023.0) * vref; //Calculate voltage in volts
return voltage;
}
void ADC_FreeRunningMode(adc_channel_t channel){//Enables continuous ADC conversion mode.
ADMUX &= 0xE0;//Selects ADC channel.
ADMUX |= channel;
setBit(ADCSRA, 5); // ADATE - enable auto trigger
clearBit(ADCSRB, 2); // Clear ADTS2 (was SFIOR bit 7)
clearBit(ADCSRB, 1); // Clear ADTS1 (was SFIOR bit 6)
clearBit(ADCSRB, 0); // Clear ADTS0 (was SFIOR bit 5)
setBit(ADCSRA, 6); // ADSC - start conversion
}