Sari la conținut
ELFORUM - Forumul electronistilor

atmel, comparatorul analog si ciclocomputerul de la bicla


Vizitator Cristian Giurgea

Postări Recomandate

Vizitator Cristian Giurgea

Salut,sunt interesat de un circuit prin care sa interfatez atmega8535 cu bobina de la ciclocomputerul de la bicicleta. Initial am folosit comparatorul de pe atmega8535, insa am avut o problema cel putin ciudata: folosind un soft care scrie pe seriala cand ACO este pe "rising edge", microcontrollerul scria tot timpul cat aveam fire conectate la AIN0 si AIN1, lasate in aer. Se oprea doar cand pe ambele le conectam la un pin al microcontrollerului.Am incercat sa conectez AIN1 la iesirea unui potentiometru aflat intre VCC si GND, dar acelasi rezultat. Momentan am abandonat schema, urmand sa mai cer sfaturi specializate.Cineva mi-a sugerat ca sistemul de la ciclocomputer nu s-ar baza pe generarea unui spike de tensiune la fiecare trecere a magnetului. Stie cineva care este principiul ciclocomp.? Mai bine zis, stie cineva principiul vreunui ciclocomputer aflat acum pe piata? Sunt interesat sa ma interfatez cu ciclocomputerul in felul urmator: la fiecare trecere a magnetului prin fata bobinei imi trebuie un spike de 5V la un pin al microcontrollerului ( sau o intrerupere executata ) pentru a inregistra acest eveniment. Are cineva vreo schema, a facut cineva asa ceva?

Link spre comentariu
  • Răspunsuri 14
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • bogdan_

    7

Top autori în acest subiect

Imagini postate

Normal ar trebui sa faci asa: o intrare o legi la o referinta, obtinuta cum ai spus cu un potentiometru intre vcc si ground. Pe cealalta intrare aplici semnalul. Acum, eu amvazut mai multe variante: ai un magnet pe roata care trece pe langa o bobina sau un senzor hall sau un contact reed. Functie de care tip este, ai nevoie de un circuit diferit. Poti afla mai multe despre senzor?

Link spre comentariu
Vizitator Cristian Giurgea

bogdan_,

 

Sistemul este acesta: http://www.decathlon.ro/RO/suport-ciclo ... 170664472/ , dar nu stiu mai multe. O sa incerc sa aflu. In paralel cu asta, as putea sa cumpar un ciclocomputer daca cineva imi spune "acest ciclocomp. se bazeaza pe acest principiu".

Ceea ce nu inteleg in mom de fata este comportamentul comparatorului.

Intrarea AIN1 era conectata la iesirea potentiometrului. Oricat de mult cresteam tensiunea pe AIN1 din potentiometru, indreptandu-ma spre VCC, daca AIN0 era conectat la un alt fir de cca 30 cm lungime si lasat in aer, fara sa atinga nimic, microc. scria continuu pe seriala. Daca conectam firul la masa sau la vcc, se oprea.

 

Codul:

 

 

#include "../../../avr/usart.h"

#include

 

volatile unsigned char uchWriteSerial = 0;

 

ISR( ANA_COMP_vect )

{

//set the global flag to write on serial

uchWriteSerial = 1;

}

 

int main(void)

{

unsigned char uchOff = 0;

 

USART_Init();

 

ACSR = (1 << ACIE) | (1 << ACIS1) | (1 << ACIS0);

sei();

 

USART_Transmit( 'S' );

 

for(;;)

{

 

if( uchWriteSerial )

{

USART_Transmit( 'A' + uchOff );

 

uchOff ++;

uchOff &= 0x3;

 

/////////

uchWriteSerial = 0;

}

}

 

return 0;

}

 

Cum este posibil asa ceva?

Link spre comentariu
Vizitator Cristian Giurgea

Salut, pare-se ca e un contact reed, am pus ohmetrul si, cand magnetul trece in dreptul lui, rezistenta devine 0.Again, cu microcontrollerul... am conectat la pinul PB0 un fir cu papuc de plastic, de 20 cm, si, ruland codul de mai jos, am scrieri continue pe seriala:#include int main(void){ unsigned char uchOff = 0; unsigned char uchPD = 0; USART_Init(); USART_Transmit( 'S' ); for(;;) { unsigned char uchD2 = PINB; uchD2 &= ( 1 << PINB0 ); if( uchD2 != uchPD ) { if( uchD2 < uchPD ) { USART_Transmit( 'A' + uchOff ); uchOff ++; uchOff &= 0x3; } uchPD = uchD2; } } USART_Transmit( 'E' ); return 0;}wtf???

Link spre comentariu

