 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
searider Član

Pridružen-a: Sre 09 Apr 2008 23:12 Prispevkov: 70 Aktiv.: 0.33 Kraj: Maribor
|
Objavljeno: Sob Okt 31, 2009 9:28 pm Naslov sporočila: AVR in ADC |
|
|
Pozdravljeni,
pri uporabi ADC-ja (atmega32) bi uporabil za referenco kar AVCC (5V). Zanima me ali moram paziti pri izboru kondenzatorjev pri 7805 regulatorju. Namreč eni omenjajo da je priporočljivo uporabiti tantal kond. na izhodu iz regulatorja.
Kakšne vrednosti kond. na vhodu in izhodu regulatorja bi priporočali ?
lp
|
|
Nazaj na vrh |
|
 |
Peter Član


Pridružen-a: Sre 30 Jun 2004 12:55 Prispevkov: 375 Aktiv.: 1.58 Kraj: Pod krvavcem nekje
|
Objavljeno: Sre Dec 30, 2009 10:36 am Naslov sporočila: |
|
|
Lep pozdrav
Da si izposodim tole temo, da ne odpiram nove.
Imam problem: Z atmego8 hočem brat enega od analognih vhodov vse skupaj pa prikazati na LCD displayu. Prikazovanje mi ne deluje tako kot je treba ko berem samo spodnji del bitov adc-ja se lepo spreminja vrednost od 0 do 255 ko pa hočem prebrati celotno vrednost AD pretvorbe pa mi začne stvar prikazovati čudne stvari.
Koda: |
//#include <avr/interrupt.h>
//#include <avr/pgmspace.h>
//#include <avr/signal.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include "lcd.h"
//void init_serial (void);
void init_ports (void);
void init_ADC(void);
unsigned int napetost;
unsigned int read_ADC(void);
void Wait(uint8_t n)
{
uint8_t i,temp;
temp=n*28;
for(i=0;i<temp;i++)
_delay_loop_2(0);
}
int main (void)
{
//Initialize the LCD Subsystem
InitLCD(0);
//Clear the display
LCDClear();
init_ports();
// init_serial();
init_ADC();
while(1)
{
// PORTD = ~read_ADC();
napetost = read_ADC();
//Update Display
LCDClear();
LCDWriteString("Adc - 0000");
LCDWriteIntXY(6,0,napetost,4);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
_delay_loop_2(0);
}
}
unsigned int read_ADC()
{
unsigned int value;
ADCSRA = ADCSRA|0x40; // Start ADC pretvorbe
while((ADCSRA & 0x10)==0); // Počakamo da se pretvorba konča
// Get ADC the Result
value = ADCL;
value += (ADCH << 8);
ADCSRA = ADCSRA|0x10; // Pobrišemo zastavico za konec pretvorbe
return value; // Vrne vrednost Value rutini katera jo kliče
}
void init_ports (void)
{
DDRD = 0xFF; // Izberemp portD kot izhode
PORTD = 0x00;
DDRC = 0x00;
PORTC = 0x00;
}
void init_ADC (void)
{
ADMUX=0x06; // Izberemo kateri ad pretvornik želimo ADC6
ADMUX=ADMUX | 0x40; // Izberemo napetostno referenco
ADMUX=ADMUX | 0x20; //
ADCSRA=0xE3; // Izberemo Frekvenco ACD-ja
ADCSRA= ADCSRA | 0x80; // Omogočimo ADC
}
|
Opis: |
|
Velikost datoteke: |
649.44 KB |
Pogledana: |
0 krat |

|
_________________ Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!! |
|
Nazaj na vrh |
|
 |
mucek4 Član


Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 12.46 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Sre Dec 30, 2009 11:46 am Naslov sporočila: |
|
|
Ne pozam AVR C ja v detajle ampak predvidevam da je napak tukaj
Koda: |
value = ADCL;
value += (ADCH << 8); |
Moje predvidevanje je takole:
ADCH je verjetno 8 bitna vrednost. Če jo shiftash 8x v levo ne dobiš 16 bitne številke.
Torej popravi kodo na sledeč način:
Koda: |
value = ADCH;
value *= 256;
value += ADCL; |
In poročaj če je kaj bolje. Int naj bi sicer bil 16 biten.
|
|
Nazaj na vrh |
|
 |
ticla Član


Pridružen-a: Sob 15 Dec 2007 22:52 Prispevkov: 440 Aktiv.: 2.06 Kraj: Župečja vas
|
Objavljeno: Sre Dec 30, 2009 12:05 pm Naslov sporočila: |
|
|
Meni CODEVISION za branje ADC sam zgenerira spodnjo kodo
Citiram: |
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
} |
V glavnem programu pa imam definirano spremenljivko
Citiram: |
unsigned long int napetost; |
, long int imam zato, ker še potem naredim izračun.
Vrednost pa preberem tako
Citiram: |
napetost=read_adc(1); //ADC1 |
PS.
Pri atmega8 sem odkril, da moram v funkciji read_adc('0') imeti enojne narekovaje, pri mega32 pa jih ne smem imeti ( read_adc(0) ), slučajno ve kateri zakaj je tako.
|
|
Nazaj na vrh |
|
 |
Peter Član


