Proje: D-Class Amplifikatör Yapıyoruz!!

Başlatan FxDev, 28 Kasım 2014, 23:37:45

FxDev

@mistek: Ben ADC ve DMA'yı bağlayıp 64 örneği bir anda alıp sonra DMA kesmesine götürdüm, DMA kesmesinden sonra da FFT aldırıp ekrana çıkartacağım.

Şu aralar başka bir kaç işim olduğundan FFT'ye sipariş ettiğim ekranlar gelince bakacağım. Initiall kodlarımı aşağıda vereyim ben.

void ADC_TIM_DMA_Configuration(void)
{
  TIM_TimeBaseInitTypeDef 	TIM_TimeBaseStructure;
  TIM_OCInitTypeDef 				TIM_OCInitStructure;
  ADC_InitTypeDef 					ADC_InitStructure;
  DMA_InitTypeDef 					DMA_InitStructure;
	GPIO_InitTypeDef    			GPIO_InitStructure;
	NVIC_InitTypeDef 					NVIC_InitStructure;
 
  /* ADC1 DeInit */
  ADC_DeInit(ADC1);
 
  /* ADC1 & TIM1 Periph clock enable */
	RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);						// 12MHz clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_TIM1, ENABLE);
	
	/* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
 
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	
	/* GPIO Configuration */
	GPIO_StructInit(&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin 		= GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode 		= GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd 		= GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
 
  /* TIM1 Configuration */
  TIM_DeInit(TIM1);
 
  /* Time base configuration */
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Prescaler 							= (SystemCoreClock / 1000000) - 1; 	// 1 MHz, from 48 MHz
  TIM_TimeBaseStructure.TIM_Period 									= 25; 															// 40 KHz
  TIM_TimeBaseStructure.TIM_CounterMode 						= TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_ClockDivision 					= 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter 			= 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
 
  /* Output Compare PWM Mode configuration */
  TIM_OCStructInit(&TIM_OCInitStructure);
  TIM_OCInitStructure.TIM_OCMode 										= TIM_OCMode_PWM1; /* low edge by default */
  TIM_OCInitStructure.TIM_OutputState 							= TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse 										= 1;
  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
 
  /* TIM1 enable counter */
  TIM_Cmd(TIM1, ENABLE);
 
  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
 
  /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr 				= (uint32_t)&ADC1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr 						= (uint32_t)&RegularConvData[0];
  DMA_InitStructure.DMA_DIR 											= DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize 								= 64;
  DMA_InitStructure.DMA_PeripheralInc 						= DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc 								= DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize 				= DMA_PeripheralDataSize_HalfWord;		// 16bit degisken
  DMA_InitStructure.DMA_MemoryDataSize 						= DMA_MemoryDataSize_HalfWord;				// 16bit degisken
  DMA_InitStructure.DMA_Mode 											= DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority 									= DMA_Priority_High;
  DMA_InitStructure.DMA_M2M 											= DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
	
	//Enable DMA1 channel IRQ Channel */
	DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
	NVIC_InitStructure.NVIC_IRQChannel 							= DMA1_Channel1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPriority 			= 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd 					= ENABLE;
	NVIC_Init(&NVIC_InitStructure);
 
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
 
  /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
 
  /* Enable ADC_DMA */
  ADC_DMACmd(ADC1, ENABLE);
 
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
 
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution 								= ADC_Resolution_12b;
  ADC_InitStructure.ADC_ContinuousConvMode 				= DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge 			= ADC_ExternalTrigConvEdge_Rising;
  ADC_InitStructure.ADC_ExternalTrigConv 					= ADC_ExternalTrigConv_T1_CC4;
  ADC_InitStructure.ADC_DataAlign 								= ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection 						= ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);
 
	/* Convert the ADC1 Channel11 and channel10 with 55.5 Cycles as sampling time */ 
  ADC_ChannelConfig(ADC1, ADC_Channel_10 , ADC_SampleTime_13_5Cycles);
 
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
 
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
 
  /* Wait the ADCEN flag */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
 
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);
}
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

kralsam

Selamlar,

Fırat hocam genel anlamda bir göz gezdirdim projeye ve bir konuyu merak etim. FFT yi sadece görsellik için mi kullanacaksın yoksa başka bir amaç var mı?

İyi çalışmalar.

robomaster

#167
Arkadaşlar bir FFT uygulaması inceledim de...
Orada şöyle bir ifade var. Anlamadım, biliyor musunuz?

ÇÖZÜLDÜ:

31 frequency buckests. ----------> Dikey barlardan bahsediyor, anlaşıldı.
312- 10khz range  ---------------->Bunu anladım.
10 Frames per second ----------->Saniyede 10 kere LCD tazeleniyor. (FFT zaman alıyor tabi...)

FxDev

Alıntı yapılan: kralsam - 14 Aralık 2014, 19:42:08
Selamlar,

Fırat hocam genel anlamda bir göz gezdirdim projeye ve bir konuyu merak etim. FFT yi sadece görsellik için mi kullanacaksın yoksa başka bir amaç var mı?

İyi çalışmalar.

OLED LCD'yi kullanmak istiyorum. Tek amacım görsellik, başka bir amaç yok orada bir de işlemci gücünü görmek.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

mistek

@FxDev DAC verisini nerede güncelliyorsunuz?

PWM ne için? TPA entegresine mi vereceğiz?


Bişeyi merak ediyorum.
ADCden müziği örnekleyip işlemciye aldıktan sonra bunu en kısa yoldan kulaklığa nasıl iletirim?

