logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[STM32] STM32F105RCT6 ADC - dziwne efekty przy skanowaniu ciągłym z DMA

qtch 12 Wrz 2011 22:19 27709 6
REKLAMA
  • #1 9921288
    qtch
    Poziom 12  
    Posty: 62
    Ocena: 2
    W STM32F105RCT6 mam dziwne efekty dzialania ADC. ADC jest ustawione wg. noty aplikacyjnej dla skanowania ciaglego. KOD:
    
     DMA_DeInit(DMA1_Channel1);
    	  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
    	  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1ConvertedValue;
    	  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    	  DMA_InitStructure.DMA_BufferSize = BufferLenght;
    	  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    	  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    	  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    	  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    	  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 channel1 */
    	  DMA_Cmd(DMA1_Channel1, ENABLE);
    
    	  /* ADC1 configuration ------------------------------------------------------*/
    	  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    	  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    	  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    	  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    	  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    	  ADC_InitStructure.ADC_NbrOfChannel = BufferLenght;
    	  ADC_Init(ADC1, &ADC_InitStructure);
    
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 7, ADC_SampleTime_239Cycles5);
    	  ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 8, ADC_SampleTime_239Cycles5);
    	  /* Enable ADC1 DMA */
    	  ADC_DMACmd(ADC1, ENABLE);
    
    	  /* Enable ADC1 */
    	  ADC_Cmd(ADC1, ENABLE);
    
    	  /* Enable ADC1 reset calibaration register */
    	  ADC_ResetCalibration(ADC1);
    
    	  /* Check the end of ADC1 reset calibration register */
    	  while(ADC_GetResetCalibrationStatus(ADC1));
    
    	  /* Start ADC1 calibaration */
    	  ADC_StartCalibration(ADC1);
    
    	  /* Check the end of ADC1 calibration */
    	  while(ADC_GetCalibrationStatus(ADC1));
    
    	  /* Start ADC1 Software Conversion */
    	  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    	  /* Test on Channel 1 DMA1_FLAG_TC flag */
    	  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
    
    	  /* Clear Channel 1 DMA1_FLAG_TC flag */
    	  DMA_ClearFlag(DMA1_FLAG_TC1);
    


    Efekt działania jest taki, że pomiar na danym kanale "przenosi" się częściowo na kanał kolejny, tzn. przy napięciu bliskim 0V jest 26 na obu kanałach, a przy bliskim 3,3V na pomiarowym jest 4080, a na sąsiednim 120. Efekt ten narasta liniowo. Dotyczy to wszystkich kanałów. Zmiana częstotliwości próbkowania zmniejsza ten efekt, ale go nie eliminuje. Nie jest to tez wina nadpisywania zmiennych, pomiary woltomierzem też są zakłócane. Po wyczyszczeniu FLASHA pomiary są ok, więc nie jest to hardware. Nie mam pomysłu jak z tym walczyć, zakłócenia nie są bardzo znaczące, bo rzędu 2,5%, ale jest to co najmniej dziwne i chciałbym się tego pozbyć, jakieś sugestie ?[code]
  • REKLAMA
  • #2 9954117
    michcior
    Poziom 30  
    Posty: 1132
    Pomógł: 159
    Ocena: 462
    Próbowałem się przyjrzeć architekturze tego ADC ale nie jest dość jasna w dokumentacji. Moim zdaniem, problemem jest to, że tak na prawdę to jest jeden przetwornik z jednym kondensatorem próbkującym. Przełączane są tylko kanały analogowe. Ten kondensator ma ok 15-20pF. Jak się go nie rozładuje do zera (np przełączając na kanał połączony do masy) to może mieć trochę ładunku z poprzedniego kanału. To w zasadzie powinno się odbywać automatycznie. No ale "powinno". Jeśli pierwszy kanał ma poziom napięcia wyższy od następnego, to następny o niższym napięciu powinien "przyjąć" ładunek z kondensatora. Z wielu przyczyn może tego nie robić.

    Np w PIC'ach i innych maleństwach wykorzystuje się efekt pamięciowy kondensatora samplującego w pojemnościowych czujnikach dotykowych. Przyjrzyj się dokładnie opisowi działania tego ADC zwracając szczególną uwagę na samplowanie, może coś jest z tego efektu o którym pisałem.
  • REKLAMA
  • #3 9955826
    Electix
    Poziom 21  
    Posty: 462
    Pomógł: 46
    Ocena: 6
    Nie wiem czy można podjąć ten trop w STM32. Ale w LPC jest tak, że ADC może pracować przy pinach wejść multipleksera ADC skonfigurowanych jako GPIO, co jak zastrzega nota prowadzi do błędów w przetwarzaniu. Tak samo nota zwraca uwagę na fakt, że napięcie wejściowe dla ADC nie może przekraczać 3.0V +10%. Tyczy się to też sytuacji, że jeżeli napięcie na mierzonym wejściu mieści się w normie, a napięcie na sąsiednim pinie ADC wykorzystywanym do mierzenia innej wartości będzie np. 4,5V spowoduje to błąd pomiaru.

    Sprawdź więc dokładnie w nocie, czy nie jest czasem podobnie w STM32 :)
  • #4 16866675
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    mam identyczny problem z pomiarem dwóch kanałów które się przenikają jeśli są włączone ( dwa potencjometry na dwóch kanałach) - przy uruchomionym jednym kanale zmiany napięcia na drugim nie powodują przekłamań na pierwszym - dodam, że próbowałem robić tak , "przeczesuję" 4 kanały ale ale ustawiam tak, że trzy pomiary są z pierwszego a jeden z drugiego kanału licząc na to, że ostatni z 3 pomiarów kanału pierwszego będzie ok. niestety wszystkie 3 są identycznie przekłamane pomiarem z 3 pomiaru / kanału drugiego i odwrotnie, jak ustawię wszystkie kanały na jedno wejście to zmiany napięć na wejściach niewykorzystywanych nie wpływają na wynik pomiaru pojedyńczego kanału :( mogę to rozwiązać programowo bo rzeczywiście jest to wpływ liniowy kanałów ale wolałbym wiedzieć o co chodzi...
  • REKLAMA
  • #5 16866730
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #6 16866829
    arturt134
    Poziom 27  
    Posty: 792
    Pomógł: 76
    Ocena: 24
    Dokładnie tak jak mówi kolega Piotrus_999. Miałem ten sam problem - dość duży rezystor szeregowy między źródłem sygnału a wejściem ADC. Pomogło wydłużenie czasu próbkowania do maksimum.
  • #7 16866832
    prokopcio
    Poziom 29  
    Posty: 2027
    Pomógł: 39
    Ocena: 143
    Teraz zagłębiając się szczegółowo w budowę i zasadę działania wielokanałowego ADC jest to oczywiste :) dzięki za pomoc.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problemy związane z działaniem przetwornika ADC w mikrokontrolerze STM32F105RCT6, szczególnie w kontekście skanowania ciągłego z użyciem DMA. Użytkownicy zauważyli, że wyniki pomiarów są zniekształcone, co może być spowodowane niewłaściwym rozładowywaniem kondensatora próbkującego oraz wpływem napięcia na sąsiednich kanałach. Sugerowano, aby sprawdzić, czy napięcie wejściowe nie przekracza specyfikacji oraz zwiększyć czas próbkowania, co pomogło innym użytkownikom w podobnych sytuacjach. Wskazano również na możliwość zastosowania bufora na wejściu, aby poprawić wydajność prądową źródła sygnału.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA