МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
Розрахункова робота
з курсу: "Системи запису та відтворення інформації"
на тему: “Розроблення цифрового диктофону”
Варіант №5
Львів – 2015р.
Мета роботи: Закріпити отримані теоретичні знання на практиці; розробити цифровий диктофон і отримати навички розробки пристроїв, які можна використовувати в системах запису і відтворення інформації.
Завдання:
Розробити принципову електричну схему цифрового диктофону згідно завдання та навести усі необхідні розрахунки.
Скласти специфікацію елементів схеми.
Навести АЧХ розрахованого мікрофонного підсилювача + фільтра.
Написати на мові MatLab або C функції запису файлу у MMC/SD-карту, на якій встановлена файлова система FAT16.
Написати на мові MatLab або C функцію запису файлу у wav-форматі.
Розрахувати орієнтовну споживну потужність диктофону та час неперервної роботи від заданого джерела живлення.
Завдання:
Варіант
Тип джерела живлення
Частота дискретизації, Гц
Степінь стиску
Час запису, год
Тип мікрофону
Мікрофонний підсилювач + фільтр
5
LIR3048
8000
8
350
Електрентний
Варіант 1
Розробити принципову електричну схему цифрового диктофону згідно завдання та навести усі необхідні розрахунки.
Оцінка споживаної потужності компонентів диктофону
Знаходимо небхідний об’єм NAND – Flash пам’яті:
час запису = 350год;
кількість вибірок = 8000;
компресія = 8;
об’єм пам’яті =
З таблиці 7.1 вибираємо мікросхему K9G8G08U0M (Samsung) з організацією 1Gb x 8.
Таблиця 1
Елементи схеми
Споживаний струм, мА
Мікроконтролер
≤ 10
MMC/SD карта пам’яті
≤ 100
Мікросхема NAND-Flash пам’яті
≤ 30
Мікрофон
≤ 1
ОП та пасивні елементи
≤ 5
Світлодіоди та органи управління
≤ 10
Кола управління живленням
≤ 5
Всього
≤ 161 мА
Отже кола живлення будуть розраховані на струм навантаження не менше 200 мА.
Вибираємо робочу напругу живлення елементів диктофону
Таблиця 2
Елементи схеми
Напруга живлення, В
Мікроконтролер
2.7-3.6
MMC/SD карта пам’яті
2.7-3.6
Мікросхема NAND-Flash пам’яті
2.7-3.6
Мікрофон
2.0-10.0
ОП
2.7-8.0
Світлодіоди
2.0
Приймаємо робочу напругу VCC = 3.3 В
1.3 Вибираємо мікросхеми для формування напруг живлення елементів схеми
Оскільки батарея типу LIR3048 забезпечує напругу в діапазоні 2.75 – 4.2 В, а робоча напруга схеми 3.3 В, то необхідно взяти два LDO – стабілізатори, для роз’єднання аналового та цифрового кіл живлення. В одному візьмемо вихідну напругу рівну 3.0 В (LDO – стабілізатор LP3985IBP-3.0), а в іншому - 2.7 В (LDO – стабілізатор LP3985IBP-2.7)
1.4 Синтез принципової схеми кіл живлення та розрахунок її параметрів
На підставі типових схем включення, наведених в DataSheet, синтезуємо принципову схему кіл живлення (Рис. 1).
Рис. 1. Схема електрична принципова кіл живленння
Живлення аналогових кіл мікрофону та підсилювача здійснюється від напруги AVCC=2.7 B, яка формується LDO-стабілізатором DA2, а цифрових – від напруги AVCC=3.0 B, яка формується LDO-стабілізатором DA1 . Згідно рекомендацій Data Sheet вибираємо для кожного LDO – стабілізатора керамічні котушки з ємністю :
С5 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
С6 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
С7 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
С8 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
С9 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
С10 = 1мкФ (SMD - конденсатор, 0805, 10%, 10 В, X7R);
Синтез схеми мікрофонного підсилювача та фільтра
Визначаємо необхідний коефіцієнт підсилення схеми. Для цього приймемо, що максимальний рівень звукового тиску SPL (Sound Pressure Level) становить 100 дБ. Знаходимо абсолютне значення звукового тиску:
При типовій чутливості мікрофону S=-48 дБ (0 дБ=1 В/Па), будемо мати напругу
Оскільки вбудований АЦП мікроконтролера ATmega16 має діапазон перетворення від 0 до AVCC, а сигнал підсилюється відносно середнього рівня AVCC/2, то коефіцієнт підсилення:
Згідно технічних даних мікрофона резистор R1 повинен бути рівний 2.2 кОм. Вибираємо резистор R1 (SMD-резистор, 0805, 5%, 0.125 Вт).
Подільник напруги на резисторах R4 та R3 формує напругу зміщення рівну AVCC/2=1.5 В. Вибираємо R3=R4=100 кОм (SMD-резистори, 0805, 5%, 0.125 Вт).
Значення ємності конденсатора С2 згідно даних становить 1 мкФ. Вибираємо конденсатор С2=1 мкФ (SMD-конденсатор, 0805, 10%, 16 В, X7R).
Коефіцієнт підсилення та смуга пропускання фільтра низьких частот (ФНЧ) задається резисторами R2, R5 та конденсаторами С1, С4.
Визначимо частоту зрізу фільтру з теорема Котельникова:
.
Згідно завдання частота дискретизації становить 8000 Гц. Отже
Приймемо частоту зрізу дещо меншою, оскільки АЧХ фільтра повільно спадає. Отже .
Частота зрізу фільтру визначаться за формулою:
Отже
Вибираємо резистор R2=45 Ом (SMD-резистор, 0805, 5%, 0.125 Вт)
Коефіцієнт підсилення ФНЧ становить 188 і визначається за формулою:
Звідси Вибираємо резистор R5=8460 Ом (SMD-резистор, 0805, 5%, 0.125 Вт).
Ємність конденсатора С4 визначається за формулою:
Вибираємо конденсатор С4=5 нФ (SMD-конденсатор, 0805, 10%, 16 В, X7R).
Резистор R6 та конденсатор C3 утворюють собою додатковий RC-фільтр низьких частот, тому приймаємо їх значення такими: R6=8460 Ом, C3=5 нФ. Вибираємо конденсатор С3=5 нФ (SMD-конденсатор, 0805, 10%, 16 В, X7R) та резистор R6=8460 Ом (SMD-резистор, 0805, 5%, 0.125 Вт).
Рис. 2. Схема електрична принципова мікрофонного підсилювача та фільтра
Синтез схеми підключення MMC/SD-карти до МК
Мікроконтролер ATmega16 містить вбудований SPI-інтерфейс, який можна використати для підключення до MMC/SD-карти пам’яті (Рис. 4).
Призначення виводів МК:
Вивід PB4 – #CS.
Вивід PB5 – MOSI.
Вивід PB6 – MISO.
Вивід PB7 – CLK.
Вибираємо R13-R17=51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт). В якості SD-слоту X1 вибираємо MMC/SD-слот CCM05-5507 (Рис. 3).
Рис. 3. Схема електрична принципова інтерфейсу з MMC/SD-картою пам’яті
Рис. 4. MMC/SD-слот CCM05-5507
1.7 Синтез схеми підключення MMC/SD-карти до МК
Схема підключення NAND-Flash пам’яті до МК наведена на Рис. 6. Для виводів даних І/О0-І/О7 використаємо порт С мікроконтролера, для підключення керуючих виводів – порт D.
Рис. 5. Схема підключення мікросхеми NAND-Flash пам’яті
Вибираємо R18=R19=51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
1.8 Синтез схеми органів управління та індикації та їх підключення до МК.
Для індикації наявності живлення використовується світлодіод червоного кольору LED1
підключений до виводу РВ0 мікроконтролера (Рис. 5). У випадку розряду джерела живлення
нижче встановленого порогу світлодіод починає блимати. Режим запису відображається
світлодіодом синього кольору LED2, підключеним до виводу РВ1. Запис без компресії –
неперервне світіння, з компресією – блимання з частотою 1 Гц.
Рис.6. Кола індикації диктофону
Використаємо світлодіоди з низьким споживанням струму: D1 – SML-311UT (SMD-світлодіод, 0603, IF<10 мА) та D2 – SML-311BT (SMD-світлодіод, 0603, IF<10 мА).
Вибираємо R20-R21=470 Ом (SMD-резистор, 0805, 5%, 0.125 Вт).
В якості перемикача подачі живлення SW1, включення/виключення запису SW2 (вивід РВ2 мікроконтролера) та вибору режиму запису (вивід РВ3 мікроконтролера) застосуємо вертикальні Slide-Switch типу SS-11G05 (0.5 А, 12 В) компанії Wealth Metal Factory Ltd (http://www.wealthmetal.com) – Рис.7.
Рис. 7. Зовнішній вигляд та електрична схема Slide-Switch типу SS-11G05
Схема підключення перемикачів управління до МК наведена на Рис. 8.
Рис. 8. Схема органів управління
Вибираємо R22-R23=51 кОм (SMD-резистор, 0805, 5%, 0.125 Вт).
Навести АЧХ розрахованого мікрофонного підсилювача + фільтра.
Рис. 9. Ачх розрахованого фільтра та підсилювача
Написати на мові MatLab або C функції запису файлу у MMC/SD-карту, на якій встановлена файлова система FAT16.
Програма запису файлу у MMC/SD-карту, на як й встановлена файлова система FAT16:
clear all;
BytesPerSec = 512;
Buffer = zeros(BytesPerSec, 1);
s = MMC_SD_Init('D:\Student\SD_512\SD_512.bin');
VBR_Addr = 0;
LBA = 0;
[Buffer, cl] = MMC_SD_Read_Sector(s, LBA);
if (Buffer(511) </span>~= hex2dec('55')| Buffer(512) </span>~= hex2dec('AA'))
disp ('VBR FAT Error1');
return;
end;
BytesPerSec = Buffer(hex2dec('b') + 1) + 2^8 * Buffer(hex2dec('b') + 2);
z = sprintf ('Кількість байт в секторі : %d', BytesPerSec);
disp(z) ;
SecPerClus = Buffer(hex2dec('d') + 1);
z = sprintf ('Кількість секторів в кластері : %d', SecPerClus);
disp (z) ;
RsvdSecCnt = Buffer(hex2dec('e') + 1) + 256 * Buffer(hex2dec('f') + 1);
z = sprintf ('Кількість зарезервованих секторів від початку карти: %d', RsvdSecCnt);
disp (z);
NumFATs = Buffer(hex2dec('10') + 1);
z = sprintf ('Кількість таблиць FAT: %d', NumFATs);
disp (z);
RootEntCnt = Buffer(hex2dec('11') + 1) + 256 * Buffer(hex2dec('12') + 1);
z = sprintf ('Кількість записів в кореневому каталозі Root Directory: %d', RootEntCnt);
disp(z);
TotSec = Buffer(hex2dec('13') + 1) + 256 * Buffer(hex2dec('14') + 1);
if TotSec ==0
</span>TotSec = Buffer(hex2dec('20') + 1) + 256 * Buffer(hex2dec('21') + 1) + 2^16 * Buffer(hex2dec('22') + 1) + 2^24 * Buffer(hex2dec('23') + 1);
end;
z = sprintf ('Загальна кількість секторів MMC/SD-карти: %d', TotSec);
disp (z);
SecPerFAT = Buffer(hex2dec('16') + 1) + 256 * Buffer(hex2dec('17') + 1);
z = sprintf ('Розм р таблиц FAT y ceктоpax: %d', SecPerFAT);
disp (z);
if (Buffer(hex2dec('36')+1)~= 'F'|Buffer(hex2dec('37')+1)~='A'|Buffer(hex2dec('38')+ 1)~= 'T'|Buffer(hex2dec('39') + 1) ~='1'|Buffer(hex2dec('3A')+ 1)~='6')
disp('FAT16 Error');
end;
temp = Buffer ((hex2dec('36') + 1):(hex2dec ('3A' + 1)));
z = sprintf ('Тип файлової системи: %s', char(temp));
disp (z) ;
FAT_Sect1 = VBR_Addr + RsvdSecCnt;
z = sprintf ('Перший сектор FAT1: %d', FAT_Sect1);
disp (z) ;
if (NumFATs > 1)
</span>FAT_Sect2 = FAT_Sect1 + SecPerFAT;
</span>z = sprintf ('Перший сектор FAT2 : %d', FAT_Sect2);
disp (z) ;
end;
RootDir_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs;
z = sprintf ('Перший сектор Root Directory: %d', RootDir_Sect);
disp(z) ;
RootDir_SectCnt = RootEntCnt * 32 / BytesPerSec;
z = sprintf('Кількість секторів в Root Directory: %d', RootDir_SectCnt);
disp (z) ;
Data_Sect = VBR_Addr + RsvdSecCnt + SecPerFAT * NumFATs + RootDir_SectCnt;
z = sprintf ('Номер сектора початку областіданих: %d', Data_Sect) ;
disp (z) ;
%Шукаємо 1-ий вільний запис в RootDirectory
Byte_F = 1; % початoк запису в байтах
Flag = 0; % прапорець знаходження вільного запису в RootDirectory
for jj = 1 : RootDir_SectCnt %в д 1-го до останнього сектору RootDirectory
[Buffer, cl] = MMC_SD_Read_Sector(s, RootDir_Sect + jj - 1); %читаємо поточний сектор
for ii = 1 : BytesPerSec/32 % лічильник записів
</span>temp = Buffer(1); % читаємо перший байт
if (temp == 0 | temp == hex2dec('E5'))
</span>z = sprintf('Вільний запис знайдено');
disp(z);
</span>Free_Sect_RootDir = RootDir_Sect + jj - 1;
</span>z = sprintf('Сектор вільного запису в RootDirectory: %d', Free_Sect_RootDir);
disp(z);
</span>Free_Num_RootDir = ii;
</span>z = sprintf('Номер вільного запису: %d', Free_Num_RootDir);
disp(z);
</span>Flag = 1;
break;
end;
</span>Byte_F = Byte_F + 32; %наступний запис (1 запис--32байти)
end;
if (Flag == 1) %файл знайдено
break;
end;
</span>Byte_F = 1;
end;
if (Flag == 0)
</span>z = sprintf('Неможливо записати файл: нема вільної памят ');
disp(z);
return; %вихід з програми
end;
Our_File = zeros(512,1); %створюємо файл
File_Size = length(Our_File ); % довжина файл
for i = 1 : ceil(File_Size / (SecPerClus * BytesPerSec))%від 1-го до останнього кластеру файлу
%шукаємо вільний кластер
First = 1;
Flag = 0;
temp = FAT_Sect1;
Free_Cluster = 0;
for jj = 1 : SecPerFAT
[Buffer, cl] = MMC_SD_Read_Sector(s, temp + jj - 1);
for ii = 1 : 2 : SecPerFAT * BytesPerSec
</span>free = Buffer (First);
if (Buffer(ii) + 256 * Buffer(ii + 1) == 0) %якщо кластер вільний
</span>Flag = 1;
break;
end;
</span>Free_Cluster = Free_Cluster + 1;
end;
if (Flag ==1)
break;
end;
end
z = sprintf('1-ий вільний кластер у таблиці FAT: %d', Free_Cluster);
disp(z);
end;
% запис в FAT
</span>Buffer(ii) = 255;
Buffer(ii + 1) = 255;
</span>wr = MMC_SD_Write_Sector(s, FAT_Sect1 + jj - 1, Buffer);
% запис в Rood Directory
[Buffer, cl] = MMC_SD_Read_Sector(s, Free_Sect_RootDir);
Our_File_1 = zeros (32,1);
% м'я файлу
Our_File_1(1) = 'N';
Our_File_1(2) = 'A';
Our_File_1(3) = 'M';
Our_File_1(4) = 'E';
Our_File_1(5) = 32;
Our_File_1(6) = 32;
Our_File_1(7) = 32;
Our_File_1(8) = 32;
%розширення файлу
Our_File_1(9) = 'W';
Our_File_1(10) = 'A';
Our_File_1(11) = 'V';
%номер першого кластеру
Our_File_1(28) = fix(Free_Cluster/256);
Our_File_1(27) = Free_Cluster - 256 * Our_File(28);
% розмір файлу
</span>Our_File_1(29) = 512;
</span>Our_File_1(30) = 0;
</span>Our_File_1(31) = 0;
</span>Our_File_1(32) = 0;
Buffer(32*(Free_Num_RootDir-1) + 1 : 32*(Free_Num_RootDir-1) + 1 +31) =Our_File_1;
wr = MMC_SD_Write_Sector(s, Free_Sect_RootDir, Buffer);
fclose(s);
Написати на мові MatLab або C функцію запису файлу у wav-форматі.
Програма запису файлу у wav-формат :
clear all;
% відкрити файл для запису
[y,Fs,bits]=wavread(D:\laba1\Lab_1_5.wav);
d=fopen(D:\laba1\Wav\My.wav','wb');
% заповнити поле RIFF_ID 52494646
fwrite(d, hex2dec('46464952'),'int 32');
% заповнити поле FILE_Length
fwrite(d, 110480, 'int32');
% заповнити поле WAVE_ID 57415645
fwrite(d, hex2dec('45564157'), 'int32');
% заповнити поле FMT_ID 666d7420
fwrite(d, hex2dec('20746d66'), 'int32');
% заповнити поле FMT_Length
fwrite(d, 16, 'int32');
% заповнити поле Type 0x0001 - просто вибірки
fwrite(d, 1, 'int16');
% заповнити поле Channels >>> Mono = 1, Stereo = 2,
fwrite(d, 1, 'int16');
% заповнити поле SamplesPerSec>>> частота дискретизації - Гц лаб 1
fwrite(d, 11025 , 'int32');
% заповнити поле AvgBytesPerSec >>> </span>== Channels * SamplesPerSec * BitsPerSample/8
fwrite(d, 11025, 'int32');
% заповнити поле Align >>> вирівнювання (якщо кількість вибірок не кратна2, в кінці файлу додаються нульове значення). Переважно рівне 0х0001
fwrite(d, 1, 'int16');
% заповнити поле BitsPerSample >>> 0х0008 - 8 біт на вибірку
fwrite(d, 8, 'int16');
% заповнити поле DATA_ID >>> Завжди рівний "data" =0x64617461
fwrite(d, hex2dec('61746164'), 'int32');
% заповнити поле DATA_Length >>> == NumSamples * Channels * BitsPerSample/8 к-сть вибірок
fwrite(d, 110421, 'int32');
%вибірки сигналу
for ii = 1 : 110421
fwrite(d,y(ii)*128+128,'uchar');
end;
fclose(d);
Програма стиснення аудіосигналу з потрібною степінню компресії :
[y,Fs,bits]=wavread(D:\laba1\Lab_1_5.wav);
% Виводимо основну інформацію про файл
Fs; % Частота дискретизації
bits; % Біт \ вибірку
% Відтворюємо файл в синхронному режимі
wavplay(y,Fs,'sync');
[Y, F, B] = wavread(D:\laba1\Lab_1_5.wav ');
% Будуємо гістограму
hist(Y*128, -128:127)
% Обчислюємо ймовірність появи відліків
P=hist(Y*128, -128:127) / length(Y);
% Оцінюємо досяжну кількість біт на вибірку n(опт)
Nopt = 0;
for ii=1:256
if(P(ii) > 0)
Nopt = Nopt - P(ii)*log2(P(ii));
end;end;
ks=bits/Nopt
Y = Y * 128; % Операція для цілого Y
N = 128; % розмір блоку
L = 40; % к-сть збережених коефіцієнтів ДКП на блок
nn = fix(length(Y)/N) % к-сть блоків
mm = 1;
kk = 1;
% Компресія
for ii = 1 : nn-1
x = dct( Y(kk : kk + N-1) );
y(mm : mm + L-1) = x(1 : L);% В y записуємо лише "великі" відліки
mm = mm + L;
kk = kk + N;
end;
% Квантування
y = round(y); % До цілого
[A, X] = hist(y, min(y) : max(y));
NN = length(y);
Ls = 0;
for ii = 1 : length(A)
if(A(ii) > 0)
Ls = Ls + (A(ii)/NN) * log2(A(ii)/NN);
end;
end;
disp('-Ls = '); -Ls
CR2 = (7 / -Ls) * (N / L) % CR2 -- cтепінь стиснення
% Відновлений сигнал
YC = Y * 0;
dx = Y(1 : N) * 0;
mm = 1;
kk = 1
% ...*0 -- це "малі" відліки
for ii = 1 : nn - 1
dx(1 : L) = y(mm : mm + L-1);
x1 = idct( dx );
YC(kk : kk + N-1) = x1;
dx = dx * 0;
mm = mm + L;
kk = kk + N;
end;
YC = YC / 128;
YC = round(YC * 128) / 128;
wavplay(YC, F, 'sync');
Розрахувати орієнтовну споживну потужність диктофону та час неперервної роботи від заданого джерела живлення.
Таблиця 1
Елементи схеми
Споживана потужність, Вт
Мікроконтролер
0.036
MMC/SD карта пам’яті
0.36
Мікросхема NAND-Flash пам’яті
0.108
Мікрофон
0.01
ОП та пасивні елементи
0.04
Світлодіоди та органи управління
0.02
Кола управління живленням
0.165
Всього
0.739 Вт
Отже орієнтовна споживна потужність диктофону буде рівна 0.739 Вт.
Визначаємо час неперервної роботи диктофону від джерела живлення LIR053449А:8
Висновок: В системах захисту широко використовуються прилади призначені для запису та відтворення інформації. Важливою складовою є акустична інформація як така і технічні пристрої призначені для її збору, зберігання та відтворення.
На прикладі цифрового диктофону, я отримав основні навички розробки пристроїв що можуть використовуватись в системах запису і відтворення інформації, засвоїв теоретичний матеріал і використав отримані знання на практиці.
В роботі я склав електричні схеми складових елементів цифрового диктофону, таких як:
Мікрофон і мікрофонний підсилювач;
Фільтр;
Мікроконтролер з вбудованим 10-бітним АЦП;
MMC/SD-карта;
NAND-Flash пам’ять;
Кола живлення;
Органи управління.
Також розробив програмне забезпечення необхідне для роботи пристрою.