AVR32 UC3B0256, dziwny problem z ADC

Aug 30, 2009 1 Replies

Witam,



Pracujê nad uk³adem, którego sercem jest uC Atmel AVR32 UC3B0256. Po¶ród innych, do uk³adu podpiête s± tranzystory i diody ¶wiec±ce (wyj¶cia PA05, PA06, PA07, PA08). Wej¶cie PA03 pracuje jako wej¶cie przetwornika analogowo-cyfrowego (kana³ nr 6). PA04 nie jest do niczego pod³±czone. Mam ponadto pod³±czony wy¶wietlacz LCD (2x24) obs³ugiwany za pomoc± mojej ma³ej biblioteczki. Kwarc 12MHz, uC pracuje na 60MHz.



Proszê spojrzeæ na przyk³adowy program ilustruj±cy zjawisko, które opiszê poni¿ej.



#include <avr32/io.h>



#include "pm.h" #include "gpio.h" #include <stdio.h>



#include <stdlib.h>



#include <string.h>



#include <stdarg.h>



#include "adc.h" #include "lcd.h"



/* w parametrach AVR32studio ustawiono USE_8_BITS_ADC,



  • optymalizacja -O3

*/

#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency.



#define FOSC0 12000000 //!< Osc0 frequency: Hz. #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods.



#define ADC_CHANNEL 6 #define ADC_PIN AVR32_ADC_AD_6_PIN #define ADC_FUNCTION AVR32_ADC_AD_6_FUNCTION



static volatile avr32_adc_t * adc= (volatile avr32_adc_t *) &AVR32_ADC;



volatile avr32_gpio_port_t *gpio_port_A = &AVR32_GPIO.port[0];



void localStartPLL(void) { pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); pm_pll_setup(&AVR32_PM, 0, // pll.



9, // mul.
1, // div.
0, // osc.
16); // lockcount. pm_pll_set_option(&AVR32_PM, 0, // pll.
1, // pll_freq.
1, // pll_div2.
0); // pll_wbwdisable. pm_pll_enable(&AVR32_PM, 0); pm_wait_for_pll0_locked(&AVR32_PM); pm_gc_setup(&AVR32_PM, 0,1,0,0,0); pm_gc_enable(&AVR32_PM, 0); pm_cksel(&AVR32_PM,
0, // pbadiv.
0, // pbasel.
0, // pbbdiv.
0, // pbbsel.
0, // hsbdiv.
0); // hsbsel.

//flashc_set_wait_state(1); pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); }


void initADC() { // GPIO pin/adc-function map. static const gpio_map_t ADC_GPIO_MAP = { {ADC_PIN, ADC_FUNCTION}, };



// Assign and enable GPIO pins to the ADC function. gpio_enable_module(ADC_GPIO_MAP, sizeof(ADC_GPIO_MAP) / sizeof(ADC_GPIO_MAP[0]));



// configure ADC adc_configure(adc);



/* MCK/2, if PRESCAL is 0, and MCK/128, if PRESCAL is set to 63 (0x3F)



  • ADC Clock Frequency 10-bit resolution mode, 5MHz,
  • ADC Clock Frequency 8-bit resoltuion mode, 8MHz

*/ adc->mr |= 63 << AVR32_ADC_PRESCAL_OFFSET;

gpio_port_A->puerc = 1 << (ADC_PIN & 0x1F);



adc_enable(adc, ADC_CHANNEL); }


int main(void) { char s[25];



localStartPLL();



gpio_local_init();



flashc_set_wait_state(1);



initLCD();



initADC();



gpio_port_A->oders = 1 << ((AVR32_PIN_PA05) & 0x1F);



gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!



while(1) { adc_start(adc); int aaa = adc_get_value(adc, ADC_CHANNEL);


setCursorPos(24); sprintf(s, "%d ", aaa); showString(s); }



return 0; }



Je¿eli uruchomiê powy¿ej przedstawiony program, to na wy¶wietlaczu LCD pojawi siê cyfra 4. Potencjometr pod³±czony do ADC jest skrêcony na minimum. Warto zauwa¿yæ, ¿e PA05 jest ustawiony na 1 -- odpowiednia dioda siê ¶wieci. Teraz za³ó¿my, ¿e modyfikujemy liniê oznaczon± w kodzie znakami !!!!!! z:



gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!



na:



gpio_port_A->ovrc = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!



Innymi s³owy, dioda pod³±czona do PA05 nie bêdzie teraz ¶wieciæ. Co dziwne, teraz na wy¶wietlaczu mo¿emy odczytaæ warto¶æ 1, a nie



4, jak by³o to uprzednio. (Zjawisko jest powtarzalne). Kto¶ móg³by powiedzieæ, ¿e w³±czenie tej diody powoduje jakie¶ obci±¿enie uk³adu i st±d inny wynik z ADC. Ale tak chyba nie jest bo po pierwsze warto¶æ w takim przypadku powinna byæ mniejsza, a nie wiêksza, a po drugie sprawdzane by³y wszelkie napiêcia i nie wahaj± siê one nawet o miliwolt. Ponadto, ¶cie¿ka zosta³a przeciêta przy samym uC, ¿eby odci±æ diodê, tranzystor, itp., ale to w ogóle nie wp³ynê³o na wynik (nadal w³±czenie PA05 powoduje, ¿e warto¶æ odczytana z ADC jest inna, ni¿ w przypadku, gdy PA05 jest wy³±czone). Dodam, ¿e zjawisko dotyczy tak¿e innych wyj¶æ z tranzystorami i diodami (PA06, PA07, PA08). Co dziwne, je¶li program zmodyfikujemy tak, ¿e zamiast PA05 sterujemy wyj¶ciem PA04 (do niego nic nie jest pod³±czone), to warto¶æ odczytywana z ADC jest stabilna, niezale¿nie od tego, czy PA04 jest ustawione, czy wyzerowane.

Pytanie: co mo¿e byæ przyczyn±?



Z góry uprzejmie dziêkujê za rady.



Robbo



Problem rozwiazany. W programie odczytywalem wartosc ADC z pinu PA30 (kanal 6), a potencjometr byl podlaczony do PA03. Jakims cudem na pinie PA30 pojawial sie sygnal, ale przeklamany.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required