Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:competition:cart:software [2012/04/10 21:08] raivo.sellet:competition:cart:software [2020/07/20 12:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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|}}
 +
 +<code c>
 +//*****************************************************************************
 +// 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 <stdio.h>
 +#include "homelab/pin.h"
 +#include "homelab/delay.h"
 +#include <homelab/module/sensors.h>
 +
 +#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);
 + }
 +}
 +</code>
 +
 +
 +
 +
 +
 +
 +====== Keerukam näide ======
 +
 +Failid pakituna projektiks:
 +  * {{:software:codes:uh_andur_eclipse.zip| Eclipse projekt}}
 +===== Peaprogramm - main.c =====
 +
 +
 +<code 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 <stdio.h>
 +#include "homelab/pin.h"
 +#include "homelab/delay.h"
 +#include <homelab/module/lcd_gfx.h>
 +#include <homelab/module/sensors.h>
 +#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);
 +
 +       
 +   
 +
 + }
 +}
 +</code>
 +
 +
 +
 +===== PWM Teek - HvPWM.c =====
 +
 +<code 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;
 + }
 +}
 +</code>
 +
 +===== PWM teegi päisfail - HvPWM.h =====
 +<code c>
 +#ifndef HVPWM_H 
 +#define HVPWM_H 
 +
 +#include <stdio.h>
 +#include <avr/interrupt.h>
 +#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
 +
 +</code>
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0