Hallo,
ich teste gerade den ATtiny841 für eine Spannungsmessung. Genutzt wird
derzeit die interene 1V1 Referenz ohne Bypass Kondensator. Würde gerne
zur Erhöhung der Genauigkeit diesen Kondensator zu schalten. (PA0 und
GND mit einem Kerko verbinden).
Nur kann ich den ADC1 nicht auslesen. Hingegen geht es mit dem ADC0
wunderbar. Woran liegt das und ist es sinnvoll, den Bypass zu nutzen für
die Messung?
1 | /*
|
2 | * tiny841_adc.c
|
3 | *
|
4 | * Created: 19.01.2015 19:18:10
|
5 | * Author: sschultewolter
|
6 | */
|
7 |
|
8 |
|
9 | #include <avr/io.h>
|
10 | #include <util/delay.h>
|
11 | #include "uart/uart.h"
|
12 |
|
13 | void adc_init(void)
|
14 | {
|
15 | // Internval 1.1V reference
|
16 | ADMUXB = /*(1<<REFS2) | (1<REFS1) |*/ (1<<REFS0);
|
17 |
|
18 | ADCSRA = (1<<ADPS1) | (1<<ADPS0);
|
19 | ADCSRA |= (1<<ADEN);
|
20 |
|
21 | ADCSRA |= (11<<ADSC);
|
22 | while(ADCSRA & (1<<ADSC));
|
23 | (void) ADCW;
|
24 | }
|
25 |
|
26 | uint16_t adc_read(uint8_t channel)
|
27 | {
|
28 | ADMUXA = (ADMUXA &~(0x1F)) | (channel & 0x1F);
|
29 | ADCSRA |= (1<<ADSC);
|
30 | while(ADCSRA & (1<<ADSC));
|
31 | return ADCW;
|
32 | }
|
33 |
|
34 | uint16_t adc_read_avg(uint8_t channel, uint8_t nsamples)
|
35 | {
|
36 | uint32_t sum = 0;
|
37 | for(uint8_t i = 0; i < nsamples; i++)
|
38 | {
|
39 | sum+=adc_read(channel);
|
40 | }
|
41 | return (uint16_t)(sum/nsamples);
|
42 | }
|
43 |
|
44 | int main(void)
|
45 | {
|
46 | uart_init();
|
47 | adc_init();
|
48 |
|
49 | sei();
|
50 | uart_puts_P("ADC Test Channel ADC1\r\n");
|
51 |
|
52 | uint16_t adcval;
|
53 | uint16_t count;
|
54 | while(1)
|
55 | {
|
56 | adcval = adc_read_avg(1, 10);
|
57 | uart_puti_format(count);
|
58 | uart_puts_P(" : ");
|
59 | uart_puti_format(adcval);
|
60 | uart_puts_P("\r\n");
|
61 | _delay_ms(1000);
|
62 | }
|
63 | }
|