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 Bàn phím được sử dụng làm thiết bị đầu vào để đọc phím được người dùng nhấn và xử lý nó. Bàn phím 4x4 bao gồm 4 hàng và 4 cột. C...
-
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...
-
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...
-
Cấu trúc của 1 chương trình viết trên CCS: #include <18F4431.h> 1) header file ...
-
Khi có sự thay đổi xung cạnh lên, hoặc xung cạnh xuống tại chân RB0, thì sẽ tạo ra một ngắt. Ngắt xảy ra tại cạnh lên hoặc cạnh xuống phụ t...
-
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...
-
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 ...
-
Gần như tất cả các hệ thống dựa trên vi điều khiển đều thực hiện nhiều hơn một tác vụ. Ví dụ hệ thống giám sát nhiệt độ tạo ra ba t...
-
I/ _TỔNG QUÁT PHẦN CỨNG: _Module này có mặt ở hầu hết các dòng PIC 16 và PIC 18 , và thường chỉ có 2 chân cho module này, ký hiệu là CCP1...
-
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 ...
Không có nhận xét nào:
Đăng nhận xét