DMC.04 · Питание · ATmega328P
Задача
Считывать выход датчика тока ACS712, вычитать середину шкалы и переводить в амперы.
Алгоритм
ACS712 выдаёт напряжение вокруг Vcc/2 с чувствительностью мВ/А; ток = (Uизм - Vcc/2)/чувствительность.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
static uint16_t adc_read(uint8_t ch){
ADMUX=(1<<REFS0)|(ch&0x0F);
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADCSRA|=(1<<ADSC); while(ADCSRA&(1<<ADSC));
return ADC;
}
int main(void){
DDRB|=(1<<PB5);
_delay_ms(50);
uint16_t zero = adc_read(1); // калибровка нуля на ADC1
const float VREF=5.0f, SENS=0.066f; // 66 мВ/А
for(;;){
int16_t d = (int16_t)adc_read(1) - (int16_t)zero;
float amps = (d*VREF/1024.0f)/SENS;
if(amps<0) amps=-amps;
if(amps>20.0f) PORTB|=(1<<PB5); else PORTB&=~(1<<PB5); // индикация перегрузки
_delay_ms(100);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Середину шкалы (нулевой ток) калибруют при старте. Чувствительность зависит от модели (напр. 66/100/185 мВ/А).