Hardware trebuie sa faci asa: Legi senzorul intre VCC si pin si mai pui o rezistenta de 10K sa zicem intre pin si ground. Apoi masori cu multimetrul si teasiguri ca ai 0V pe pin cand nu e magnetul aproape si 5V(sau cat e vcc) cand magnetul e aproape. Un pin de micro folosit ca intrare are impedanta mare, si e suficient cuplajul capacitiv cu reteaua de CA ca pe pinul ala sa vezi o oscilatie continua intre cele 2 nivele. De asta trebuie sa te asiguri ca il fortezi tu in jos/sus din circuitul extern, in cazul de fata switchul forteaza la VCC iar rezistena la ground. Ca sa vezi sigur ca functioneaza fa o bucla infinita in care scoti pe un alt pin exact ce citesti pe pinul ala, si leaga la iesire un led. Ar trebui sa il vezi pulsand. Revizuieste codul ala si ataseazal folosind butonul de Code de sus ca sa se vada mai clar.(ma refer la ultima varianta)Ce ar vrea as faca codul?

Link spre comentariu
Vizitator Cristian Giurgea

Salut, urmatorul cod:

 

#include "../../../avr/usart.h"//#include <avr/interrupt.h>int main(void){	unsigned char uchOff = 0;	unsigned char uchPD = 0;	PORTB = 0xFF;	USART_Init();	USART_Transmit( 'S' );	for(;;)	{		unsigned char uchD2 = PINB;		uchD2 &= ( 1 << PINB0 );		if( uchD2 != uchPD )		{			if( uchD2 < uchPD )			{				USART_Transmit( 'A' + uchOff );				uchOff ++;				uchOff &= 0x3;			}			uchPD = uchD2;		}	}	USART_Transmit( 'E' );	return 0;}

folosind pinul PB2 conectat la senzor si senzorul conectat la masa, face ceea ce trebuie: cand magnetul trece prin dreptul senzorului, scrie pe seriala un caracter.

Este clar ca este un senzor reed.

 

Mersi de explicatia cu oscilatia de nivele. Nu puteam intelege de unde bascularea nivelului.

Codul de mai sus se bazeaza pe nivelul 1 logic la PB2 si conectarea la masa cu senzorul reed. Din fericire, nu are oscilatii "nepoftite".

Link spre comentariu

Sa inteleg ca merge acum?Totusi, uchD2 < uchPD implica si uchD2 != uchPD asa ca nu vad de ce faci ambele verificari....Mai este totusi ceva care trebuie adaugat, dar care este salvat de transmisiunea pe seriala: debounce.Mai exact, la comutatie o sa ai un zgomot, o perioada in care switchul e citit alternativ 0 -1. Cat dureaza depinde de multi factori, dar ideal ar fi ca dupa fiecare trecere 1-0(ca inteleg ca ai legat senzorul intre pin si masa) sa astepti un timp x pana cand iei in clacul urmatoarea trecere. Tie aici asteptarea iti vine din cat asteapta rutina aia sa trimiti caracterul pe portul serial. Cauta mai multe informatii despre 'debounce' si te vei lamuri.

Link spre comentariu
Vizitator Cristian Giurgea

ma intereseaza doar "rising edge", ca sa zic asa, de asta fac acea verificare.Interesant ce spui despre acel 'debounce'. Ceva idei despre cum as putea sa scap de el fara un 'delay" controlat in cod?

Link spre comentariu
Vizitator Cristian Giurgea

pai... nu am facut decat sa pun pull-up rezistorii prin acel PORTD = 0xFF. In rest, nu am nimic in plus pe montaj, decat pinii controllerului ( bine max232 pentru seriala, un 7805 pentru alimentare ). In concluzie, in paralel cu senzorul, un condensator de 10 nF si un rezistor de 10k in serie cu senzorul reed?

Link spre comentariu

Ca aici: Posted Image

 

Ma gandesc ca e posibil carezistenta de pull up sa fie cam prea mare. Eu am avut probleme in ceva circuite mai zgomotoase si atrebuit sa pun si rezistenta externa. De asta sugeram 10K extern. Valoarea ei din datasheet e undeva la 20 - 50k.

Link spre comentariu

Nu prea are nici o relevanta potentiometrul acolo. Potentiometrul era relevant daca aveai nevoie de comparator. In plus, invarianta aia daca dai potul la minim, are rezistenta 0 si cand o sa inchizi comutatorul reed o sa faci scurt intre alimentari. Deci prima varianta e cea ok, dar vezi ca e vorba de un condensator de vreo 10n, nepolarizat.

Link spre comentariu
Vizitator Cristian Giurgea

asta vroiam sa te intreb, ca vazusem in schema data de tine un condensator polarizat... nu ma pricep la electronica, dar credeam ca un condensator de 10 nanoF nu prea poate fi polarizat... deci, e nepolarizat :)... ok, acum se leaga :)...

Link spre comentariu

Greseala mea, am dat copy la schema direct din searchul de la google si mi-a scapat simbolul + pe condensator (inseamnand ca e polarizat). Depinde de aplicatie, poate in unele e necesara o filtrare mare si atunci se foloseste un electrolitic. Dar aici e de ajuns un banal ceramic.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări