Очень многие проекты на микроконтроллерах требуют аудио сопровождение или звуковое оповещение. К примеру, сигнализация, автоматический дверной звонок или говорящий робот. Можно конечно использовались генераторы звуковой частоты на транзисторах, генераторы на логических элементах или специализированных микросхемах.
Но лучше это сделать на микроконтроллере, что позволяет использовать минимальное количество радиодеталей и генерировать программно абсолютно любые звуки. Приведенный ниже код генерирует звук при помощи ШИМ.
В данном примере используется микроконтроллер Atmega32 с тактовой частотой в 16 МГц. Динамик в 8-Ом напрямую подключается к выводу PB3. Работу программы можно посмотреть на видео.
Фъюзы должны быть запрограммированы следующим образом:
HIGH FUSE=C9 LOW FUSE=FF
Книга о том как зароботать онлайн, как заработать на публикации стайтей,обучении веб-дизайне, поиске информации и многом другом.
Имя файла 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, };