DMC.31 · Датчики · ATmega328P
Задача
Считывать напряжение ИК-дальномера и оценивать близость препятствия.
Алгоритм
Sharp даёт нелинейное напряжение от расстояния; АЦП читает его, порог отсчётов = близко/далеко.
Исходный код (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);
for(;;){
uint16_t v=adc_read(4); // ADC4
if(v>500) PORTB|=(1<<PB5); else PORTB&=~(1<<PB5); // ближе = больше напряжение
_delay_ms(80);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Для физических см нужна таблица/аппроксимация под конкретную модель. Здесь — пороговая близость.