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
-
Giới thiệu Khi chúng ta giao diện cảm biến cho vi điều khiển, đầu ra của cảm biến nhiều lần tương tự trong tự nhiên. Nhưng vi điều khiển xử...
-
Giới thiệu Analog Joystick được sử dụng như một thiết bị đầu vào để thay đổi vị trí của con trỏ tương ứng với chuyển động của cần điều khiển...
-
Cấu trúc của 1 chương trình viết trên CCS: #include <18F4431.h> 1) header file ...
-
Ngắt đến từ nhiều nguồn gây ra sự kiện ngắt bên trong Pic cũng như các sự kiện gây ngắt do bên ngoài. Khi một ngắt xảy ra, trình xử lý ng...
-
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip Technology. Dòng PIC đầu tiên là PIC1650 được phát triển bởi Micro...
-
1. Giới thiệu Đầu năm 1980 Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là I2C. I2C là tên viết tắt của cụm từ In...
-
Giới thiệu PIC18F4550 có mô-đun CCP sẵn có có chế độ Chụp, So sánh và chế độ PWM cho các ứng dụng khác nhau. Chế độ CCP trong So sánh được ...
-
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...
-
1.Biến và hằng số: Biến để lưu trữ một giá giá trị mà giá trị có thể thay đổi, hằng số là một giá trị cố định . Biến và hằng với nhiều ...
-
1. Cơ bản về IC 74HC595 74hc595 là IC ghi dịch 8 bit kết hợp chốt dữ liệu, đầu vào nối tiếp đầu ra song song. IC này thường sử dụng để...
Không có nhận xét nào:
Đăng nhận xét