1)DAC çıkışına doğrudan verdim ses alamadım.

2)DAC çıkışına seri 100n koyup bunun çıkışına kulaklığı taktım yine ses alamadım.(Niye böyle bişey yaptığımı bilmiyorum)

DAC çıkışını osiloskopta görüyorum. Muhtemelen çıkış çok güçsüz kulaklığı süremiyor. Birde ADC girişinden gelen offset var bunu nasıl kaldıracağız?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

FxDev

ADC'den gelen offseti yok etmek için bir tane opamp ile buffer yapıp çıkışına kapasite koyman gerekiyor. Daha sonrasında kulaklığa girersen çok az da olsa ses duyman gerekiyor. Yüksek frekansta sorun çıkıyordu, DMA kesmesi gelir gelmez gönderim yapmıştım o zaman bire bir tutuyordu neredeyse ama yüksek frekansa çıktıkça sorun çıkmaya başlıyor.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

Karamel

#171
fxdev hocam bu proje nasil gidiyor?

mesaj birleştirme:: 05 Şubat 2015, 06:09:22

yan suan ne durumda?

emrk77

arkadaşlar merhaba;
ben de yaklaşık 1 senedir d sınıfı amfiler ile uğraşıyorum. amacım portatif birşey yapmak yani akü ile çalışacak.
dolayısıyla verim önemli .bu yüzden d sınıfını seçtim. çalışmalarda en çok karşılaştığım sorun ses düşüklüğü oldu.
bu sorunu aşmak için sanırım çıkış gerilimini yükseltmek gerekiyor... verim ve volum performansını değerlendirmek
için epey denemelerim oldu. bunları sizlerle de paylaşmak isterim.
ilk denemede pwm üretmek için üçgen ve ses dalgasını opamp ile karşılaştırıp mosfetlerden çıkış aldım. cızırtısız sesler
elde etsem de malesef volumu istediğim seviyeye çıkartamadım. fakat tekrar deneyeceğim
555 entegresi ile bir denemem oldu. her ne kadar teoriye uymasa da ses seviyesi olarak yüksek sayılır. ancak tabiki ses kalitesinden bahsedemeyiz.
tl494 entegresi ile denemelerim oldu ve en çok memnun kaldığım devrenin bu olduğunu söyleyebilirim. fakat bu devrede de ses seviyesini istediğim volume ulaştıramadım... volumu yükseltmek için daha güçlü bi kaynak kullandım bu sefer 494 iptal oldu .. malum boardda denemeler
yapıyorum ve hatalar olabiliyor ben de parçaları yakmamak için gerilimi yavaş yavaş artırıyorum...
modulasyon katı bu şekilde...
mosfet sürmeye gelince ir2110 2111 gate sürücüler kullandım pek memnun kalmadım veya ben tam anlamıyla sürememiş olabilirim. zaten mosfet sürücülerde entegre kullanmak biraz pahalıya geliyor. geçen 3 adet gate sürücü aldım üçünü birden yaktım =) 24 lira çöpe gitti. neyse bu yüzden transistörlerle idare ediyorum. hem bu şekilde devreye daha iyi hakim olunabiliyor.
bir süre ara verip amfi işine tekrar döndüm ve modulasyon vs ile uğraşacağıma dsp ile modülasyon yaptım... fakat volum düşüklüğü baki... ve dsp yazılımı ile vakit kaybetmemek için yine tl494 e döndüm...
sesi yükseltmek için giriş gerilimini yükseltmek gerekiyor diye bir de boost convertör ile denemem oldu boost convertor aralarda pikler yaptı beni hasta etti ama başka çare yok sanırım gerilim yükseltmek için....
umarım faydalı paylaşımlar olur saygılar sevgiler

maodon

#173
çıkış akımı düşükse mofsetleri kaskat bagla  kazanç artar

maodon

http://www.angelfire.com/sd/paulkemble/classdelek.gif  bu devreyi yapıp çalıştırdım  elektor dergisi 1980 mayıs ta vermiş .ses düşüklüğü  diye bir sorun yok ses okadar kuvvetli geliyorki preanfinin kazancını düşürmek zorunda kaldım.

emrk77

#175
60watt civarında performası denemek lazım

erkan614

İyi günler Arkadaşlar
benim aklıma birden nedense d-class anfi geldi ve tpa3116 entegresi ile bi pcb yapayım dedim
sonra ne gereği var ali expresten satın al dedim resimdeki üründe 2 adet tps3116 var zaten ikisi 7$ yapıyor
pcb pasifler vs derken 16$ alttaki ürünü alıcam en azından denerim

rayman

Class D Amplifikatör'ler ile uğraştım hatta 1 adet yaptım zorda olsa çalıştırabildim....

İlk önce girişteki Analog Sinyali Dijitale çevirmek gerekiyor. Tabi bunu Opamp ile Sinüs'ü- Kare Dalgaya çevirmeniz gerekiyor. Bu sayede pwm elde ediyorsunuz. Onunlada yüksek frekans üretip güç transistörleri sürüyorsunuz..... Tabi bunu kısım kısım anlattım ancak : burada önemli olan bir unsur var , herhangi sıradan bir Mosfet kullanamazsınız. https://www.youtube.com/watch?v=Rool6g-p9ps
Bu video da çalıştığını göstermek istedim...
Block diyagramıda budur. Bu çalışma 2x50 vede 2x 90vdc ile 900 watt güç verebilmektedir.

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay