/* Pokus o měření proudu z ACS712 s využitím diferenciálního režimu ADC * PA3 signál z ACS712, PA2 reference (přesný dělič z VCC) */ #include #define F_CPU 1000000 #include // makra konfigurace ADC #define ADC_REF (1<>5; // spočítej průměr (odpovídá dělení 32) // s proměnnou si dělejte co chcete :) _delay_ms(10); } } /* Změří rozdílový signál ADC3-ADC2 s kompenzací offsetu * param1: počet průměrování (1-64) * param2: zisk (GAIN_1X nebo GAIN_20X) * param3: zde vrací výsledek (nepodělený průměr !) * param4: vrací hodnotu offsetu (pokud je vysoká, víte že máte průser) */ void get_ADC(uint8_t avgs, uint8_t gain, int32_t *result, int16_t *offset){ int32_t tmp=0,off=0; uint8_t i; // stanovení offsetu if(gain==GAIN_20X){ADC_OFFSET_20X;}else{ADC_OFFSET_1X;} // ADC3-ADC3 s vybraným ziskem ADCSRA |= (1<>6; // hodnota offsetu // měření rozdílového napětí if(gain==GAIN_20X){ADC_GET_20X;}else{ADC_GET_1X;} // ADC3-ADC2 for(i=0;i>6)-off); // kompenzovaný výsledek } // návratové hodnoty *offset = off; *result = tmp; } void init_ADC(void){ ADC_OFFSET_1X; // ADC3 - ADC3 (tady na tom nesejde, jen chci zapnout referenci) ADCSRA = (1<