PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : wave پلیر با Fatfs



wantedboy
10-11-2014, 18:49
سلام دوستان
دیدم کسی جواب نداد!
گفتم خودم دست بکار بشم شروع به خوندن بیت به بیت یک فایل wave کردم.
فعلا توانستم مشخصات یک فایل wave بدست آوردم.
کد های این بخش براتون گذاشتم.
قسمت بعد میریم برای پخشش😄

void load_header (void)
{
unsigned int CChunkSize,SamplingRate,BByteRate,SSubchunk2Size;
int i;
BYTE ChunkID[4];
BYTE ChunkSize[4];
BYTE Format[4];
BYTE Subchunk1ID[4];
BYTE Subchunk1Size[4];
BYTE AudioFormat[2];
BYTE NumChannels[2];
BYTE SampleRate[4];
BYTE ByteRate[4];
BYTE BlockAlign[2];
BYTE BitsPerSample[2];
BYTE Subchunk2ID[4];
BYTE Subchunk2Size[4];
BYTE Data[1024];
char buferr[12];
FIL file;
f_mount(0, &fs);
//res = f_open(&file,filename, FA_OPEN_EXISTING | FA_READ);
f_open(&file,"0:8bit.wav", FA_OPEN_EXISTING | FA_READ);
f_read(&file,ChunkID,4, &br);
f_read(&file,ChunkSize,4, &br);
f_read(&file,Format,4, &br);
f_read(&file,Subchunk1ID,4, &br);
f_read(&file,Subchunk1Size,4, &br);
f_read(&file,AudioFormat,2, &br);
f_read(&file,NumChannels,2, &br);
f_read(&file,SampleRate,4, &br);
f_read(&file,ByteRate,4, &br);
f_read(&file,BlockAlign,2, &br); f_read(&file,BitsPerSample,2, &br); f_read(&file,Subchunk2ID,4, &br); f_read(&file,Subchunk2Size,4, &br); f_read(&file,Data,1024, &br);
f_close(&file);

for(i=0;i<4;i++){
sprintf(buferr,"%c",ChunkID[i]); DrawStringAt(0,i,buferr,WHITE,GetBkColor());
}

CChunkSize=LD_DWORD(ChunkSize); sprintf(buferr,"ChunkSize:%d",CChunkSize);
DrawStringAt(1,0,buferr,WHITE,GetBkColor());

for(i=0;i<4;i++){
sprintf(buferr,"%c",Format[i]); DrawStringAt(2,i,buferr,WHITE,GetBkColor());
}
for(i=0;i<4;i++){
sprintf(buferr,"%c",Subchunk1ID[i]);
DrawStringAt(3,i,buferr,WHITE,GetBkColor()); }

sprintf(buferr, "Subchunk1Size:%d", Subchunk1Size[0]); DrawStringAt(4,0,buferr,WHITE,GetBkColor());

sprintf(buferr, "AudioFormat:%d", AudioFormat[0]); DrawStringAt(5,0,buferr,WHITE,GetBkColor());
sprintf(buferr, "NumChannels:%d", NumChannels[0]); DrawStringAt(6,0,buferr,WHITE,GetBkColor());

SamplingRate=LD_DWORD(SampleRate); sprintf(buferr,"SamplingRate:%d",SamplingRate); DrawStringAt(7,0,buferr,WHITE,GetBkColor());

BByteRate=LD_DWORD(ByteRate); sprintf(buferr,"ByteRate:%d",BByteRate); DrawStringAt(8,0,buferr,WHITE,GetBkColor());

sprintf(buferr, "BlockAlign:%d", BlockAlign[0]); DrawStringAt(9,0,buferr,WHITE,GetBkColor());

sprintf(buferr,"BitsPerSample:%d",BitsPerSample[0]; DrawStringAt(10,0,buferr,WHITE,GetBkColor());

for(i=0;i<4;i++){
sprintf(buferr,"%c",Subchunk2ID[i]); DrawStringAt(11,i,buferr,WHITE,GetBkColor()); //data
}
SSubchunk2Size=LD_DWORD(Subchunk2Size);
sprintf(buferr,"Subchunk2Size:%d",SSubchunk2Size; DrawStringAt(12,0,buferr,WHITE,GetBkColor());
}

wantedboy
13-11-2014, 23:04
سلام دوستان
حالا برای خواندن دیتا ها به pwm احتیاج داریم.
من یک مثال با توضیح در مورد pwm و مدهایش پیدا کردم.بعد باید بریم سراغ تنظیم کردنش برای پخش.
You can see links before reply_pwm

wantedboy
14-11-2014, 16:06
سلام دوباره
من فعلا کدها های pcm مربوط به یک فایل wave را بدست آوردم.
بنظرتون باید این کد ها را داخل کدام قسمت تامیر و pwm قرار بدهم.
این ک هم که گذاشتم.یک موج pwm یک کیلو هرتز با دیوتی سایکل 10 درصد تولید می کنه.


GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBase_InitStructure;
TIM_OCInitTypeDef TIM_OC_InitStructure;

System Init ();

RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitStructure GPIO_Mode = GPIO_Mode_AF_PP.
GPIO_InitStructure GPIO_Pin = GPIO_Pin_0.
GPIO_InitStructure GPIO_Speed ​​= GPIO_Speed_50MHz.
GPIO_Init (GPIOA, & GPIO_InitStructure);

TIM_TimeBase_InitStructure TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBase_InitStructure TIM_CounterMode = TIM_CounterMode_Up.
TIM_TimeBase_InitStructure TIM_Period = 999.
TIM_TimeBase_InitStructure TIM_Prescaler = 71.
TIM_TimeBaseInit (TIM2& TIM_TimeBase_InitStructure);

TIM_OC_InitStructure TIM_OCMode = TIM_OCMode_PWM1.
TIM_OC_InitStructure TIM_OCIdleState = TIM_OCIdleState_Reset.
TIM_OC_InitStructure TIM_OCNIdleState = TIM_OCNIdleState_Set.
TIM_OC_InitStructure TIM_OCPolarity = TIM_OCPolarity_High.
TIM_OC_InitStructure TIM_OCNPolarity = TIM_OCNPolarity_High.
TIM_OC_InitStructure TIM_OutputState = TIM_OutputState_Enable.
TIM_OC_InitStructure TIM_OutputNState=TIM_OutputNState_Disable.
TIM_OC_InitStructure TIM_Pulse = 100;
TIM_OC1Init (TIM2 & TIM_OC_InitStructure);
TIM_Cmd (TIM2, ENABLE);


فکر کنم کدها های مربوط به صوت باید داخل قسمت تعیین کننده ی دیوتی سایکل قرار بدهم.
ولی فکر کنم این کافی نباشه!

wantedboy
14-11-2014, 21:53
سلام دوستان.
من یه برنامه نمونه ای که دیدم دو از دو مورد از مشخصات فایل wave استفاده کرده بود یکی
sampeling rate و chunksize.
دومی می دونم برای مقدار خواندن از کد های pcm استفاده میشه.
در مورد اولی نمی دوم کجا باید تاثیرش بدم؟
کسی در مورد این قسمت (پخش با pwm) اطلاعاتی نداره؟؟؟؟؟
ممنون میشم دوستان

vahid_22002
14-11-2014, 22:59
sampling rate
نرخی هست که با اون نمونه برداری می شه.
یعنی می گه هر چن ثانیه یه بار نمونه برداری شده.
شما هم باید با همون فرکانس pwm بسازین تا بتونه باز سازی بشه.
مثلا نمونه برداری می کنه و از 0 تا 99 یا از 0تا 255 مقدار می ده.
خوب شما باید پشت سر هم دیتا رو تغییر بدین تا dc خروجی pwm بیفته دو سر بلندگو.
معمولا نرخ نمونه برداری حدود 44800 هرتزه که تقریبا همون نرخ نایکوییسته.(2 برابر ماکسیمم فرکانس موجود در سیگنال که این جا سیگنال شما صوتیه و ماکسیمم فرکانس موجو در اون حدود 20khz هستش)

wantedboy
15-11-2014, 15:11
ممنون دوست عزیز
مثلا برای نمونه اون عکس بالا 22050 sampel rate با توجه به صحبت شما یعنی هر 45 میلی ثانیه یکبار نمونه 8 بیت نمونه برداری می کنه.
حالا به نظرتون من باید دو تا تایمر هم زمان فعال کنم که یکی برای هر 45 ثایمه و اون یکی برای pwn .
حالا فرکانس اون چی باشه؟