Table of Contents

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 :

Schema electrica :

Software Design

#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