Sari la conținut
ELFORUM - Forumul electronistilor

Ajutor pentru dozator


fratello

Postări Recomandate

Va salut ! Intrucat ambele dozatoare de sapun lichid din dotare au cedat inexplicabil si incercarile de reparare nu au dat rezultat, m-am gandit sa-mi fac propria schema, cu PIC 12F675. Schema e simpla , dar nu reusesc sa implementez corect functia SLEEP, a.i. PIC-ul sa aiba consum minim posibil in perioada de repaus ...

Atasez codul (scris in PicBasic Pro) poate cineva cu cunostinte mai bune decat ale mele (care sunt, din pacate, sumare :( ) ma poate indrepta in  directia corecta.

Va multumesc anticipat !


@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_ON 

DEFINE OSCCAL_1K 1
DEFINE OSC  4

CMCON    = 7
TRISIO   = %00011000
GPIO     = %00000000
IOC      = %00010000
INTCON   = %00001000
OPTION_REG = 0
WPU      = %00100110
VRCON    = 0
ANSEL    = %00111000
ADCON0   = %10001101

DataW 		var word
last_b_level 	var byte          	
b_level 	var byte
b_cnt 		var byte
b_act 		var byte
wakeup  var gpio.4

Clear

GPIO.0 = 0

Pauseus 100            			' Wait for channel to setup

;============================================================================

Main: 
INTCON.0 = 0
        ADCON0.1 = 1			' Start conversion
	While ADCON0.1=1:Wend		' Wait for conversion
	DataW.HighByte=ADRESH		' Read variable from ADC and save
	DataW.LowByte=ADRESL

if DataW < 600 then  
b_level=1
    if b_level=last_b_level then                 
        b_cnt=b_cnt+1
        pauseus 50
           if b_cnt > 10 then b_act = 1      'TO AVOID FALSE READING
    endif

    last_b_level=b_level                              
endif

if b_act = 1 then 
GPIO.0 = 1
PAUSE 4000
GPIO.0 = 0

b_act=0
last_b_level=0
b_cnt=0
ENDIF

@ SLEEP
PAUSE 100

goto main

Nota : am incercat n-variante pe langa aceasta, dar fara rezultatul scontat...

Link spre comentariu

Salut,

  Nu prea le am cu Basic-ul penrtu ca eu folosesc mikroC insa in sleep se intra cu o comanda asm si anume 'sleep', poti incerca asa:

 

asm
  sleep
end asm

 

Mai precis ce se intampla in cazul tau ? Pentru a obtine cel mai mic consum trebuie oprite si perifericele folosite cum ar fi ADC-ul altfel aceste periferice raman pornite chiar si cu CPU in sleep si vor consuma.

Link spre comentariu

Multumesc pentru raspuns.

Comanda este corecta.
@ Sleep

Problema este ca, oricum (oriunde in program) as introduce aceasta comanda, PIC-ul nu mai executa nimic !

Am folosit cu succes comanda intr-un montaj cu PIC16F1827, dar in acest -atat de simplu- montaj nu functioneaza.

 

Link spre comentariu

Păi în cazul ăsta s-ar putea să fie ce am zis - practic nu mai iese din SLEEP pentru că GPIF nu este șters. Nu vreau să insist dar merită să încerci , înainte de INTCON.0 = 0 scrie ceva de genul orice = GPIO

Link spre comentariu

Este corect ce zice UDAR, flag-ul de IOC (in cazul de fata GPIF ) trebuie sters inainte si dupa ce iese din sleep. Daca te ajuta o bucatica de cod de la mine care foloseste sleep:

 


void main() {
  OSCCON = 0x72;
  OPTION_REG.F7 = 0;
  
  TRISA = 0x8;
  ANSELA = 0x00;
  TRISC = 0x36;
  ANSELC = 0x00;
  LATA = 0x00;
  PORTC = 0x00;
  WPUC = 0x16;
  WPUA = 0x8;

  RF_Init();
  
  IOCCN = 0x16;
  INTCON.F3 = 1;
  INTCON.F7 = 0;

  while(1) {
    _asm sleep;
    IOCCF = 0;
    INTCON.F0 = 0;

    if (Button(&PORTC, 1, 1, 0)) {
      LED_STATUS = 1;
      RFM69_Send(BTN1_CODE_H, BTN1_CODE_L);
    } else if (Button(&PORTC, 2, 1, 0)) {
      LED_STATUS = 1;
      RFM69_Send(BTN2_CODE_H, BTN2_CODE_L);
    } else if (Button(&PORTC, 4, 1, 0)) {
      LED_STATUS = 1;
      RFM69_Send(BTN3_CODE_H, BTN3_CODE_L);
    }
    
    LED_STATUS = 0;
  }
}

 

Link spre comentariu

"A/D Operation During SLEEP
The A/D converter module can operate during SLEEP. This requires the A/D clock source to be set to the internal RC oscillator. When the RC clock source is selected, the A/D waits one instruction before starting the conversion. This allows the SLEEP instruction to be executed, thus eliminating much of the switching noise from the conversion. When the conversion is complete, the GO/DONE bit is cleared, and the result is loaded into the ADRESH:ADRESL registers. If the A/D interrupt is enabled, the device awakens from SLEEP. If the A/D interrupt is not enabled, the A/D module is turned off, although the ADON bit remains set."

Cum aplic asta in practica ???

Link spre comentariu

Pai cum scrie acolo si anume, prin "ANSEL" selectez oscilatorul dedicat adica "FRC" prin bitii 4-6 dupa care dai drumu la intreruperea  A/D prin "PIE1" bit 6. Dupa care dai drumu la conversie prin "ADCON0.1 = 1" iar in loc de "While ADCON0.1=1:Wend" inserezi un Sleep, PIC-ul va sta in sleep pana cand se termina conversia A/D iar cand acesta se termina PIC-ul va fi trezit de intreruperea A/D si vei putea citii rezulatul.  Daca vrei acest lucru strict pentru reducerea de consum mare chestie nu faci, conversia A/D nu dureaza foarte mult si PIC-ul oricum nu iese din sleep instant ci are nevoie de un anumit timp pana reporneste oscilatorul principal si alte chestii... foarte multa economie nu faci PIC-ul nu consuma exagerat de mult poate 1-2mA in rest tine foarte mult de hardware (exclus regulatoare generice gen 7805 si cele similare). 

 

Mai exact ce anume detecteaza ADC-ul ? Poate ai putea scapa de ADC cu un op-amp low-power (consum de cateva nA) prin care poti decide daca vrei sa trezesti PIC-ul sau nu, la intrare poti pune un filtru R/C sa elimini zgmotul introdus de senzor.

Editat de Bandi Szasz
Link spre comentariu

Multumesc.

ADC-ul trebuie sa detecteze intreruperea razei incidente IR pe fotodioda. M-am gandit ca e mai simplu asa, dar sunt deschis si la alte sugestii...

 

LE : Am gasit o schema cu op-amp, dedicata scopului ...

 

MCP6001.jpg

Editat de fratello
Link spre comentariu

Daca esti dispus la alte circuite hai sa o luam pas cu pas:

 

   1. Pentru alimentare ce folosesti si cam ce durata de viata ti-ar placea sa obtii ? 

   2. Pragul de detectie este fixa ? (din cod vad ca comaparai cu 600 adc),  pentru nu cred ca merita pus PIC doar pentru ADC cu prag fix cel putin nu daca vrei sa obtii un consum cat de mic.

  

Schema gasita pare ok, se pot face diferite inbunatatiri, MCP6001 are consum de 100uA pe cand un AZV331 are consum de 40uA (cu 50% mai mic).  AZV331 are un Input Bias Current de 10nA pe cand tu pe acel potentiometru de 10k la o alimentare de 5V risipesti 0.5mA deci ai putea schimba acel potentiometru cu unu-l mult mai mare pentru a reduce cat mai mult pierderile.

  

 

Editat de Bandi Szasz
Link spre comentariu

Multumesc mult pentru suport !!!

1. Alimentare : 4,5 sau 6 volti, din baterii alcaline. Pot folosi doar 3 baterii, pentru a ma incadra in tensiunea acceptata de AZW331. AZW331 e perfect, vad ca e  disponibil la tme. Pot folosi schema din catalog ?

2. Pragul de detectie ... este necunoscut : voi folosi hardware-ul existent in actualul dozator ( emitator/receptor IR). 

IMPORTANT ! Din cauza configuratiei existente, actionarea pompei trebuie sa se faca LA INTRERUPEREA razei IR incidenta pe senzor.

 

Scuze ca deviem de la caracterul topicului ... daca se considera necesar, se poate muta topicul. Multumesc.

AZV331.jpg

Editat de fratello
Link spre comentariu

Interesant subiectul, mai ales ca am si eu un dozator care nu mai functioneaza. Astept cu nerabdare rezultatul final.

Fratello, ai ridicat schema electronica? Te-ai lamurit ce este integratul SO-8, ca eu nu am reusit (ar trebui sa-l dezlipesc, insa nu am timp de niciun fel)

Editat de nico_2010
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