Sari la conținut
ELFORUM - Forumul electronistilor

Amplificator operational din PIC16F si 'breloc cu fluer'


Mondan

Postări Recomandate

Urmatoare schema:

Posted Image

 

In locul celor 2 tranzistori sa folosesc amplificatorele operationale din PIC.

 

Pot fi folosite astfel ? Personal am PIC16F684.

 

Sa fi montajul mai simlu.

 

Apoi va fi extins la o telecomanda in ultrasunete. Inteleg ca asta ar merge din orce pozitie.

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

Top autori în acest subiect

  • Mondan

    8

  • UDAR

    3

  • validae

    2

  • sofian

    1

Top autori în acest subiect

Imagini postate

Schema nu va fi mult mai simplă. Scapi de tranzistori dar ai nevoie oricum de rezistențe și condensatoare. în plus , trebuie să verifici disponibilatatea pinilor. Oooops ! PIC16F684 NU are amplificatoare operaționale !

Link spre comentariu
  • 10 luni mai târziu...

Bun hai sa luam PIC12F675

 

Eu zic ca operationalul are o amplificare mult mai mare decat tranzistorii aia, chiar daca ii faci darlington.

In prima schema data ca model sunt doua etaje succesive si primul etaj are si o rezistenta de histerezis (colecrtor emitor direct), care din ce am lucrat mareste mult amplificarea.

 

Receptorul/difuzorul  ala piezzo e deja un filtru pentru frecv inalte.

 

Problema e daca poate fi folosit operationalul integrat. 

E trecurt in datasheet drept comparator nu operartional.

 

Dar are pini exrternipentru IN+, IN- si COUT.

 

Poti sa-i pui o rezistenta (rezistor) pe reactie ?

Link spre comentariu

De exemplu, 16F1707 are 2 opamp rail-to-rail. Evident, folosirea lor reduce numarul de IO.Am ales unul cu numar cat mai mic de pini pentru aplicatia simpla a lui Dan. Nu exista in familia 12F nici unul cu opamps.Ca de obicei, Dan e "pionier" in idei; sincer ii urez spor la munca.

Link spre comentariu

Comparatorul din PIC poate fi , în principiu, folosit ca OA în aceleași condiții în care se poate folosi un comparator normal - reacție negativă nu prea adâncă și/sau asigurarea unei rețele de compensare externe. Unele comparatoare din microcontrolere au însă histerezis intrinsec ceea ce complică lucrurile. Specificațiile fabricanților sunt destul de sumare deci e mult de testat - ajustat , nu știu dacă merită. Pur și simplu, dacă minimizarea numărului de componente contează și nu se cere un OA colosal, se folosește un PIC care are inclus așa ceva.

Link spre comentariu

Dacă vrei sensibilitate mare ș reducerea numărului de componente, de ce nu pui ca preamplificator un operațional discret, fiindcă necesită puține componente externe și poți obține o amplificare foarte mare ? Spațiul ocupat va fi mai mic decât al celor două tranzistoare și rezistențele aferente.

Editat de validae
Link spre comentariu

<de ce nu pui ca preamplificator un operațional discret, fiindcă necesită puține componente externe>

 

Nu cunosc astfel de operationale care se gasesc usor. Eu folosesc TL071 dar nu cred sa merge bine la tensiune asa mica.

Ele merg uzual la +/-15V adica 30V..

 

Acum eu pot alimenta PIC-ul de la 2xR6 ceea ce inseamna 3V. Nu stiu daca ar merge bine la tensinea asta.

 

Pot cumpara in prezent de la:

http://www.elforum.info/topic/95799-integrate-tdaxxxx-st-mivarom-preturi-dubios-de-ieftine-care-i-faza/

 

Daca stiti vre un astfel de integrat nu ezitati sa-mi spuneti.

 

Prin posta sa comand nu prea-mi  permit. N-ar avea rost o comanda minima de 25RON pentru un integrat ieftin.

Nu pot comanda mai multe o data, deorece le comand pe parcurs ce discut cu voi si le testez.

Link spre comentariu

Daca stiti vre un astfel de integrat nu ezitati sa-mi spuneti.

 

MCP6xx , de exemplu MCP601/602 , MCP6271/6272, MCP6281/6282, etc. 

Se găsesc , printre alții , la TME și Comet. Dacă ești din București , Comet are magazin acolo. 

Link spre comentariu