Pridružen-a: Sre 30 Jun 2004 12:55 Prispevkov: 375 Aktiv.: 1.58 Kraj: Pod krvavcem nekje
|
Objavljeno: Sre Dec 30, 2009 12:40 pm Naslov sporočila: |
|
|
mucek4
Sem probal kodo vendar je prikaz še vedno enak.
Nevem zakaj tak smešen prikaz glede natavitev ad pretvornika sem probal vse mogoče variante pa ni pomagalo nič.
ticla
V CV res generira sam kodo za ad pretvorbe. Skoda da jo AVR studio ne.
Lahko kdo sproba to kodo in pove kakšne rezultate dobi.
Lcd knižnica mislim da ni kriva.
_________________ Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!! |
|
Nazaj na vrh |
|
 |
mucek4 Član


Pridružen-a: Sob 18 Jun 2005 20:52 Prispevkov: 2952 Aktiv.: 12.46 Kraj: Tržič - Mesto med gorami
|
Objavljeno: Sre Dec 30, 2009 12:47 pm Naslov sporočila: |
|
|
Peter je napisal/a: |
Lcd knižnica mislim da ni kriva. |
Preveri
if ((napetost >=0) && (napetost < 100))
CDWriteString("0");
if ((napetost >=100) && (napetost < 200))
CDWriteString("1");
.....
Tako boš lahko videl ali dela preglavice LCD knjižnica s pretvorbo ali pretvorba sama.
|
|
Nazaj na vrh |
|
 |
Peter Član


Pridružen-a: Sre 30 Jun 2004 12:55 Prispevkov: 375 Aktiv.: 1.58 Kraj: Pod krvavcem nekje
|
Objavljeno: Sre Dec 30, 2009 5:39 pm Naslov sporočila: |
|
|
Bom poizkusil še s kakšno drugo knjižnico za lcd pa poročam o uspehu morda je problem v knjižnici za lcd
mucek4
Nisem še mel casa stestirat tvoj nasvet
_________________ Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!! |
|
Nazaj na vrh |
|
 |
spy Član


Pridružen-a: Sre 06 Sep 2006 20:43 Prispevkov: 403 Aktiv.: 1.76 Kraj: Tržič
|
Objavljeno: Sre Dec 30, 2009 9:14 pm Naslov sporočila: |
|
|
Jaz uporabljam v AVRstudiu in GCC samo:
Koda: |
unsigned int napetost;
....
napetost=ADC;
|
in se prevede v:
Koda: |
IN R18,0x04 In from I/O location
IN R19,0x05 In from I/O location
|
in dela brez problemov.
|
|
Nazaj na vrh |
|
 |
Peter Član


Pridružen-a: Sre 30 Jun 2004 12:55 Prispevkov: 375 Aktiv.: 1.58 Kraj: Pod krvavcem nekje
|
Objavljeno: Čet Dec 31, 2009 4:48 pm Naslov sporočila: |
|
|
Sem nekako rešil problem z uporabo druge knjižnice za lcd in uporabil drugačne rutine za prikaz na lcd-ju
priprenjam kodo če slučajno komu pride prav.
Koda: |
//#include <avr/interrupt.h>
#include <avr/pgmspace.h>
//#include <avr/signal.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include<util/delay.h>
#include "lcd.h"
volatile signed long val;
//void init_serial (void);
void init_ports (void);
void init_ADC(void);
unsigned int napetost;
unsigned int read_ADC(void);
char buffer[10];
unsigned int Uizh;
char str[12];
int main (void)
{
//Initialize the LCD Subsystem
lcd_init(LCD_DISP_ON);
//Clear the display
lcd_clrscr();
init_ports();
// init_serial();
init_ADC();
while(1)
{
napetost = ADCW;
Uizh = napetost;
Uizh = Uizh * 50;
Uizh = Uizh / 102;
utoa(napetost, buffer, 10);
//Update Display
lcd_clrscr();
lcd_puts("Napetost-");
lcd_gotoxy(10,0);
lcd_puts(buffer);//(6,0,napetost,5);
lcd_gotoxy(0,1);
sprintf(str,"%2d.",Uizh/100);
lcd_puts(str);
sprintf(str,"%2d",Uizh%100);
lcd_puts(str);
_delay_loop_2(1000);//wait_10ms;
_delay_loop_2(1000);
_delay_loop_2(1);
_delay_loop_2(10);
_delay_loop_2(10);
}
}
unsigned int read_ADC()
{
unsigned int value;
ADCSRA = ADCSRA|0x40; // Start ADC pretvorbe
_delay_loop_2(10);
while((ADCSRA & 0x10)==0); // Počakamo da se pretvorba konča
// Get ADC the Result
value = ADCW;
ADCSRA = ADCSRA|0x10; // Pobrišemo zastavico za konec pretvorbe
return value; // Vrne vrednost Value rutini katera jo kliče
}
void init_ports (void)
{
DDRD = 0xFF; // Izberemp portD kot izhode
PORTD = 0x00;
DDRC = 0x00;
PORTC = 0x00;
}
void init_ADC (void)
{
ADMUX=0x06; // Izberemo kateri ad pretvornik želimo ADC7
ADMUX=ADMUX | 0x40; // Izberemo napetostno referenco
ADMUX=ADMUX | 0x00; //
ADCSRA=0xE3; // Izberemo Frekvenco ACD-ja
ADCSRA= ADCSRA | 0x80; // Omogočimo ADC
}
|
_________________ Vse se da pokvarit, le če se dovol časa ukvarjaš z njo!!! |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|