Odtwarzanie dźwięku przez mikrokontroler
Cele
Celem projektu jest opracowanie procedury odtwarzania dźwięku z pamięci mikrokotrolera PIC18F25K80 firmy Microchip. Dźwięki pochodzące z plików WAV zostaną podłączane do kodu programu jako pliki nagłówkowe w języku C. Odtworzenie dźwięków będzie realizowane przez PWM. Należy opracować program konwertujący pliki WAV na pliki nagłówkowe w języku C.
Konwerter plików WAV
Program został oparty na kodzie opublikowanym w sierpniu 2007 roku przez João Figueiredo. Oryginalny kod pobierał próbki z plików dźwiękowych w formacie PCM i zapisywał je w zmiennej tablicowej generując kod w języku C++.
Program został zmodyfikowany by automatycznie z dowolnego pliku Wav generował kod w języku C++ zawierający zmienną tablicową z próbkami dźwięku.
W pierwszej kolejności następuje konwersja piku Wav do rozdzielczości 8 bitów na próbkę i częstotliwości próbkowania 8 kHz. Ma to na celu zmniejszenie wielkości danych tak by jedna sekunda zajmowała 7,81 kB i mogła zostać umieszczona w pamięci mikrokontrolera. Działanie to wykonywane jest poprzez automatyczne wykonanie programu SOX z parametrami:
sox inputfile.wav -r 8000 -b8 temp.wav
W ten sposób przygotowany plik jest następnie automatycznie konwertowany na format PCM poprzez wywołanie programu mplayer:
mplayer temp.wav -ao pcm:nowaveheader:file=temp.pcm
Plik PCM może zostać "przepisany" do postaci tablicy zawierającej poszczególne próbki. Fragment programu za to odpowiedzialny:
fprintf(headerFile, "const char ");
printSafeName(argv[1], headerFile);
fprintf(headerFile, "[%u]={", (unsigned int) statData.st_size);
c = fgetc(pcmFile);
fprintf(headerFile, "0x%02X", c);
while( (c=fgetc(pcmFile)) != EOF )
{
fprintf(headerFile, ",%s 0x%02X", ((++colBreak % 16) == 0?"\n":""), c);
}
fprintf(headerFile, "};\n\n");
Program jest dostępny w formie gotowego do zainstalowania pakietu DEB w systemie operacyjnym Linux Debian lub Ubuntu. Zarówno źródło programu jak i pakiet DEB jest dostępny w rozdziale "Pliki".
Program instaluje się poprzez wydanie polecenia z uprawnieniami administratora
dpkg -i --force-depends wav2h.deb
Zostanie on zainstalowany w systemie wraz z programami zależnymi (SOX i Mplayer).
Wywołanie programu:
wav2h file.wav file.h
Wygenerowany przez program plik ma postać:
#ifndef REDALERT_H
#define REDALERT_H
const char redalert[6]={0x80, 0x80, 0x7F, 0x80, 0x80, 0x7F, 0x80};
#endif
Zmienna tablicowa redalert zawiera poszczególne próbki dźwięku. W powyższym przykładzie jest to tylko sześć próbek - nagranie o długości około sekundy zawiera kilka tysięcy próbek.
Kod programu mikrokontrolera
Przykład ustawienia fusebitów mikrokontrolera PIC18F25K80 i definicji ustawień:
#include
#fuses INTRC_IO, NOPROTECT, PUT, BROWNOUT, NOWDT
#use delay(clock=8000000)
#define T2_FREQ (8000) // from 8000Hz to 11025Hz
#define K_TMR2 (8000000/4)/(T2_FREQ)
Następnie podłączony jest wygenerowany plik z próbkami dźwięku:
#include "redalert.h"
Kod funkcji wysyłającej próbki dźwięku ze zmiennej tablicowej na port PWM mikrokontrolera:
void play()
{
int16 i;
for(i=0; i<7794; i++)
{
set_pwm2_duty(redalert[i]);
delay_us(45);
}
}
Kod głównej funkcji programu:
void main(void)
{
setup_timer_2(T2_DIV_BY_1, K_TMR2, 1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(0L);
while(1)
{
play();
set_pwm2_duty(0L);
delay_ms(1000);
}
}
Układ elektroniczny
W celach testowych bezpośrednio do układu może zostać podłączony głośnik, jednak jakość dźwięku może nie być wystarczająca. Należy układ rozbudować o wzmacniacz oraz filtry.
Rys. Schemat połączeń
Pliki
WAV2H - Program generujący z dowolnego pliku WAV kod w języku C++ zawierający zmienną tablicową z próbkami dźwięku.
Program mikrokontrolera
Thứ Ba, 18 tháng 12, 2018
Chương trình phát âm thanh bằng PWM
Đăng ký:
Đăng Nhận xét (Atom)
Bài đăng mới nhất
Bài đăng phổ biến
-
Cấu trúc của 1 chương trình viết trên CCS: #include <18F4431.h> 1) header file ...
-
1. Vài nét sơ lược về chương trình delay. 1.1. Chu kì xung clock và chu kì lệnh Trong phần này ta sẽ bàn đến một vài kiến thức cơ sở phục...
-
I / _ XỬ LÝ ADC : PIC có nhiều chân phục vụ xử lý ADC với nhiều cách thức khác nhau . Để dùng ADC , bạn phải có khai báo #DEVICE cho b...
-
Watch the Video Tutorial The aim of this course is to teach you how to develop microcontroller based electronic systems using Flowco...
-
1.Giới thiệu IC thời gian thực DS1307 1. Giới thiệu: IC thời gian thực (RTC) DS1307 có thể đếm giờ, phút, giây, thứ, ngày tháng, năm...
-
Giới thiệu Mô-đun đầu đọc RFID EM18 được sử dụng để đọc thẻ RFID hoạt động ở 125 kHz. Khi một thẻ RFID đến trong phạm vi của đầu đọc, dữ liệ...
-
Giới thiệu Bộ định thời trong bộ vi điều khiển được sử dụng để giới thiệu độ trễ, đếm các sự kiện, tạo ra dạng sóng và cũng cho việc tạo PWM...
-
1. Giới thiệu chuẩn giao tiếp 1 wire: Chuẩn giao tiếp 1 dây (1 wire) do hãng Dallas giới thiệu. Trong chuẩn giao tiếp này chỉ cần 1 dây đ...
-
Chuẩn giao tiếp RS232 là một trong những kỹ thuật được sử dụng rộng rãi hiện nay để nối ghép các thiết bị ngoại vi với máy tính. Nó là một ...
-
Giao tiếp SPI được hãng motorola giới thiệp ở giữa năm 1980 và được sử dụng trong các dòng vi điều khiển của họ. Ngày nay giao tiếp SPI đ...
Không có nhận xét nào:
Đăng nhận xét