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
-
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 ...
-
I / KHAI BÁO VÀ SỬ DỤNG BIẾN , HẰNG , MẢNG : 1 / Khai báo biến , hằng ,mảng : Các loại biến sau được hỗ trợ : int1 Số 1 bit = tru...
-
Vòng lặp for (For Loop) Chương trình biên dịch CCS cho vi điều khiển PIC Lệnh for : vòng lặp xác định thực hiện lặp lại một số lần x...
-
Giới thiệu Động cơ bước Động cơ bước là một động cơ không chổi than DC chia góc quay 360 ° hoàn toàn thành số bước bằng nhau. Động cơ được x...
-
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 ...
-
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 đ...
-
I / CƠ CHẾ HOẠT ĐỘNG CỦA NGẮT : 1 / _ Ngắt 1 cấp : _Trên PIC 14 , 12 ,10 ,tất cả các ngắt chỉ có 1 cấp ưu tiên . Nghĩa là ngắt nào đang đ...
-
Giới thiệu Pulse Width Modulation (PWM) là một kỹ thuật mà theo đó chiều rộng của xung được thay đổi trong khi vẫn giữ tần số của hằng số s...
-
Universal Serial Bus (USB) là một trong những giao thức phổ biến nhất được sử dụng trong sản phẩm điện tử tiêu dùng hiện nay, bao g...
-
Giới thiệu Cảm biến PIR phát hiện bức xạ nhiệt hồng ngoại. Nó có thể được sử dụng để phát hiện sự hiện diện của các vật thể sống phát ra bứ...
Không có nhận xét nào:
Đăng nhận xét