====== Tarkvaranäide ====== Järgnev näide ei kasuta Kodulabori teegi alalisvoolu mootorite kiiruse juhtimise teeki, vaid on tehtud riistvaralise PWM väljundi peale, mis on Mootori moodulil ühendatud servo pistikutesse. ====== Lihtsustatud näide ====== Lihtsustatud näide suunab UH anduri lugemi otse mootori kiiruseks. {{:software:codes:uh_anduri_yhendus.jpg?250|}}{{:software:codes:mootori_yhendus.jpg?250|}} //***************************************************************************** // Vajalik riistvara: // 1. Kodulabori kontrollermoodul ATmega2561 // 3. Kodulabori mootorite moodul ja andurite moodul või Kombo moodul // 4. UH andur // 5. Alalisvoolumootor // // Kirjeldus: // Programm seadistab riistvaralise PWM-i kasutama servopistikuid. Ultraheli anduri näit antakse otse // mootori kiiruseks. Kiiruse vahemik 0-255 // // Kasutamine: // Ühenda moodulid kokku. Ühenda UH andur Viiku ADC3 / PF3 // Ühenda mootori maa Servo pistiku GND viiguga ja mootori juhtkaabel servo pistiku signaali viiguga. // Servo pistiku keskmine viik (+5 V) jääb ühendamata. // // Autor: Heiko Pikner, Raivo Sell // // Compiler: AVR-GCC // Chip type: Atmega2561 //***************************************************************************** //#include #include "homelab/pin.h" #include "homelab/delay.h" #include #define PWM_PERIOD (F_CPU / 8 / 5000) // Kasutusel servopistik. Protsessori viigud PB5 ja PB6 static pin servo_pins[2] = { PIN(B, 5), PIN(B, 6) }; void hv_pwm_init(unsigned char index) { // Seadista PWM viik väljundiks. pin_setup_output(servo_pins[index]); // Seadista timeri kontrollregister // Clear OUTA and OUTB on compare match // Fast PWM mode with ICR = TOP // Prescaler 8 timer1_init_fast_pwm( TIMER1_PRESCALE_8, TIMER1_FAST_PWM_TOP_ICR, TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, TIMER1_FAST_PWM_OUTPUT_DISABLE); // TOP period timer1_set_input_capture_value(PWM_PERIOD); } // // PWM väärtuse muutmine // index - Servo pins 0-1. // position 0-255. PWM value. // void hv_pwm_value(unsigned char index, unsigned int value) { switch (index) { case 0: timer1_set_compare_match_unitA_value(value); if(OCR1A == 0) { DDRB &= ~(1 << DDB5); } else { DDRB |= (1 << DDB5); } break; case 1: timer1_set_compare_match_unitB_value(value); if(OCR1B == 0) { DDRB &= ~(1 << DDB6); } else { DDRB |= (1 << DDB6); } break; } } // // Põhiprogramm // int main(void) { // UH anduri viik pin pin_trigger_echo = PIN(F, 3); // Anduriplaadi väliste andurite viik pin sensors = PIN(G, 0); pin_setup_output(sensors); pin_set(sensors); // Mootori seadistamine hv_pwm_init(0); // Lõputu tsükkel while (true) { // UH anduri mõõtetulemuse (cm) suunamine mootori kiiruseks (0-255) //Väärtus on korrutatud läbi 10-ga, seegamax kiirusele vastab 2,55 m hv_pwm_value(0, ultrasonic_measure_srf05(pin_trigger_echo)*10); } } ====== Keerukam näide ====== Failid pakituna projektiks: * {{:software:codes:uh_andur_eclipse.zip| Eclipse projekt}} ===== Peaprogramm - main.c ===== //***************************************************************************** // Vajalik riistvara: // 1. Kodulabori kontrollermoodul ATmega2561 // 3. Kodulabori mootorite moodul // 4. Kodulabori kasutajaliidese moodul // 5. UH andur // 6. Akudrelli mootor või LED, mille kiirust või heledust saaks juhtida. // // Kirjeldus: // Programm seadistab riistvaralise PWM-i kasutama servopistikuid. Selle // töötsüklit on võimalik nuppudest muuta. Lisaks toimub samal ajal mõõtmine // UH anduriga. // // Kasutamine: // Ühenda moodulid kokku. Ühenda UH andur ja PWM-i kasutav seade. // Vajutades nupule S1 mootori kiirus või LEDi heledus suureneb. Nupp S2 vähendab // töötsüklit. Ekraanil kuvatakse kiirus (töötsükkel) 0 - 255. Lisaks UH anduri // näit cm. // // Autor: Heiko Pikner // // Compiler: AVR-GCC // Chip type: Atmega2561 //***************************************************************************** #include #include "homelab/pin.h" #include "homelab/delay.h" #include #include #include "HvPWM.h" // UH anduri viik pin pin_trigger_echo = PIN(F, 2); pin sensors = PIN(G, 0); // LEDide viigud pin led_red = PIN(C, 5); pin led_yellow = PIN(C, 4); pin led_green = PIN(C, 3); // Nuppude viigud pin button1 = PIN(C, 0); pin button2 = PIN(C, 1); pin button3 = PIN(C, 2); // // Põhiprogramm // int main(void) { unsigned int speed = 0; char text[16]; unsigned short distance; unsigned char new_value1, old_value1 = 0; // Seab LEDid töökorda pin_setup_output(led_red); pin_setup_output(led_yellow); pin_setup_output(led_green); // Anduriplaat välistele anduritele pin_setup_output(sensors); pin_set(sensors); // Seab nupud töökorda pin_setup_input_with_pullup(button1); pin_setup_input_with_pullup(button2); pin_setup_input_with_pullup(button3); // Lülitab LEDid välja pin_set(led_green); pin_set(led_yellow); pin_set(led_red); // Ekraani seadistamine lcd_gfx_init(); // LCD ekraani puhastamine lcd_gfx_clear(); lcd_gfx_backlight(true); // Kursori (nähtamatu) ekraani keskele viimine lcd_gfx_goto_char_xy(2, 2); // Teksti kuvamine lcd_gfx_write_string("UHandHVPWM"); // Mootori seadistamine hv_pwm_init(0); hv_pwm_init(1); // Lõputu tsükkel while (true) { // Loeb nupu S3 väärtuse new_value1 = pin_get_debounced_value(button3); // Nupp S1 alla vajutatud if(!pin_get_debounced_value(button1)) { // Suurendab kiirust if(speed < 255) { speed++; } pin_clear(led_green); } // Nupp S2 alla vajutatud if(!pin_get_debounced_value(button2)) { // Vähendab kiirust if(speed > 0) { speed--; } pin_clear(led_yellow); } // Jätab eelmise nupu S3 väärtuse meelde old_value1 = new_value1; // Töötsükli ehk kiiruse muutmine mõlemal viigul. hv_pwm_value(0, speed); hv_pwm_value(1, speed); // Kiiruse teisendamine stringiks. sprintf(text, "%d kiirus", speed); // Kiiruse kuvamine ekraanil. lcd_gfx_goto_char_xy(3, 4); lcd_gfx_write_string(text); // Viide. sw_delay_ms(2); // LEDide kustutamine pin_set(led_green); pin_set(led_yellow); // Mõõtmine UH anduriga distance = ultrasonic_measure_srf05(pin_trigger_echo); // Mõõtmine õnnestus ? if (distance > 0) { // Kauguse tekstiks teisendamine sprintf(text, "%d cm ", distance); } // Mõõtmisel tekkis viga ? else { // Vea tekst sprintf(text, "Viga "); } // Kauguse kuvamine LCD viienda rea alguses lcd_gfx_goto_char_xy(3, 5); lcd_gfx_write_string(text); } } ===== PWM Teek - HvPWM.c ===== //***************************************************************************** // Riistvaraline PWM kasutamiseks Kodulabori servoviikude juhtimiseks. // // Kirjeldus: // Funktsioonid võimaldavad kasutada kodulabori servo viike (PB5 ja PB7) PWM // väljunditena. // // Kasutamine: // // Lisa oma projektile HvPWM.c ja HvPWM.h failid. Edasi lingi need // eelprotsessorikäsuga #include "HvPWM.h" // // Edasi saad initsialiseerida PWM-i, kasutades käsku "hv_pwm_init(unsigned // char index)". Kus "index" on servo number, ehk kas 0 või 1. // // Autor: Heiko Pikner // // Compiler :AVR-GCC // Chip type :Atmega2561 //***************************************************************************** #include "HvPWM.h" // // PWMi periood (5000ms) // #define PWM_PERIOD (F_CPU / 8 / 5000) // // Kasutusel servopistik. Protsessori viigud PB5 ja PB6 // static pin servo_pins[2] = { PIN(B, 5), PIN(B, 6) }; // // Seadistamine. Ette anda 0 või 1 olenevalt valitud pistikust. // void hv_pwm_init(unsigned char index) { // Seadista PWM viik väljundiks. pin_setup_output(servo_pins[index]); // Seadista timeri kontrollregister // Clear OUTA and OUTB on compare match // Fast PWM mode with ICR = TOP // Prescaler 8 timer1_init_fast_pwm( TIMER1_PRESCALE_8, TIMER1_FAST_PWM_TOP_ICR, TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH, TIMER1_FAST_PWM_OUTPUT_DISABLE); // TOP period timer1_set_input_capture_value(PWM_PERIOD); } // // PWM väärtuse muutmine // index - Servo pins 0-1. // position 0-255. PWM value. // void hv_pwm_value(unsigned char index, unsigned int value) { switch (index) { case 0: timer1_set_compare_match_unitA_value(value); if(OCR1A == 0) { DDRB &= ~(1 << DDB5); } else { DDRB |= (1 << DDB5); } break; case 1: timer1_set_compare_match_unitB_value(value); if(OCR1B == 0) { DDRB &= ~(1 << DDB6); } else { DDRB |= (1 << DDB6); } break; } } ===== PWM teegi päisfail - HvPWM.h ===== #ifndef HVPWM_H #define HVPWM_H #include #include #include "homelab/pin.h" #include "homelab/timer2561.h" // prototypes void hv_pwm_init(unsigned char index); void hv_pwm_value(unsigned char index, unsigned int position); #endif