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.3 - Säätövastuksen arvon lukeminen

Opittava asia: PWM:n ja ADC (Analog to Digital Converter) käyttö

Lisätään hieman säätömahdollisuutta himmenemiseen ja käytetään sisäistä A/D-muunninta säätövastuksen arvon lukemiseen. Tällä kertaa vuorossa kaksi erilaista koodiesimerkkiä samalle kytkennälle.

Osalista:
  • ATiny45
  • 100 nF kondensaattori
  • Punainen ledi
  • 270 ohmin vastus, ledin etuvastus (käytä LedCalcia etuvastuksien laskemiseen muunlaisille ledeille)
  • 100k ohmin vastus
  • 10k ohmin (tai suurempi) säätövastus
 

How to get started with microcontrollers - Part 2
Esimerkki 2.3

 

How to get started with microcontrollers - Part 2
Esimerkki 2.3

Ensimmäinen esimerkkikoodi on mikrokontrolleriversio Metkun vanhasta ColorFade -kytkennästä. Himmennystekniikassa on myös hieman eroa, koska ColorFade perustuu analogiseen kytkentään, jossa himmentymiseen vaikuttaa muutamien osien arvot ja tässä versiossa kaikki tehdään digitaalisesti ohjelmalla.


/**
* MetkuMods - http://metku.net/
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.3.1 - Säätövastuksen arvon lukeminen
*
* 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 <inttypes.h>
#include <util/delay.h>

// Ledi pinnissä PB0, (OCR0A)
#define LED 0

// Säätövastuksen keskikontakti pinnissä PB2, (ADC1)
#define POT 2

// Min ja max arvot PWM:lle
// Näillä voit säätää kuinka kirkkaaksi ja himmeäksi ledi menee
// Minimi MIN:lle on 0 ja maksimi MAX:lle on 255
#define PWM_MIN 0
#define PWM_MAX 128

int main(void)
{
	// PB2 sisään, muut ulos
	DDRB = 0b11011;
	PORTB = 0x00;
	
	// Arvo PWM-rekisterille
	// Muuttujan "value" arvo on verrannollinen ledin kirkkauteen
	// 0 = pois päältä | 255 = täysi kirkkaus
	uint8_t value = 0;
	uint8_t step = 1;
	uint16_t delay = 10;
	uint16_t i = 0;

	// -------------------------
	// Aseta PWM

	// 8-bittinen PWM, vaihevakavoitu (Phase correct)
	// 8 bitillä saadaan 256 kirkkaustasoa
	TCCR0A |= (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) 8
	// 1 MHz / 8*256 = ~490 Hz PWM-taajuus
	TCCR0B |= (1<<CS01);

	// -------------------------
	// Aseta ADC
	
	// Aktivoi ADC
	ADCSRA = (1<<ADEN);

	// Valitse ADC1
	ADMUX |= (1<<MUX0);

	// Käytä käyttöjännitettä (Vcc) referenssijännitteenä
	ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
	
	// Valitse jakoluvuksi 8, jolloin saadaan 1 MHz/8 = 125 kHz ADC-kello
	ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
	
	// -------------------------
	
	// Ohjelma lukee ADC:lla säätövastuksen arvon
	// koko ajan ja laskee siten himmennysnopeuden.
	while(1)
	{
		// Kirjoita arvo rekisteriin OCR0A (Output Compare Register A)
		OCR0A = value;

		// Lisää arvoa askeleen verran
		value += step;
		
		// Mikäli asetettu maksimiarvo saavutetaan, niin vaihdetaan suuntaa
		if(value >= PWM_MAX)
			step *= -1;
		else if(value <= PWM_MIN)
			step = 1;

		// Aloita A/D-muunnos
		ADCSRA |= (1<<ADSC);
		
		// Odotellaan, että muunnos valmistuu
		loop_until_bit_is_set(ADCSRA, ADSC);
		
		// Laske viive askelten välillä
		// Min: 20 ms
		// Max: 127 ms
		delay = 20 + ((ADCW/8)-20);
		
		// Odota lasketun ajan verran.
		// For-looppi tässä, koska _delay_ms
		// ei pitänyt muuttujasta parametrina.
		for(i=0 ; i<delay ; i++)
			_delay_ms(1);
	}

	return 0;
}

Toisessa esimerkissä kytkentä pysyy täysin samana, mutta säätövastus säätää tällä kertaa suoraan ledin kirkkautta himmentymisnopeuden säätämisen sijaan.

Vinkki: jos korvaat lediosuuden tästä kytkennästä ensimmäisen kytkennän moottoriosuudella, pystyt säätämään moottorin nopeutta säätövastuksella.


/**
* MetkuMods - http://metku.net/
* Kuinka pääset alkuun mikrokontrollereiden kanssa - Osa 2
* Esimerkki 2.3.2 - Säätövastuksen arvon lukeminen
*
* 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 <inttypes.h>

#include <util/delay.h>

// Ledi pinnissä PB0, (OCR0A)
#define LED 0

// Säätövastuksen keskikontakti pinnissä PB2, (ADC1)
#define POT 2

int main(void)
{
	// PB2 sisään, muut ulos
	DDRB = 0b11011;
	PORTB = 0x00;
	
	// Arvo PWM-rekisterille
	// Muuttujan "value" arvo on verrannollinen ledin kirkkauteen
	// 0 = pois päältä | 255 = täysi kirkkaus
	uint8_t value = 0;

	// -------------------------
	// Aseta PWM

	// 8-bittinen PWM, vaihevakavoitu (Phase correct)
	// 8 bitillä saadaan 256 kirkkaustasoa
	TCCR0A |= (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) 8
	// 1 MHz / 8*256 = ~490 Hz PWM-taajuus
	TCCR0B |= (1<<CS01);

	// -------------------------
	// Aseta ADC
	
	// Aktivoi ADC
	ADCSRA = (1<<ADEN);

	// Valitse ADC1
	ADMUX |= (1<<MUX0);

	// Käytä käyttöjännitettä (Vcc) referenssijännitteenä
	ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
	
	// Valitse jakoluvuksi 8, jolloin saadaan 1 MHz/8 = 125 kHz ADC-kello
	ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
	
	// -------------------------
	
	// Ohjelma lukee ADC:lla säätövastuksen arvon
	// koko ajan ja päivittää PWM-rekisteriin saadun arvon,
	// jolloin ledin kirkkaus säätyy säätövastuksen mukaan
	while(1)
	{
		// Aloita A/D-muunnos
		ADCSRA |= (1<<ADSC);
		
		// Odotellaan, että muunnos valmistuu
		loop_until_bit_is_set(ADCSRA, ADSC);
		
		// Lue ADC:n arvo ja skaalaa se 8-bittiseksi arvoksi,
		// koska ADC tässä on 10-bittinen (1024 arvoa) ja
		// PWM-rekisteri on ainoastaan 8-bittinen (256 arvoa), 1024/256 = 4
		value = (uint8_t)(ADCW/4);

		// Kirjoita arvo rekisteriin OCR0A (Output Compare Register A)
		OCR0A = value;
		
		// Odota 2 ms
		_delay_ms(2);
	}

	return 0;
}






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