-
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
0.net!feeder.erje.net!news1.as3257.net!nx01.iad01.newshosting.com!newshosting.c
om!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostra
da.pl!news.neostrada.pl.POSTED!not-for-mail
Date: Thu, 10 Nov 2011 06:36:55 +0100
From: SM <b...@k...com.pl>
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
Newsgroups: pl.misc.elektronika
Subject: Re: STM32 - problem z ADC
References: <4eb8f372$0$8455$65785112@news.neostrada.pl>
<j9erno$nrc$1@inews.gazeta.pl>
In-Reply-To: <j9erno$nrc$1@inews.gazeta.pl>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Lines: 175
Message-ID: <4ebb62f3$0$2199$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 83.27.185.88
X-Trace: 1320903411 unt-rea-a-01.news.neostrada.pl 2199 83.27.185.88:1136
X-Complaints-To: a...@n...neostrada.pl
Xref: news-archive.icm.edu.pl pl.misc.elektronika:620184
[ ukryj nagłówki ]> Ja ADc używam tylko do orientacyjnego pomiaru napięcia i prądu, więc
> nawet, jeśli te problemy u mnie by wystąpiły - nie zauważyłbym ich. Mogę
> jutro spróbować coś pomierzyć i pooglądać... Ale najpierw - powiedz,
> jaki to ADC, czy masz osobne VREF, czy wspólne z AVCC itp. Patrzyłeś na
> zasilanie AVCC?? Może stmtąd coś przechodzi?? Jak masz ustawiony
> przetwornik?? Ile cykli na próbkowanie?? Czy próbowałeś to zmieniać i
> jak to wpływało na pomiary??
>
Procesorek STM32F103RBT6, tak więc VREF wewnętrznie połączone do VDDA.
VDDA zasilane z VDD poprzez dławik 100uH, odsprzęgnięte 1uF+10nF
(ceramiczne SMD). Masa analogowa VSSA połączona w jednym punkcie
z VSS i wyprowadzona do stopnia wejściowego części analogowej.
Zmiana czasu próbkowania w SMPR2 dawała niewielkie zmiany (to było
dla mnie największym zaskoczeniem). Podobnie zmiana preskalera ADC
w CFGR.
Róźnice były przy przetwarzaniu na jednym kanale (PA0) i na 4 (PA0..3).
Poziom zakłóceń zmieniał się w zależności od napięć panujących na
wejściach. Np. Gdy miałem tylko PA0 to tam były największe zakłócenia,
ale gdy PA0..3 to PA0 i PA1 prawie nie zakłócały PA2 zakłócało, PA3
zakłócało najmocniej.
P.S.
Kawałek kodu.
@ --- clocks config ADC clk = 12MHz
ldr r0, [r12, #RCC_CFGR_OFS]
ldr r1, =(4 << RCC_CFGR_PPRE1) | (2 << RCC_CFGR_SW) | (2 <<
RCC_CFGR_ADCPRE)
orr r0, r1
str r0, [r12, #RCC_CFGR_OFS]
@ --- APB2 - 72MHz (ADC enable)
ldr r0, [r12, #RCC_APB2ENR_OFS]
ldr r1, =(1 << RCC_APB2ENR_IOPAEN) | (1 << RCC_APB2ENR_IOPBEN) | (1 <<
RCC_APB2ENR_IOPCEN) | (1 << RCC_APB2ENR_IOPDEN) | (1 << RCC_APB2ENR_AFIOEN)
orr r0, r1
ldr r1, =(1 << RCC_APB2ENR_TIM1EN) | (1 << RCC_APB2ENR_ADC1EN)
orr r0, r1
str r0, [r12, #RCC_APB2ENR_OFS]
@ --- init ADC
.equiv ADC_CR1_OFS, 0x04
.equiv ADC_SMPR2_OFS, 0x10
ldr r12, =ADC1_BASE
@ CR1
ldr r0, =0
str r0, [r12, #ADC_CR1_OFS]
@ CR2
ldr r0, =(7 << 17)
str r0, [r12, #ADC_CR2_OFS]
@ SQR1 (nbr of channels = 1)
ldr r0, =(0 << 20)
str r0, [r12, #ADC_SQR1_OFS]
@ SMPR2 (sample time) - tutaj robiłem zmiany
ldr r0, =(7 << 0) | (7 << 3) | (7 << 6) | (7 << 9)
str r0, [r12, #ADC_SMPR2_OFS]
@ SQR3 (sel channel IN0)
ldr r0, =(0 << 0)
str r0, [r12, #ADC_SQR3_OFS]
@ ADC power on
bez uruchomienia ADC (ADON=1) nie działa
u mnie kalibracja chociaż w PDFie piszą że kalibracja powinna być
robiona przy ADON=0. Ale STM nawet w swoich przykładach daje
ADON=1 przed kalibracją.
ldr r0, =(7 << 17) | (1 << 0)
str r0, [r12, #ADC_CR2_OFS]
@ reset kalibracji
ldr r0, [r12, #ADC_CR2_OFS]
orr r0, #0x8
ldr r0, =(7 << 17) | (1 << 3) | (1 << 0)
str r0, [r12, #ADC_CR2_OFS]
@ czekanie na zakończenie
jmp1: ldr r0, [r12, #ADC_CR2_OFS]
tst r0, #(1 << 3)
bne jmp1
@ start kalibracji
ldr r0, [r12, #ADC_CR2_OFS]
orr r0, #0x4
ldr r0, =(7 << 17) | (1 << 2) | (1 << 0)
str r0, [r12, #ADC_CR2_OFS]
@ czekanie na zakończenie
jmp2: ldr r0, [r12, #ADC_CR2_OFS]
tst r0, #(1 << 2)
bne jmp2
W przerwaniu co 5kHz wykonuję:
@ odczyt ADC
ldr r12, =ADC1_BASE
ldr r0, [r12, #ADC_DR_OFS]
@ zapis do bufora w RAM
...
@ start ADC
ldr r0, =(7 << 17) | (1 << 20) | (1 << 22) | (1 << 0)
str r0, [r12, #ADC_CR2_OFS]
Dla wyjaśnienia - jak widać wszystko w asemblerze. C używam tylko
do bardzo dużych projektów. Tutaj mam tylko ADC, obsługa SD Card,
obsługa USB jako CDC, więc dużo tego nie jest.
Ponieważ do RAM i rejestrów można dostać się tylko adresowaniem
pośrednim, żeby skrócić program używam pewnych na stałe przypisanych
rejestrów:
R12 - zawsze baza dla danego peryferium (ADC1_BASE, TIM1_BASE, ...)
R11 - zawsze wskazuje początek RAM (bss_beg) dzięki temu dostęp do
zmiennych byte, half word, word realizuję poprzez makra:
.macro getb Reg Name
ldrb \Reg, [r11, #\Name - bss_beg]
.endm
.macro geth Reg Name
ldrh \Reg, [r11, #\Name - bss_beg]
.endm
.macro getw Reg Name
ldr \Reg, [r11, #\Name - bss_beg]
.endm
.macro putb Reg Name
strb \Reg, [r11, #\Name - bss_beg]
.endm
.macro puth Reg Name
strh \Reg, [r11, #\Name - bss_beg]
.endm
.macro putw Reg Name
str \Reg, [r11, #\Name - bss_beg]
.endm
np:
getw r1, rx_cnt
putb r0, adc_num
nie muszę za każdym razem ładować do rejestru pomocniczego
adresu zmiennej żeby ją zapisać/odczytać
podobnie z dostępem do peryferiów - ładuje do R12 bazę
i posługuję się adresowaniem z przesunięciem
Następne wpisy z tego wątku
- 10.11.11 09:36 Marek Borowski
- 10.11.11 11:12 SM
Najnowsze wątki z tej grupy
- Pomiar amplitudy w zegarku mechanicznym
- ale zawziętość i cierpliwość
- Chiński elektrolizer tester wody
- Dzisiaj Bentlejem czyli przybieżeli sześciu Króli do Rysia na kasie
- ciekawy układ magnetofonu
- Mikroskop 3D
- Jak być bezpiecznym z Li-Ion?
- Szukam monitora HDMI ok. 4"
- Obcinaczki z łapaczem
- termostat do lodowki
- SEP 1 kV E
- Aku LiPo źródło dostaw - ktoś poleci ?
- starość nie radość
- Ataki hakerskie
- Akumulatorki Ni-MH AA i AAA Green Cell
Najnowsze wątki
- 2024-12-28 Śmiechu KOOOOOOPA ;-)
- 2024-12-29 Pomiar amplitudy w zegarku mechanicznym
- 2024-12-28 Antyradar
- 2024-12-28 Deweloper przegral w sadzie musi zwrócic pieniądze Posypia sie kolejne pozwy?
- 2024-12-28 Warszawa => Full Stack .Net Engineer <=
- 2024-12-28 Warszawa => Sales Assistant <=
- 2024-12-28 Warszawa => Programista Full Stack .Net <=
- 2024-12-28 Warszawa => Full Stack web developer (obszar .Net Core, Angular6+) <=
- 2024-12-28 Katowice => Head of Virtualization Platform Management and Operating S
- 2024-12-28 Błonie => Analityk Systemów Informatycznych (TMS SPEED) <=
- 2024-12-28 Warszawa => Senior Frontend Developer (React + React Native) <=
- 2024-12-28 Żerniki => Employer Branding Specialist <=
- 2024-12-28 ale zawziętość i cierpliwość
- 2024-12-27 most kilometrowy
- 2024-12-27 Dyplomaci a alkomaty