Si totusi cred ca se poate gandi o aplificare astfel:

 

1. Semnalul de intrare in PIC este dreptunghiular. PIC-ul nu face decat sa masoare o frecveneta.

 

post-183833-0-66779400-1424202287_thumb.jpg

La simulare mi-a dat ceva de acest gen. E aiurea. trebuia sa am dreptunghi la iesire.

 

Un montaj de acest gen vreau sa incerc.    

Pentru cei care spun ca ma exprim neclar - Uite proiectul de la care am plecat(pus in primul post):

http://www.talkingelectronics.com/projects/Elektor/Whistle/Whistle-1.html

 

-The program detects the signal from the diaphragm and only processes a waveform that falls in the 2kHz region.

 

MMM

Cred a merge si in simulare incercat. In loc de semnalul pe piezzo intentionez sa pun in Proteus un generator de semnal. Acest generator poate reda in simulare si un fisier audio, o inregistrare.

Link spre comentariu

Deci,la acest punct aveti linkul:

http://www.talkingelectronics.com/projects/Elektor/Whistle/Whistle-1.html

 

<The program detects the signal from the diaphragm and only processes a waveform that falls in the 2kHz region.>

Neclara putin exprimarea. Sa vedeam in continuaere;

 

 

 

<A 2kHz signal has a period of  1,000,000 / 2,000 = 500uS>.

Daca 1KHz "este" 1mS, logic e jumate

 

 

 

<The period of a waveform is the time taken to travel from the 0v level to the maximum (positive), then to the max negative>

0V->5V->0V

 

<This means the time when the signal will be HIGH will be 250uS and 250uS for a LOW.>

Asta sa grosolan, daca nu ai alt sunet decat fluierul. Ambianta sonora super claera.

 

 

<The signal will create a HIGH on the pin.>

Deci este o intare digitala, asta vor sa zica

<We create a very short-duration loop to look for a HIGH and when it is detected, we delay nearly 250uS and see if it is still HIGH.>
ok

<we look for a LOW >

aici iarasi neclar ce fac ei - astepta partea LOW dar cum ?  are conditie de iesie din delay ...?

 

< This is the Interrupt Service Routine >

Cu intreruperi.... nu-mi pace deloc!

Start	org	0x00	;program starts at location 000	goto	SetUp	nop			nop		;NOPs to get past reset vector address	org	4	goto	isr				nopSetUp	movlw   07h      ;Set up W to turn off Comparator ports	movwf   CMCON    ;must be placed in bank 0   	goto 	Main	;Main	;Delays						_25uS	movlw	.7	movwf	temp1	decfsz	temp1,1			 	goto 	$-1	 		retlw	00				_130uS	movlw	.45	movwf	temp1	decfsz	temp1,1			 	goto 	$-1	 		retlw	00				_250uS	movlw	.84	movwf	temp1	decfsz	temp1,1			 	goto 	$-1	 		retlw	00			_100mS	movlw	.100	movwf	temp2	nop	decfsz 	temp1,1	goto 	$-2	decfsz 	temp2,1	goto 	$-4		retlw 	00					_250mS	movlw	0FFh	movwf	temp2	nop	decfsz 	temp1,1	goto 	$-2	decfsz 	temp2,1	goto 	$-4		retlw 	00						;interrupt service routine		isr	nop	decfsz	timer,1		;creates 1 min delay to let you know it is on.	goto	Main1	movlw	03	movwf	count	goto	sss 				Main	

Deci ei definesc niste delay-uri constante,

programul incepe la Main

iaer intrreruperea la isr

 

 

 

 

 

			aa	call	_25uS						btfss	GPIO,2		;Is input HIGH?  Start with a HIGH	goto	aa						bb	call	_250uS	btfss	GPIO,2		;Is input LOW?   	goto	cc	goto	aa		;freq too low					cc	call	_250uS	btfsc	GPIO,2		;Is input LOW?	goto	dd			goto	aa		;freq too lowdd	incf	count,1	goto	bb

1. Asteapta ca intrarea sa fie HI- bucla infinita,

2. Astapata 250us. Daca dupa asta e LO continua, daca nu o ia de la inceput,

3. Astapata inca 250us. Daca dupa asta e HI continua, daca nu o ia de la inceput,

4. Incrementeaza cont si sare la 2.

Fara nicio sincronizare nimic.

 

Ciclul pare infinit, daca intreruperea nu il scoate de aici.

Daca cineva vrea sa ma ajute cu descrierea intereruperi il rog sa screie.

Intentionez sa scriu acest soft fara intreruperi.

La intrerupere se executa;

isr	nop	decfsz	timer,1		;creates 1 min delay to let you know it is on.	goto	Main1	movlw	03	movwf	count	goto	sss                   ;  e doaer buzzereul aiciMain1	bcf	PIE1,0		;,0 0=disables TMR1 interrupt	bcf	T1CON,0		;disable timer1	bsf	status,rp0 	;Bank 1		bCf	INTCON,7	;disable all unmasked interrupts		bcf	INTCON,5	;disables TMR0 interrupt			bcf	status,rp0	;bank 0 			swapf	count,1	rrf	count,1		;	rrf	count,1		;only use top 2 bits	movlw	b'00000011'	andwf	count,1		;max 4 beeps				movf	count,1	btfsc	status,z	;z flag will be SET if file is zero	goto	Main;Cu urmatoarele serari  din Main:bsf	status,rp0 	;Bank 1				movlw	b'00100100'	;Set GP2 input  GP5 input	movwf	TRISIO				movlw	b'10010100'	movwf	OPTION_REG	; x000 0000 x=1= weak pull-ups disabled 				; 0x00 0000 INTDEG Don't care				; 00x0 0000  x=0 = internal instruction clock				; 000x 0000 Count on falling edge - don't care				; 0000 x000 0=prescaler assigned to timer0  				; 0000 0xxx = 111 = 1:128  x100=1:32		bcf	status,rp0	;bank 0 			bcf	GPIO,4	call	_100mS		;(settling time)			movlw	b'10100000'	;b'10100000'	movwf 	INTCON		;,0  1=GP0,5 interrupt flag				;,1  1=GP2 interrupt occurred		;bcf	INTCON,2	;1=TMR0 overflowed. Clear overflow flag		;bcf	INTCON,3	;1=enable GPIO port change interrupt		;bcf	INTCON,4	;1=enable GP2 external interrupt		;bsf	INTCON,5	;1=enable TMR0 overflow (interrupt)		;bcf	INTCON,6	;1=enable all peripheral interrupts		;bsf	INTCON,7	;1=enable all unmasked interrupts			bcf	INTCON,5	;0=disables TMR0 interrupt	bsf	INTCON,6	;1=enable all peripheral interrupts			movlw	b'00010101'	;b'00110001'				movwf	T1CON		;,7  not used				;,6 0=Timer1 is ON				;,5,4  11=8 prescale (max) 01=1:2				;,3 bit ignored				;,2 This MUST BE SET!!!!!!				;,1 0=int clock 				;,0 1=enable timer 		bsf	status,rp0 	;Bank 1					bsf	PIE1,0		;,0 1=enables TMR1 interrupt			bcf	status,rp0	;bank 0 	bcf	PIR1,0		;clear TMR1 overflow flag			clrf	TMR1L		;clear the Timer1 low register	clrf	TMR1H		;clear the Timer1 high register	clrf	count		;count the number of cycles				;Timer0 is not used 						; will go to isr when overflow occurs in TMR1				;0.13 sec when prescaler=1:2  131,072uS					;input is LOW when no audio detected.				

Intrebarea e asa:

De cate ori repeta ciclul ala 1.2.3.4. datorita intreruperii ?

 

Credeti ca e cea mai buna varianta de algoritm cum au scris ei, sau se poate si altfel ?

Link spre comentariu

post-183833-0-56787300-1424508526_thumb.jpg

 

O simulare in Proteus.

 

Am marcat intrarea in procedura amintita prin GP0 comutat putin.

 

Ies vro 250 de ciclui din frecveta aia de 2KHz numarate.  Probabil timmerul ala numara 256 si iese din 'procedura' cand 'se da peste cap".

 

256*500uS=256/2mS=125mS cat trebuie sa fluieri nimim.

 

Preoblema este abaterea de la frecventa 2K, deoarece  nu se resincronizeaza la aceasta numarare.

 

Deci 250uS abatere totala maxima la 256 de cicluri=> 1us per ciclu abatere maxima

 

500uS=2KHz

501uS=1.996KHz

 

E ceva exagerat aici.

Poate sa fi gesit undeva si va rog sa ma corectati.

 

N-ai cum sa fluieri exact pe frecventa aia cuo abatere asa de mica.

 

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