Introducere

Scopul proiectului este de a crea un ceas cu afisaj de tip analog folosind fenomenul de POV (Persistence of Vision).
Am ales ca modul de afisare sa fie in stil analog (cu limbi si nu cifre) pentru ca mi s-a parut mai atractiv ca efect vizual.

Descriere generală

Schema bloc

Schema bloc a acestui proiect este relativ simpla, fiind reprezentata mai jos :

Hardware Design

Lista piese :

  • 6 led-uri
  • 6 rezistente 3k3 Ω
  • conectori mama + tata
  • placuta test 4 x 4

Schema electrica :

Software Design

  • Pentru programarea microcontrolerului am folosit limbajul C si WinAvr.
  • Programul consta intr-o bucla infinita , in care, la fiecare pas sunt recalculate valorile pentru ore, minute si secunde.
  • Mai jos este prezentat implementarea :
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
 
#define period 95
#define onTime 2
#define drawLine(t) PORTD = PORTD ^ 63; _delay_ms(t); PORTD = PORTD ^ 63;
#define waitTime(t) _delay_ms(t);
#define H 1
#define M 25
#define S 40
 
 
void swap(double *a, double *b)
{
	double aux;
 
	aux = *a;
	*a = *b;
	*b = aux;
}
 
int alphaToMs(double alpha)
{
	return (int)(period * alpha/360);
}
 
int main()
{
	double h = H,m = M,s = S, ms = 0;
	double alpha_h, alpha_m, alpha_s;
	int cur_time, aux;
 
	DDRD = 0xFF; //setez pinii pe iesire
	PORTD = 63; 
 
	while(1)
	{
 
		alpha_h = (double)360/12 * h + (double)360/(12*60) * m + (double)360/(12*60*60) * s;
		alpha_m = (double)360/60 * m + (double)360/(60*60) * s;
		alpha_s = (double)360/60 * s;
 
		if(alpha_m > alpha_s)
		{
			swap(&alpha_m, &alpha_s);
		}
 
		if(alpha_h > alpha_m)
		{
			swap(&alpha_h, &alpha_m);
		}
 
		if(alpha_m > alpha_s)
		{
			swap(&alpha_m, &alpha_s);
		}
 
		cur_time = 0;
 
 
		//cur_time = period - onTime;
		//drawLine(onTime);
		//waitTime(cur_time);
 
 
		aux = alphaToMs(alpha_h);
		waitTime(aux);
		drawLine(onTime);
		cur_time += (aux + onTime);
 
 
		aux = alphaToMs(alpha_m) - cur_time;
		if(aux > 0)
		{
			waitTime(aux);
			drawLine(onTime);
			cur_time += (aux + onTime);
		}
 
		aux = alphaToMs(alpha_s) - cur_time;
		if(aux > 0)
		{
			waitTime(aux);
			drawLine(onTime);
			cur_time += (aux + onTime);
		}
 
		aux = period - cur_time;	
		if(aux > 0)
		{
			waitTime(aux);
		}
 
		ms += period;
 
		if(ms >= 1000)
		{
			s ++;
			ms = ms - 1000;
		}
		if(s == 60)
		{
			m ++;
			s = 0;
		}
		if(m == 60)
		{
			h ++;
			m = 0;
		}
		if(h == 12)
		{
			h = 0;
		}
 
	}
 
	return 0;
}
 
 

Rezultate obtinute

Mai jos aratate rezultatele obtinute





Concluzii

Folosirea unui DC motor a implicat foarte mult trial-and-error pentru determinarea turatiei acestuia. De asemenea probleme apar si datorita faptului ca , neffind suficient de puternic, motorul nu isi mentine constanta turatia. O solutie ar fi fost utilizarea unui motor pas-cu-pas, astfel controland precis turatia ansamblului.

Download

Bibliografie/Resurse

pm/prj2011/pgp/propeller_clock_analogue_spa.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
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