Arduino platforma
Moderators: pedja089, stojke369, trax, InTheStillOfTheNight
-
- Pocetnik na forumu
- Posts: 25
- Joined: 22-04-2013, 19:39
Re: Arduino platforma
Da lakše je pisat na port, ali port (konkretno portD) ima 8 bitova. A moj dac je 10 bitova, tako da trebam koristiti 10 bitova (10 pinova).
Netreba biti sinus, može biti i pila ili nešto drugo. Samo da vidim da dobivam dobar oblik na izlazu.
Ovo sa potenciometrom štima.
Netreba biti sinus, može biti i pila ili nešto drugo. Samo da vidim da dobivam dobar oblik na izlazu.
Ovo sa potenciometrom štima.
Re: Arduino platforma
Nešto mi je sinulo, trebalo bi raditi
Gdije ti je dac vrijednost koju želiš "ispisati" na izlazu konvertera...
Edit:
y je 9bit, a z10bit
Code: Select all
if((dac<512 && dac>255) || (dac>767))
portx.y=1;
if(dac>511)
portx.z=1;
Edit:
y je 9bit, a z10bit
Re: Arduino platforma
Zar u tom c-u nema nesto za rad sa bitovima direktno. Npr dac.9.
U pic basicu se to resava PORTB.1=dac.9, i to su 4 asemblerske instrukcije. Mnogo brze nego ovo...
U pic basicu se to resava PORTB.1=dac.9, i to su 4 asemblerske instrukcije. Mnogo brze nego ovo...
Re: Arduino platforma
Nisam baš radio u C-u (konkretno Arduinu), možda postoji mogućnost, neka proba.
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
U C-u je vrlo jednostavno raditi s bitovima, samo izgleda malo čudno i nejasno kada se tipka... Za rad s bitovima najbolje je koristiti pomak lijevo, pomak desno, i operacije AND, OR, XOR, Prvi komplement...pedja089 wrote:Zar u tom c-u nema nesto za rad sa bitovima direktno. Npr dac.9.
U pic basicu se to resava PORTB.1=dac.9, i to su 4 asemblerske instrukcije. Mnogo brze nego ovo...
U C-u nema ništa za direktan rad s bitovima, ali mi inače impolementiramo nešto ovakvo:
Code: Select all
// 1 guras lijevo za broj bita i radis ILI operaciju s registrom
#define SetBit(reg, bit) (reg |= (1<<bit))
// 1 guras lijevo za broj bita, napravis prvi komplement da okrenes stanje
// bitova i izvrsis AND operaciju s registrom
#define ClearBit(reg, bit) (reg &=~(1<<bit))
Code: Select all
// Uzmeš varijablu u kojoj je pohranjen
// ADC i izvršiš AND operaciju sa 0xFF da dobiješ
// samo 8 desnih bitova koje upisuješ na PORTA
PORTA = (my_adc & 0xFF);
// Sada uzmeš istu varijablu, ali poguraš bitove za 8 mjesta udesno
// te izvršiš AND operaciju sa 0x03 kako bi na port upisao samo 2 desna bita
PORTC = ((my_adc >> 8) & 0x03);
Kako koristiti ostalih 6 linija PORTC-a jer ćeš drugom naredbom svih 6 bitova postaviti na nulu.
Code: Select all
//........
#define SetBit(reg, bit) (reg |= (1<<bit))
#define ClearBit(reg, bit) (reg &=~(1<<bit))
void WritePorts(unsigned int my_adc){
PORTA = (my_adc & 0xFF);
if((my_adc >> 8) & 0x01)
SetBit(PORTC, 0);
else
ClearBit(PORTC, 0);
if((my_adc >> 8) & 0x02)
SetBit(PORTC, 1);
else
ClearBit(PORTC, 1);
}
PS, mislim da AVR ima implementirane neke pretprocesorske naredbe za dizanje i spustanje jednog bita, ali ja koristim ove svoje SetBit() i ClearBit()
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
I evo još jedan način da ne moraš raditi if else
Nisam testirao niti jedan primjer, ali mislim da se nisam zeznuo nigdje.
Code: Select all
void WritePorts(unsigned int my_adc){
unsigned char my_port;
// ako slučajno pišeš po portu u ISR-u, obavezno iskljuci globalne prekide
cli();
// upišeš prvih 8 bitova u PORTA
PORTA = (my_adc & 0xFF);
// učitaš stanje porta u varijablu
my_port = PORTC;
// u varijabli porta C staviš 2 desna bita na 0 da ih možeš dići
// ILI operacijom
my_port &= ~(0x03);
// napraviš update ona 2 bita u varijablu porta C (ILI operacija)
my_port |= ((my_adc >> 8) & 0x03);
// vratiš varijablu u port C
PORTC = my_port;
// uključiš globalne prekide
sei();
}
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
I evo i pretprocesorska naredba u kopiranje jednog bita:
Može se i sa funkcijom napraviti, ali evo, dosta primjera na način kako se to radi u C-u.
Code: Select all
#define Copy(to, bit, from, bit1) if((from>>bit1)&0x01) \
to |= (1<<bit); else to &=~(1<<bit);
// kopiraj 9 bit iz varijable my_adc u PORTC na lokaciju 0
Copy(PORTC, 0, my_adc, 9);
// kopiraj 10 bit iz varijable my_adc u PORTC na lokaciju 1
Copy(PORTC, 1, my_adc, 10);
InTheStillOfTheNight
-
- Pocetnik na forumu
- Posts: 25
- Joined: 22-04-2013, 19:39
Re: Arduino platforma
Hvala svima na komentarima
Uspio sam generirati signal u arduinu i postaviti ga na DAC i on dobro radi.
No kad hoću pročitati ulazni signal (10 bit ADC) te ga postaviti na DAC onda stvar ne šljaka.
Koristim dva porta, u jednoga upisujem 6 a u drugoga 4 bita..
Evo koda.
Evo kako izgleda sinus na 100 Hz.
http://postimg.cc/image/f1rpp9s7j/
Evo ga na 1kHz.
http://postimg.cc/image/c6emieo7j/
Evo i simulacijska shema u proteusu.
http://speedy.sh/tw4r3/ADC-DAC.rar
Uspio sam generirati signal u arduinu i postaviti ga na DAC i on dobro radi.
No kad hoću pročitati ulazni signal (10 bit ADC) te ga postaviti na DAC onda stvar ne šljaka.
Koristim dva porta, u jednoga upisujem 6 a u drugoga 4 bita..
Evo koda.
Code: Select all
int val = 0;
int analogPin_signal = 0;
void setup()
{
/*
* pinovi 2-7 PORTD, pinovi 8-11 PORTB
* pinovi 0,1 se koriste za serisku komunikaciju
*/
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{
val = analogRead(analogPin_signal);
// ulaznu vrijednost pohranjujem u varijablu
// vrjednost 10 bita 0000 00xx xxxx xxxx
PORTD=(val << 2);
//pomak 2 mjesta u ljevo 0000 xxxx xxxx xx00
// u portD upisujem 6 bita
// I operacija nije potrebna jer su ostali bitovi prazni
PORTB =(val >> 6);
// pomak 2 mjesta u desno xx00 0000 xxxx xxxx
// u portB upisujem 4 bita
delayMicroseconds(10);
}
http://postimg.cc/image/f1rpp9s7j/
Evo ga na 1kHz.
http://postimg.cc/image/c6emieo7j/
Evo i simulacijska shema u proteusu.
http://speedy.sh/tw4r3/ADC-DAC.rar
-
- Pocetnik na forumu
- Posts: 25
- Joined: 22-04-2013, 19:39
Re: Arduino platforma
Znam u čemu je stvar. Kad se koristi analogRead funkcija, maksimalna frekvencija uzorkovanja je 9 kHz.
(što se vidi i na signalu od 1kHz)
Meni bi to bilo i dosta da samo učitavam jedan analogni ulaz, ali trebam najmanje 2 analogna ulaza čitati (Setpoint, Input) i onda još vrtit PID algoritam..
Ima ovdje način da se postigne uzrokovanje od 40kHz. Ali onda se može koristiti samo jedan analogni ulaz..
http://www.instructables.com/id/Arduino ... -of-40kHz/
Ima ko kavu ideju kak to izvesti ?
(što se vidi i na signalu od 1kHz)
Meni bi to bilo i dosta da samo učitavam jedan analogni ulaz, ali trebam najmanje 2 analogna ulaza čitati (Setpoint, Input) i onda još vrtit PID algoritam..
Ima ovdje način da se postigne uzrokovanje od 40kHz. Ali onda se može koristiti samo jedan analogni ulaz..
http://www.instructables.com/id/Arduino ... -of-40kHz/
Ima ko kavu ideju kak to izvesti ?
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
I operaciju uvijek radis, bez obzira jel potrebna ili ne, čisto da napomeneš compileru što radiš... ne brini, nece ti compiler to napraviti kao I operaciju nego ce koristiti asm instrukcije sbi i cbi tako da od vise teksta glava ne boli.
Uglavnom, ako hoces dirati po freq ADC-a trazi po datoteci u
Arduino/hardware/arduino/cores/arduino/wiring.c ili tako nesto....
Potrazi funkciju init, ako se ne varam na kraju se podešava freq ADC-a, a ako nije tu mozes probati u wiring_analog.c
Inace AVR-ov ADC mozes clockati sa 1 Mhz i dobro ce citati, dakle samo to podesi u initu. Nisam sada doma pa ti iz glave govorim datoteke jer sam prosao citav taj arduino lib pa mi je dosta poznat.
Uglavnom, ako hoces dirati po freq ADC-a trazi po datoteci u
Arduino/hardware/arduino/cores/arduino/wiring.c ili tako nesto....
Potrazi funkciju init, ako se ne varam na kraju se podešava freq ADC-a, a ako nije tu mozes probati u wiring_analog.c
Inace AVR-ov ADC mozes clockati sa 1 Mhz i dobro ce citati, dakle samo to podesi u initu. Nisam sada doma pa ti iz glave govorim datoteke jer sam prosao citav taj arduino lib pa mi je dosta poznat.
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
Evo, provjerio sam,
File se zove: wiring.c i na kraju se podešava clock ADC-a... Kao što vidiš arduino je podesio 125khz clock, a AVR-ov ADC ce raditi i na 1 Mhz. Ako ne znas to podesiti na 1 Mhz pitaj pa cemo i to napisati.
Sto se tice proslog posla vidim da izjednacavas citave portove sa mjerenjem ADC-a. U tome programu te portove ne mozes za nista vise koristiti jer ih stalno prepisujes... Ima 3 primjera gore kako to pravilno napraviti, a i onima koji tipkaju u c-u daleko će biti jednostavnije snaći se ako je sve dobro šiftano i maskirano AND operacijom. Odaberi koji hoces od moja 3 primjera i koje hoces portove pa ti i to natipkam pravilno...
Još jedna stvar. U datasheetu je većinom navedeno da ADC radi do 200 ili 250 kHz, ali ako malo bolje kopaš po ATMEL-ovoj stranici pronaći ćeš dosta teksta o tome da može raditi i na 1 kHz. Probao sam podići freq na 1 khz i adc mi radi dobro...
LP
Code: Select all
#if defined(ADCSRA)
// set a2d prescale factor to 128
// 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
// XXX: this will not work properly for other clock speeds, and
// this code should use F_CPU to determine the prescale factor.
sbi(ADCSRA, ADPS2);
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
// enable a2d conversions
sbi(ADCSRA, ADEN);
#endif
Sto se tice proslog posla vidim da izjednacavas citave portove sa mjerenjem ADC-a. U tome programu te portove ne mozes za nista vise koristiti jer ih stalno prepisujes... Ima 3 primjera gore kako to pravilno napraviti, a i onima koji tipkaju u c-u daleko će biti jednostavnije snaći se ako je sve dobro šiftano i maskirano AND operacijom. Odaberi koji hoces od moja 3 primjera i koje hoces portove pa ti i to natipkam pravilno...
Još jedna stvar. U datasheetu je većinom navedeno da ADC radi do 200 ili 250 kHz, ali ako malo bolje kopaš po ATMEL-ovoj stranici pronaći ćeš dosta teksta o tome da može raditi i na 1 kHz. Probao sam podići freq na 1 khz i adc mi radi dobro...
LP
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: Arduino platforma
Code: Select all
#if defined(ADCSRA)
sbi(ADCSRA, ADPS2); // set a2d prescale factor to 16 (16 MHz / 16 = 1 MHz)
sbi(ADCSRA, ADEN); // enable a2d conversions
#endif
InTheStillOfTheNight
-
- Pocetnik na forumu
- Posts: 25
- Joined: 22-04-2013, 19:39
Re: Arduino platforma
Imao sam nekih obaveza pa me nije bilo dosta dugo na forumu.
@InTheStillOfTheNight, hvala na objašnjenju uspio sam povećat frekvenciju
@InTheStillOfTheNight, hvala na objašnjenju uspio sam povećat frekvenciju
- morski_pas
- Odlično uznapredovao
- Posts: 639
- Joined: 07-03-2011, 23:58
- Location: Rijeka
Re: Arduino platforma
evo možda će nekome trebati simulacija ARDUINO platformi u PROTEUSU
- Attachments
-
- arduino.jpg (78.7 KiB) Viewed 14847 times
-
- ArduinoLibrary for Proteus.rar
- (4.59 KiB) Downloaded 497 times
- morski_pas
- Odlično uznapredovao
- Posts: 639
- Joined: 07-03-2011, 23:58
- Location: Rijeka
Re: Arduino platforma
ujedno mi treba mala pomoć ,pokušavam upogoniti ovaj kontroler za akvarij ali ni na proto board niti u proteusu simulaciji ne rade tipke za kontrolu u prilogu je arduino fajl i simulacija u proteusu
- Attachments
-
- simulacija.zip
- (12.32 KiB) Downloaded 474 times
-
- aquarium.zip
- (7.15 KiB) Downloaded 487 times
-
- kontroler akvarij.jpg (73.72 KiB) Viewed 14845 times
Re: Arduino platforma
Vidim ja; starci krenuli na Arduino......i ja ga naručio .
Sad kad Noćni krene ; ima svi da ga slušamo ovako
Sad kad Noćni krene ; ima svi da ga slušamo ovako
- morski_pas
- Odlično uznapredovao
- Posts: 639
- Joined: 07-03-2011, 23:58
- Location: Rijeka
Re: Arduino platforma
a hebi ga moraš biti u trendu ja svoj dobio pa što da skuplja prašinu , i naravno noćni spremi se na jedno predavanja ako treba dolazim kod tebe u ZG
- morski_pas
- Odlično uznapredovao
- Posts: 639
- Joined: 07-03-2011, 23:58
- Location: Rijeka
Re: Arduino platforma
inače cijeli projekt je na ovoj stranici
http://wiki.flav.com/wiki/Aquarium_Controller
http://wiki.flav.com/wiki/Aquarium_Controller
Re: Arduino platforma
Što se tipki tiče, treba spojiti AREF na +5V .
Valjda ti je nekako promaklo, jer imaš na shemi koja je na ovoj stranici.
Piše i tamo gdje je opisan rad senzora TMP36: "The supply voltage is used as reference for the Arduino AD converter".
Također u samome kodu imaš
// If you want to set the aref to something other than 5v
analogReference(EXTERNAL);
Valjda ti je nekako promaklo, jer imaš na shemi koja je na ovoj stranici.
Piše i tamo gdje je opisan rad senzora TMP36: "The supply voltage is used as reference for the Arduino AD converter".
Također u samome kodu imaš
// If you want to set the aref to something other than 5v
analogReference(EXTERNAL);