Микроконтроллеры

Генерация звука на AVR

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

Но лучше это сделать на микроконтроллере, что позволяет использовать минимальное количество радиодеталей и генерировать программно абсолютно любые звуки. Приведенный ниже код генерирует звук при помощи ШИМ.

В данном примере используется микроконтроллер Atmega32 с тактовой частотой в 16 МГц. Динамик в 8-Ом напрямую подключается к выводу PB3. Работу программы можно посмотреть на видео.

Фъюзы должны быть запрограммированы следующим образом:

HIGH FUSE=C9 LOW FUSE=FF

Видео работы генератора звука на микроконтроллере AVR

Книга о том как зароботать онлайн, как заработать на публикации стайтей,обучении веб-дизайне, поиске информации и многом другом.

 Код программы генерации звука

Имя файла pwmsnd.c

/********************************************************************
DESCRIPTION:   A Simple program to genarate some random 
            musical tone.
MCU:        Atmel AVR ATmega32s
CPU SPEED:     16Mhz
LOW FUSE:      0XFF
HIGH FUSE:     0XC9
NOTE:       Connect a 8ohm speaker between GND and PB3.
AUTHOR:        Avinash Gupta
DATE:          Mar 18, 2010
WEB:        www.eXtremeElectronics.co.in
*** THIS PROJECT IS PROVIDED FOR EDUCATION/HOBBY USE ONLY  ***
*** NO PROTION OF THIS WORK CAN BE USED IN COMMERIAL       ***
*** APPLICATION WITHOUT WRITTEN PERMISSION FROM THE AUTHOR ***
EVERYONE IS FREE TO POST/PUBLISH THIS ARTICLE IN
PRINTED OR ELECTRONIC FORM IN FREE/PAID WEBSITES/MAGAZINES/BOOKS
IF PROPER CREDIT TO ORIGINAL AUTHOR IS MENTIONED WITH LINKS TO
ORIGINAL ARTICLE 
COPYRIGHT (C) 2008-2010 EXTREME ELECTRONICS INDIA.
*********************************************************************/
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "sin.h"
/*
Function To Initialize TIMER0 In Fast
PWWM Mode.
*/
void InitPWM()
{
   /*
   TCCR0 - Timer Counter Control Register (TIMER0)
   -----------------------------------------------
   BITS DESCRIPTION
   
   NO:   NAME   DESCRIPTION
   --------------------------
   BIT 7 : FOC0   Force Output Compare [Not used in this example]
   BIT 6 : WGM00  Wave form generartion mode [SET to 1]
   BIT 5 : COM01  Compare Output Mode        [SET to 1]
   BIT 4 : COM00  Compare Output Mode        [SET to 0]
   BIT 3 : WGM01  Wave form generartion mode [SET to 1]
   BIT 2 : CS02   Clock Select               [SET to 0]
   BIT 1 : CS01   Clock Select               [SET to 0]
   BIT 0 : CS00   Clock Select               [SET to 1]
   The above settings are for
   --------------------------
   Timer Clock = CPU Clock (No Prescalling)
   Mode        = Fast PWM
   PWM Output  = Non Inverted
   */
   TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
   //Set OC0 PIN as output. It is  PB3 on ATmega16 ATmega32
   DDRB|=(1<<PB3);
}
void main()
{
   uint8_t i;
   InitPWM();
   while(1)
   {
      uint8_t delay,n;
      for(delay=1;delay<=50;delay++)
      {
         for(n=0;n<(51-delay);n++)
         {
            for(i=0;i<=254;i++)
            {
               OCR0=pgm_read_byte_near(sine+i);
               _delay_loop_2(delay);
            }
         }
      }
      for(delay=50;delay>=2;delay--)
      {
         for(n=0;n<(51-delay);n++)
         {
            for(i=0;i<=254;i++)
            {
               OCR0=pgm_read_byte_near(sine+i);
               _delay_loop_2(delay);
            }
         }
      }
   }
}

 Имя файла sin.h

#include <avr/pgmspace.h>
prog_uint8_t sine[256]={
                     127,
                     130,
                     133,
                     136,
                     139,
                     143,
                     146,
                     149,
                     152,
                     155,
                     158,
                     161,
                     164,
                     167,
                     170,
                     173,
                     176,
                     178,
                     181,
                     184,
                     187,
                     189,
                     192,
                     195,
                     197,
                     200,
                     203,
                     205,
                     207,
                     210,
                     212,
                     214,
                     217,
                     219,
                     221,
                     223,
                     225,
                     227,
                     229,
                     231,
                     232,
                     234,
                     236,
                     237,
                     239,
                     240,
                     242,
                     243,
                     244,
                     245,
                     246,
                     248,
                     248,
                     249,
                     250,
                     251,
                     251,
                     252,
                     253,
                     253,
                     253,
                     254,
                     254,
                     254,
                     254,
                     254,
                     254,
                     254,
                     253,
                     253,
                     253,
                     252,
                     252,
                     251,
                     250,
                     250,
                     249,
                     248,
                     247,
                     246,
                     245,
                     243,
                     242,
                     241,
                     239,
                     238,
                     236,
                     235,
                     233,
                     231,
                     229,
                     227,
                     225,
                     224,
                     221,
                     219,
                     217,
                     215,
                     213,
                     210,
                     208,
                     206,
                     203,
                     201,
                     198,
                     195,
                     193,
                     190,
                     187,
                     185,
                     182,
                     179,
                     176,
                     173,
                     170,
                     167,
                     164,
                     161,
                     158,
                     155,
                     152,
                     149,
                     146,
                     143,
                     140,
                     137,
                     134,
                     131,
                     128,
                     125,
                     121,
                     118,
                     115,
                     112,
                     109,
                     106,
                     103,
                     100,
                     97,
                     94,
                     91,
                     88,
                     85,
                     82,
                     79,
                     76,
                     73,
                     71,
                     68,
                     65,
                     62,
                     60,
                     57,
                     55,
                     52,
                     50,
                     47,
                     45,
                     42,
                     40,
                     38,
                     36,
                     34,
                     31,
                     29,
                     27,
                     26,
                     24,
                     22,
                     20,
                     19,
                     17,
                     15,
                     14,
                     13,
                     11,
                     10,
                     9,
                     8,
                     7,
                     6,
                     5,
                     4,
                     3,
                     3,
                     2,
                     2,
                     1,
                     1,
                     0,
                     0,
                     0,
                     0,
                     0,
                     0,
                     0,
                     1,
                     1,
                     1,
                     2,
                     2,
                     3,
                     4,
                     4,
                     5,
                     6,
                     7,
                     8,
                     9,
                     10,
                     12,
                     13,
                     14,
                     16,
                     17,
                     19,
                     21,
                     22,
                     24,
                     26,
                     28,
                     30,
                     32,
                     34,
                     36,
                     39,
                     41,
                     43,
                     45,
                     48,
                     50,
                     53,
                     55,
                     58,
                     61,
                     63,
                     66,
                     69,
                     72,
                     74,
                     77,
                     80,
                     83,
                     86,
                     89,
                     92,
                     95,
                     98,
                     101,
                     104,
                     107,
                     110,
                     113,
                     116,
                     119,
                     122,
};

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа