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
-
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 để...
-
Cấu trúc của 1 chương trình viết trên CCS: #include <18F4431.h> 1) header file ...
-
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...
-
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...
-
Trong bài này sẽ hướng dẫn quét led 7 đoạn bằng timer Đoạn chương trình mẫu: /* ytuongnhanh.vn*/ #include <16f877a.h> #device *...
-
1. Cấu tạo Led 7 đoạn gồm 7 đoạn led sắp xếp như hình bên dưới, chân led được đánh nhãn từ a đến g đại diện cho từng đoạn led, chân còn...
-
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 ...
-
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ệ...
-
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...
-
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 đ...
Không có nhận xét nào:
Đăng nhận xét