DMC.02 · Питание · ATmega328P
Задача
При падении напряжения ниже порога включать прерывистый звуковой сигнал на пьезобузере.
Алгоритм
АЦП читает напряжение; при провале ниже порога генерируется тон меандром на выводе с паузами.
Исходный код (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;
}
static void beep(uint16_t ms){
uint16_t cycles = ms*10/2; // ~2.7кГц: полупериод ~185мкс
while(cycles--){ PORTD^=(1<<PD6); _delay_us(185); }
}
int main(void){
DDRD|=(1<<PD6); // бузер на PD6
const uint16_t TH=600;
for(;;){
if(adc_read(0)<TH){ beep(100); _delay_ms(120); }
else _delay_ms(100);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Активный бузер — просто уровень; пассивный — нужен меандр (как здесь). Частота ~2.7 кГц хорошо слышна.