MetkuMods

Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2.

Kommunikointi tietokoneen kanssa, moottorien ohjaus, servot jne.
 
Kirjoittaja: Aki Korhonen
Julkaistu: 06.05.2009
In English In English
Suomeksi Suomeksi

Esimerkki 2.4 - Pieniresoluutioinen servo-ohjain sisäänrakennettua PWM:ää käyttäen

Opittava asia: ulkoinen keskeytys (painikkeen painaminen aktivoi laitteessa keskeytyksen, jota voimme käyttää painikkeen tilan jatkuvan testaamisen sijaan)

Vielä yksi PWM-esimerkki. Tällä kertaa yksinkertainen pienitarkkuuksinen (vain ~30 askelta) servo-ohjain.

Osalista:
  • ATiny45
  • 100 nF kondensaattori
  • Painonappi
  • 10k ohmin vastus
  • Normaali RC-servo
 

How to get started with microcontrollers - Part 2
Esimerkki 2.4

 

How to get started with microcontrollers - Part 2
Esimerkki 2.4


/**
* MetkuMods - http://metku.net/
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.4 - Pieniresoluutioinen servo-ohjain sisäänrakennettua PWM:ää käyttäen
*
* Tekijä: Aki Korhonen
* Pvm: 2009-04-29
*/

// Mikäli kellotaajutta ei ole projektiasetuksissa laitettuna, niin laitetaan tässä
#ifndef F_CPU
	#define F_CPU 1000000UL // 1 MHz
#endif

#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

#include <util/delay.h>

// Servo pinnissä PB0, OCR0A
#define SERVO_PIN 0

// Painike pinnissä PB2, INT0
#define BTNPIN 2

// Esiasetetut servon asentoarvot OCR0A-rekisteriä varten
// Joutunet hienosäätämään näitä omaa servoasi varten
#define SERVO_LEFT 7
#define SERVO_CENTER 22
#define SERVO_RIGHT 35

uint8_t position = 1;

int main(void)
{
	// PB2 sisään, muut ulos
	DDRB = 0b11011;

	// Aseta sisäinen ylösvetovastus PB2-pinnille ja aseta muut alas
	PORTB = 0b00100;

	// -------------------------
	// Aseta ulkoinen keskeytys 0 (INT0)
	
	// INT0:n laskeva reuna aiheuttaa keskeytyksen (1 -> 0)
	MCUCR |= (1<<ISC01);

	// Aktivoi INT0
	GIMSK |= (1<<INT0);
	
	// Aktivoi globaalit keskeytykset
	sei();
	
	// -------------------------
	// Aseta PWM

	// Nopea PWM (Fast PWM)
	TCCR0A |= (1<<WGM01) | (1<<WGM00);

	// Tyhjennä OC0A/OC0B, kun vertailuarvo saavutetaan
	// Aseta OC0A/OC0B alhaalla, nollassa (ei-käänteinen tila)
	
	// Clear OC0A/OC0B on Compare Match
	// Set OC0A/OC0B at BOTTOM (non-inverting mode)
	TCCR0A |= (1<<COM0A1);

	// Aseta esijakajaksi (prescaler) 64
	// 1 MHz / 64*256 = 61 Hz PWM-taajuus
	TCCR0B |= (1<<CS01) | (1<<CS00);

	// -------------------------

	// Aloita niin, että servo on keskiasennossa
	OCR0A = SERVO_CENTER;
	
	while(1)
	{
		// Painikkeen tilan tarkkailua ei tarvitse tehdä
		// täällä, koska painallus käsitellään keskeytyskäsittelijässä
	}

	return 0;
}

// INT0:n keskeytyskäsittelijä
// Käy läpi servon esiasetetut asennot
ISR(SIG_INTERRUPT0)
{
	cli();

	switch(position)
	{
		case 0:
			OCR0A = SERVO_LEFT;
			break;
		case 1:
			OCR0A = SERVO_CENTER;
			break;
		case 2:
			OCR0A = SERVO_RIGHT;
			break;
		default:
			break;
	}

	position++;

	if(position == 3)
		position = 0;
	
	_delay_ms(300);

	sei();
}





Sivut:  1 2 3 4 5 6 


 
  Content in english!
  Sisältö suomeksi!

 Google




Add to Technorati Favorites
add
add
add
add
add

 .:Back to top Bandwidth by Mpoli

Copyright © Metku.net, All Rights Reserved.
All content and graphics in MetkuMods are sole property of Jani Pönkkö and may not be reproduced or copied in any manner without written permission from him.
All brand names, trademarks and copyrights are the property of their respective owners.Privacy Policy