Ryhmä
Jukka Tamminen
Tomi Koponen
Toni Niittyjoki
Joona Kujala
Tehtävää
1. Hall anturin luku spi liitännän kautta ja kirjoitus can väylään J.T.
- komponenttiluettelo
- tehdään omassa elektroniikkalabrassa Matti Korhonen ???
- Köykkä toimittaa kaasukahvan softan
2. CAN-ohjattu kontaktori
3. CAN-ohjattu shuntti
4. Pienoismalli purjeveneestä, langaton ohjaus TK toimittaa palikat langattomaan testaukseen
SCP-1000 anturi (harjoiteltu Hall anturia varten)
AVR-DVK90CAN1 kehitysalustalla testattu VTI:n SCP1000-paineanturin lukua SPI-väylän kautta. Anturin data (paine,lämpötila) siirretty CAN-viesteihin väylälle.
Testin pohjana on käytetty VTI:n ATMEGA16L prosessorille suunnattua vapaata esimerkki c-koodia. Koodista käytettiin lähinnä oisioita SCP1000 anturin initialisointiin ja asetuksiin. Anturin DRDY-pinniä (data valmista luettavaksi) ei ole fyysisesti kytketty, vaan sen tieto luetaan suoraa anturin rekisteristä. CAN-viestit muodostetaan ATMEL:n esimerkistä opitulla tavalla.
Kontaktori
Kontaktoria varten on kehitetty ohjelmaa, joka lukee can-väylää ja tottelee tietynlaisia can-viestejä. Viestit tunnistetaan tietyn datatavun sisällön ja viestin id:n perusteella. Can viestillä voidaan laittaa haluttu lähtö päälle vapaasta portista tai vaihtoehtoisesti sulkea se.
Tehtävää:
- Kontaktorin logiikan vaatimaa ajastinta tutkitaan parhaillaan.
- AVR:n umpeen kolvatut lähdöt?!
- Vahvistus kontaktoria varten
Sarjaliikenne
Sarjaliikennettä on testattu Atmelin kirjastojen avulla. Alla oleva esimerkkikoodi tulostaa sarjaväylään käynnistetyn ajastimen lukemaa
#define XTAL 3686400L #define TICKSPERMS (XTAL / 1000 / 5 - 1) #include <avr/io.h> #include "led_drv.h" #include "timer8_drv.h" #include "uart_lib.h" #include "uart_drv.h" #include "timer16_drv.h" void wait_ms(uint16_t ms) { uint16_t a, b; for (a = ms; a > 0; a--) for (b = TICKSPERMS; b > 0; b--) asm("nop"); } int main(void) { TCCR1B |= (1 << CS10); //16bit Timerin setup U16 temp=0; Uart_select(UART_0); //Uart 0 valittu uart_init(CONF_8BIT_NOPAR_1STOP,115200); //Uartin initialisointi kirjaston valmiilla funktiolla (8bit data, ei parityä, 1stoppi bitti, 115200 nopeus) for(;;) { temp=TCNT1; //Rekisteri, josta loytyy kellon tikitys uart_mini_printf("\r%u\n",temp); //Tulostetaan vaylalle } }
16-bit ajastin
16-bittisen ajastimen käyttöönotto tapahtuu rekistereiden avulla.
TCCR1B |= (1 << CS11);
Yllä oleva koodi käynnistää 16bittisen ajastimen (Timer1) asetuksella "clkI/O/8 (From prescaler)".
TIMSK1 |= (1 << TOIE1);
Yllä oleva koodi sallii Timer1:n ylivuotokeskeytykset.
sei();
Yllä oleva funktio sallii keskeytykset (laittaa SREG rekisterin I-bitin arvoon 1).
Tämän jälkeen timerin pitäisi olla päällä ja tikittää kokoajan. Pelkästä timerista ei kuitenkaa aina ole hyötyä. Esim. pidempiä aikoja halutessa, tulee laskea timerin kiertämät kierrokset. Se onnistuu ISR funktion avulla, joka löytyy avr:n interrupt.h tiedostosta.
ISR(TIMER1_OVF_vect) //keskeytysaliohjelma, hypataan tanne joka kerta, kun timer1 ylivuoto tapahtuu { Timer++; uart_mini_printf("\rTimerin arvo: %u\n",Timer); }
ISR funktioon (keskeytysaliohjelma) mennään aina automaattisesti, kun Timer1:n ylivuotovektori täyttyy (joka kierroksella). Tällöin voidaan kasvattaa vaikkapa Timer muuttujaa, jolloin tiedetään kierrosten lukumäärä.
Lähdön vahvistaminen
Yllä olevalla kytkennällä pystytään vahvistamaan mikro-ohjaimen lähtöä niin, että on mahdollista ohjata jotain laitetta ulkoisen virta-lähteen avulla.