Merhabalar. Bir proje üstünde çalışıyorum 6 kanaldan veri okumam, belli hesaplar yapıp 7 segment üzerinde göstermem lazım.
Dmadan veriyi çekiyorum sorun yok. Fakat herhangi bir gpio işlemi gerçekleşmeye başladığı an DMA verisi zıplamaya başlıyor. Inputlarda boşken vdd/2 giriş var +/- yapabilmek için. Dediğim gibi sadece DMA açıkken +- 3(4096) sekme var bu normal. Ama timer çalışmaya başlayınca ve segment taraması başladığı an +-100 e kadsr çıkıyor. Işlemci 72MHz Adc 4.5-8-9-12Mhz de denedim hepsinde aynı sıçrama var. İşlemci hızı düşerse sekme +-50ye kadar azalıyor fakat sıfırlanmıyor.
Böyle bir sorunla karşılaşan var mı daha önce?
Not: besleme gürültülerini kontrol ettim çok düşük. St link üzerinde beslediğimde de, dışarıdan beslediğimde de sonuç değişmedi.
Platform Keil mdk arm 5.26
Hal library f1 1.8
Eğer ADC Referansınız VCC ise bu kadar sapma olması normal diye düşünüyorum. Harici referans entegresi kullanmanızda fayda var.
@z abi bu videonu izlemiştim daha önce, izlediğim hiç aklıma gelmedi bi deneyeyim.
@Mucit23 problem offset kayması değil, kayda da önemli değil benim için.
Asıl sorun z hocamın videosundaki gibi spike durumu.
Kodun tamamını kapadım. while dahil her yer boş. DMA'yı çalıştırıyorum ripple/sekme / gürültü vs. birşey yok. 2048+-2 düz çizgi gibi geliyor.
while içine var++; bile yazsam DMA verisi sekmeye başlıyor 2048+-70 aralığında gidip gelmeye başlıyor. gpio frekansını da denedim onunla da ilgili değil.
Harici bir besleme ile inputları besledim sonuç hiç değişmedi. :'( :du:
Hocam benzer durumu bende yaşıyorum. ADC verilerini sağlıklı şekilde alamıyorum. Sample rate lerinde ufak değişiklikler yapsam dahi sonucu etkiliyor.
Referans olarak ta VREF_INT i kullanıyorum, gerekli hesaplamaları yapıp ölçümü öyle değerlendiriyorum fakat özellikle besleme gerilimini dahi sağlıklı okuyamıyorum...
Umarım bir yerde hata yapıyoruzdur ve çözümünü bilen birisi vardır.
kod kısmını yazabilir misiniz acaba.
sorun şuradan da kaynaklanıyor olabilir.
çok kanallı adc okumalarında kanalların adc çevrimlerinin bitmesinin beklenmesi gerekiyor.
galiba çevrimler bitmeden okuma yaptırıyorsunuz.
yani siz kodu baştan sona buraya bi atın bakalım.
@startirrek704250 Alıntı yapılan: e-zeki - 03 Nisan 2020, 14:18:33Kodun tamamını kapadım. while dahil her yer boş. DMA'yı çalıştırıyorum ripple/sekme / gürültü vs. birşey yok. 2048+-2 düz çizgi gibi geliyor.
while içine var++; bile yazsam DMA verisi sekmeye başlıyor 2048+-70 aralığında gidip gelmeye başlıyor. gpio frekansını da denedim onunla da ilgili değil.
Harici bir besleme ile inputları besledim sonuç hiç değişmedi. :'( :du:
Yukarıda söyledim kodun tamamı kapalıyken hariç her duruma ripple var.
Acaba elindeki MCU clone muadilinden mi?
Alıntı yapılan: e-zeki - 03 Nisan 2020, 20:31:39@startirrek704250
Yukarıda söyledim kodun tamamı kapalıyken hariç her duruma ripple var.
eldeki verilerle başka bir sebep kalmıyor hocam.ilginç bir durum.
çekirdek ve adc dma ayarlarını atın belki orada bir hata vardır buluruz.
Burada (https://www.picproje.org/index.php/topic,54787.msg419267.html#msg419267) Bende bu tarz bir problemle karsılastım. Ama bir çözüm bulamamıştım.
kusura bakmayın çok geç yazıyorum maalesef.
@apsis hocam özdisandan aldım ama patetes mi yolladılar bilmiyorum.
@GreeN bire bir aynı durum hocam pinler floating durumdayken gelen datalar dans ediyor.
@startirrek704250 adc init
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 6;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
dma link
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**ADC1 GPIO Configuration
PA0-WKUP ------> ADC1_IN0
PA1 ------> ADC1_IN1
PA2 ------> ADC1_IN2
PA3 ------> ADC1_IN3
PA4 ------> ADC1_IN4
PA5 ------> ADC1_IN5
*/
GPIO_InitStruct.Pin = A1_Pin|A2_Pin|A3_Pin|A4_Pin
|A5_Pin|A6_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* ADC1 DMA Init */
/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
hdma_adc1.Init.Mode = DMA_CIRCULAR;
hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
}
}
Merhaba .Ben de bir fikir vermek istedim. Acaba ADC giriş kanallarına 100 KOHM direnç bağladınız mı?
10K pulldown attım, +10nF da attım yok, bana mısın demiyor.
Butun ADC girislerini birlestir tek bir voltaj olcumu yapmayi dene.
Ekran görüntüsü adc girişi direk gnd ye bağlı.
Yanlis yaptigimiz ne ? 100ms de bir adc1 verini okuyorum . baska hicbir cevre birim kullanilmiyor. debug icin serial wire 2 pin aktif. Haricinde calisan birsey yok. Durum bu.
Edit: pll devre disi biraktim islemciyi 8mhz de calistirdim adc sampling time 56cycles yaptim. degisen bisey yok.
işlemcinizin fiyatına ST'den DIGIKEY'den bakın...
bir de aldığınız fiyata bakın...
Bir süredir bakamıyordum. konuyu hortlatmış gibi olacağım ama
@Erol YILMAZ hocam digikeyden alınmış nucleo board ile de denedim discovery board ile de denedim pinler boşta iken yine sekmeler ve dalgalanmalar aynı seviyede devam ediyor.
sorunun kaynağını bulabiliniz mi. ben de dma ile okuma yaptığımda ofsetli okuyor sanki. olması gerektiğinden 300-400 fazla okuyor.
@sadogaffari forumda daha önce konuşulmuştu. Ben de buradaki gibi yapınca sorun çözülmüştü. Gözden kaçan ayar olabilir.
https://www.picproje.org/index.php/topic,43472.0.html