roboforum.ru

Технический форум по робототехнике.

ЦАП в AVR через ШИМ и вывод звука .WAV

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

HarryStar » 23 фев 2011, 19:53

У меня в точности как написал ТС собрана говорилка.
АТмега32-16Мгц, SD карта 2Гб, звук через RC-цепочку на усилитель готовый из Чип-Дипа. Питание 5В, на карту преобразователь на 3.3, согласование уровней через резисторы.
Звук нормальный, можно даже музыку слушать, р2д2 тоже есть.

44 кГц оцифровка непрокатывает. Не успевает читать данные с карты. 22 без проблем. Можно что то среднее наверно сделать, но смысла не вижу.

Сделано на CVAVR 2.04.4a со встроенной библиотекой SD/MMC. Не видит длинных имен и русских букв, в остальном отлично работает, все звуки по папочкам, все удобно.
Если нужны исходники, могу выложить.
shome писал(а):А как при эом будет с realtime'овостью? То же использование в роботе - получится 1) одновременно крутить сервами, анализировать датчики, просчитыват путь и реакцию, и 2) чтобы звук не затыкался?

Никак. Чтение с флешки занимает много ОЗУ, плюс почти все процессорное время жрется при чтении. Сервы уже неполучится добавить, или будут помехи в звуке или сервы будут дергаться или и то и другое. Я уже для себя определился что надо будет ставить 4 МК:
1) Центральный - датчики и общая логика
2) Серво контроллер на 24 сервы
3) Звук
4) Радиоуправление (анализ импульсов с модельных приемников тоже жрет дофига ресурсов)

По I2C все между собой общаются. Лишь бы на него хватило ресурсов. С ним еще не разбирался, пока готовы модули 2, 3, 4 (без I2C).
Последний раз редактировалось HarryStar 23 фев 2011, 20:05, всего редактировалось 1 раз.

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

blindman » 23 фев 2011, 20:04

HarryStar писал(а):44 кГц оцифровка непрокатывает. Не успевает читать данные с карты. 22 без проблем.

Какая разрядность? Сколько каналов?

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

HarryStar » 23 фев 2011, 20:06

8 бит разрядность, 1 канал. Для робота больше то не надо

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Holmes » 24 фев 2011, 12:31

2HarryStar: Выкладывайте =)

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

HarryStar » 25 фев 2011, 00:00

Код: Выделить всёРазвернуть
/*****************************************************
Chip type               : ATmega32
AVR Core Clock frequency: 16,000000 MHz
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <ff.h>
#include <sdcard.h>
#include <STRING.h>

void play_file(char *nfile);
void play_stop();

// FAT function result
FRESULT res;
// number of bytes written/read to the file
unsigned int nbytes;
// will hold the information for logical drive 0:
FATFS fat;
// will hold the file information
FIL file;
// file read buffer
#define WAV_BUFFER_SIZE 128
char buffer[WAV_BUFFER_SIZE];
unsigned char play; // 1 - что то воспроизводится 0 - нет

// Заголовок WAV файла
typedef struct
{
   unsigned char id_riff[4];   // 4 byte
   unsigned long len_riff;      // 4 byte

   unsigned char id_chuck[4];   // 4 byte
   unsigned char fmt[4];      // 4 byte
   unsigned long len_chuck;   // 4 byte

   unsigned int  type;      // 2 byte
   unsigned int  channels;      // 2 byte
   unsigned long freq;      // 4 byte
   unsigned long bytes;      // 4 byte
   unsigned int  align;      // 2 byte
   unsigned int  bits;      // 2 byte

   unsigned char id_data[4];   // 4 byte
   unsigned long len_data;      // 4 byte
} TitleWave;// 44 byte

TitleWave tw;

void main(void)
{
unsigned char c;

play = 0;
PORTA=0x00;DDRA=0x00;
PORTD=0x00; DDRD=0x80; // PD7 (OC2) как выход

disk_timerproc();

// Timer/Counter 2 initialization
// Mode: Fast PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 0 initialization
TCCR0=0x05;
TCNT0=0x00;
OCR0=0x9C; // Для 16Мгц

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03;
OCR1AL=0xE8;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02 | 0x10; // Старт таймер 0 и 1
#asm("sei")

res=f_mount(0,&fat);

// DEMO. Тут пути к вашим файлам на флешке

// Звук локатора 4 раза
for(c=0;c<4;c++)
{
  play_file("0:/Other/locat8k.wav");
  while(play); // Ожидение конца воспроизведения
}

// Пулемет 32 пули
for(c=0;c<32;c++)
{
  play_file("0:/Weapon/m1gun16k.wav");
  while(play); // Ожидение конца воспроизведения
}

// Музычка
play_file("0:/Music/teh_16k.wav");

}
void play_stop()
{
  play = 0;
  TCCR2=0b00000000;
  f_close(&file);
}
void play_file(char *nfile)
{
  if ((res=f_open(&file,nfile,FA_READ))==FR_OK) // Открытие файла
  if((res=f_read(&file,&tw,44,&nbytes))==FR_OK) // Чтение WAV-Сигнатуры
        if ( strncmp(tw.id_riff,"RIFF",4) == 0 )   // совпал идентификатор RIFF
   if ( strncmp(tw.id_chuck,"WAVE",4) == 0 )   // совпал идентификатор CHUCK
   if ( strncmp(tw.fmt,"fmt ",4)== 0 )        // совпал идентификатор FMT
   if ( tw.type == 1 )                 // Тип данных - выборка
   if ( tw.channels == 1 )                 // моно
   if ( tw.bits == 8 )                 // 8 бит
   if ( strncmp(tw.id_data,"data",4)== 0 )    // совпал идентификатор DATA
  {
        if(tw.freq == 16000)
        {
          OCR1AH=0x03;
          OCR1AL=0x90;
        }
        if(tw.freq == 8000)
        {
          OCR1AH=0x07;
          OCR1AL=0xD0;
        }
        TCCR2=0x69; // 0b1000101 - Запуск ШИМа
        play = 1; // Запуск воспроизведения
        return;
  }
}

/* 100Hz timer interrupt */
// Дергаем флешку, чтоб не заснула
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
  TCNT0=0x00; disk_timerproc();
}

// Timer1 output compare A interrupt service routine
// 16000 Hz / 8000 Hz
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
static unsigned int c256=0;
TCNT1=0x00;
if(play == 0)
{
   c256 = 0;
   return; // Нет ничего для проигрывания
}
// Читаем новый блок
if(c256 == 0 || c256 == nbytes) // Или первый блок или следующий
{
   if(c256 == nbytes && nbytes!=WAV_BUFFER_SIZE)
   {
     c256 = 0;
     play = 0;
     TCCR2=0b00000000;
     //TIMSK=0x02 | 0x10; // Старт таймер 0 и 1
     return;
   }
   if((res=f_read(&file,buffer,WAV_BUFFER_SIZE,&nbytes))==FR_OK) // Читаем в буфер
   {
     c256 = 0; // Счетчик текущего байта в буфере
   }
   else // Ошибка чтения или конец файла. Останавливаем воспроизведение.
   {
     c256 = 0;
     play_stop();
     return;
   }
}

if(nbytes>0)
  OCR2=buffer[c256++]; // Выводим через ШИМ
else // Конец воспроизведения
{
     c256 = 0;
     play_stop();
     return;
}
}

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Holmes » 25 фев 2011, 18:01

Благодарю, придется подумать как это переписать для Arduino IDE.

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Myp » 25 фев 2011, 18:26

на ардуине оно будет тормозить гораздо сильнее
я бы попробовал поискать скетчи для ардуины :)

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

grek » 06 апр 2011, 14:39

Подскажите пожалуйста как для proteus mmc создать файл mmc.Если можно поподробней.Программа для контроллера та, которая для CV.Как бы создаю образ с помощью winimage,но gjxtbe то не работает.И содержимое образа,судя по описанию на FAT довольно таки странноватое.Может,что делаю не так.
File/new/select custom image format ok сохраняю как IMA. Потом записываю туда музочку в формате wav(16000 моно),и сохраняю.А каталогом он является не совсем понятно.И ни чего не воспроизводится.Если не трудна напишите последовательность действии.Может winhex попробовать,если кто подскажет как.

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

USER777 » 07 апр 2011, 18:30

В Proteus - е подключаю образ созданный в Winimage. File -> New -> Select custom image format -> File System выбираю FAT 12/16 -> Total number of sectors (количество секторов т.е будущий объем образа в секторах ) -> OK -> Даем имя файлу образа, сохраняем. Теперь в окне программы появился что то похожее на проводник, Так вот в в правую часть просто закидываем файлы. Далее сохраняем, выходим из программы. В получившимся файле имя_файла.IMA меняем расширение на .mmc Все подключаем файл образ в Proteus-e.

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

grek » 08 апр 2011, 09:37

А названия диска какое будет,корневой каталог какой?

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

HarryStar » 08 апр 2011, 11:12

От компилятора и ммс библиотеки зависит. в CVAVR "0:/" корень, в других незнаю


Rambler\'s Top100 Mail.ru counter