Главная » Микроконтроллеры » ATtiny13 – двухтональная сирена

ATtiny13 – двухтональная сирена

Это простая и легкая в сборке двухтональная сирена, в которой для создания звуковых эффектов используется микроконтроллер ATtiny13.

Обратите внимание, что с небольшими изменениями проект можно легко использовать во многих устройствах, где может потребоваться двухтональный сигнал тревоги.

Код проекта разработан таким образом, чтобы можно было добавить свой список двухтональных звуковых эффектов. Код уже содержит несколько примеров таких эффектов. Не стесняйтесь создавать свои собственные комбинации тонов.

Как всегда, полный код доступен на Github, нажмите здесь.

Требуемые детали

  • ATtiny13 — плата разработки
  • Резистор — 1 кОм (обратите внимание, что нагрузка на выводе AVR должна быть <40 мА)
  • Динамик / зуммер (без внутреннего генератора)

Принципиальная схема сирены

ATtiny13 – двухтональная сирена

Код программы

Данный код написан на C и может быть скомпилирован с помощью avr-gcc. Более подробная информация о том, как скомпилировать этот проект, находится здесь.

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

#define    SPEAKER_PIN    PB0

#define    N_1    (_BV(CS00))
#define    N_8    (_BV(CS01))
#define    N_64   (_BV(CS01)|_BV(CS00))
#define    N_256  (_BV(CS02))
#define    N_1024 (_BV(CS02)|_BV(CS00))

static void twotone_alarm(uint8_t type);
static void tone_loop(uint8_t OCRxn, uint8_t N, uint8_t max, uint8_t delay, uint8_t pause, uint8_t fade);
static void timer_set(uint8_t OCRxn, uint8_t N);
static void sleep(uint8_t ms);

int
main(void)
{

    /* setup */
    DDRB |= _BV(SPEAKER_PIN); // устанавливаем вывод динамика как ВЫХОД
    TCCR0A |= _BV(WGM01); // устанавливаем режим таймера на Fast PWM
    TCCR0A |= _BV(COM0A0); // подключаем вывод PWM к каналу A Timer0

    /* loop */
    while (1) {
        twotone_alarm(1);
    }
}

void
twotone_alarm(uint8_t type)
{

    switch(type) {
    / * Здесь своя двухтональная сигнальная композиция! * /
    case 1:
        tone_loop(123, N_8, 6, 10, 10, 1);
        tone_loop(22, N_8, 6, 10, 0, -1);
        break;
    default:
    case 0:
        tone_loop(32, N_8, 6, 10, 10, 1);
        tone_loop(22, N_8, 6, 10, 0, -1);
        break;
    }
}

/**
  * Цикл однотонного звука с эффектом fade-in/out.
  *
  * Базовая частота прямоугольной волны,
  * F = F_CPU / (2 * N * (1 + OCRnx)), где:
  * - F - расчетная частота ШИМ
  * - F_CPU - источник тактовой частоты (1,2 МГц)
  * - переменная N представляет коэффициент предварительного делителя (1, 8, 64, 256 или 1024)
  *
  * @ param OCRxn: значение OCRxn таймера
  * @param N: предварительный делитель таймера (N_1, N_8, N_64, N_256, N_1024)
  * @param max: количество итераций (incr / decr OCRxn)
  * @param delay: небольшая задержка после каждой итерации в миллисекундах
  * @param pause: задержка после тонового цикла, задержка между тонами
  * @param fade: коэффициент fade-in (1) или out (-1)
*/
void
tone_loop(uint8_t OCRxn, uint8_t N, uint8_t max, uint8_t delay, uint8_t pause, uint8_t fade)
{
    uint8_t i;

    for (i = 0; i < max; ++i) {
        timer_set(OCRxn, N);
        OCRxn += fade;
        sleep(delay);
    }

    sleep(pause);
}

void
timer_set(uint8_t OCRxn, uint8_t N)
{

    TCCR0B = (TCCR0B & ~((1<<CS02)|(1<<CS01)|(1<<CS00))) | N;
    OCR0A = OCRxn - 1;
}

void
sleep(uint8_t ms)
{
    uint8_t i;

    for (i = 0; i < ms; ++i) {
        _delay_ms(1);
    }
}

Источник

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*