Sari la conținut
ELFORUM - Forumul electronistilor

Driver MPP cu 5 fire, doar inainte/inapoi


lorik199

Postări Recomandate

  • Răspunsuri 57
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • bogdan_george17

    23

  • francezu

    21

  • lorik199

    4

  • EFTIMIE

    2

Top autori în acest subiect

@bogdan_george17Microcontroler-ul accepta pe intrare o tensiune nu mai mare decat cea de alimentare(5V). Rezitentele R3 si R4 formeaza un divizor rezistiv, ce are rolul de a scala tensiunea ce ajunge la pinul de intrare al pic-ului intr-o plaja convenabila. Dioda Zener, reprezinta o protectie suplimentara, si are rolul de a limita tensiunea in cazul in care aceasta tinde sa creasca peste valoarea Vz=4,7V. Diferenta de tensiune este preluata de R4 in acest caz.

Condensatorul il pun intre pinii 1 si 8 nu? Adica Vss si Vdd.

Corect!
Link spre comentariu

Multumesc inca odata pt explicatiile detaliate. Acum am inteles perfect schema electrica. Poti atasa si fisierul sursa? Prevad ca va trebui sa ii mai modific in MPLAB timpii dupa ce realizez montajul, insa astept sa imi vina piesele.

Link spre comentariu

Codul este scris in mikroBasic Pro :

program tempo_mcc'Declare I/O 'ssymbol trigg_port=GPIO  ' trigger input portsymbol trigg_pin=0      ' trigger input pinsymbol out_A=GPIO.1     ' output Asymbol out_B=GPIO.2     ' output Bdim sw_on_tmr as word   ' switch on timerconst sw_on_dl=3        ' switch on delay  [s]sub procedure Init_Main()' Osccal restore  OSCCAL=OSCCAL  asm     BSF     STATUS,RP0    ; set file register bank to 1     CALL    0x3FF         ; retrieve factory calibration value     MOVWF   OSCCAL        ; update register with factory cal value     BCF     STATUS,RP0    ; set file register bank to 0  end asm  CMCON=7                  ' disable comparator'  ANSEL=0                  ' disable analog inputs  GPIO=0                   ' reset out latches  TRISIO=1                 ' config. I/Oend subsub procedure wait_low()   ' wait input go low    while TRUE          if not(Button(trigg_port,trigg_pin,50,1)) then             break          end if    wendend subsub procedure pulse_outs()    out_A=1    Delay_ms(3000)    out_A=0    Delay_ms(2000)    out_B=1    Delay_ms(3000)    out_B=0end submain:     Init_main()     wait_low()while true      Delay_ms(10)      if trigg_port.trigg_pin=1 then Inc(sw_on_tmr)      else sw_on_tmr=0 end if      if sw_on_tmr=sw_on_dl*100 then pulse_outs()      wait_low() sw_on_tmr=0 end ifwendend.
Iti modific eu timpii daca va fi nevoie.
Link spre comentariu
Vizitator danielo85

Salutare tuturor!Rog cine poate ajuta si pe mine in urmatoarea propunere:am un MPP pe 27.6V pe care vreau sa il comand cu un buton fara retinere in felul urmator:cand apas butonul prima data sa faca o cursa iar cand apas din nou butonul sa faca alta in sens invers.cand vorbesc de cursa inseamna fie una cu capat de linie fie una in care motorul sa se opreasca atunci candceea ce actioneaza opune rezistenta mare (ca geamurile electrice la masina cand ajung la capat).rog cateva idei.multumesc anticipat!motorul este un QH4-4115 de la un printer canon.(n am gasit datasheet pt

Link spre comentariu

Ok. Pai atunci cand imi vin piesele imi fac placuta si testez sa vad cum functioneaza timpii alesi, iar daca va fi nevoie sa ii modific voi lua legatura cu tine.Mii de multumiri.

Link spre comentariu
  • 2 săptămâni mai târziu...
Codul este scris in mikroBasic Pro :

program tempo_mcc'Declare I/O 'ssymbol trigg_port=GPIO  ' trigger input portsymbol trigg_pin=0      ' trigger input pinsymbol out_A=GPIO.1     ' output Asymbol out_B=GPIO.2     ' output Bdim sw_on_tmr as word   ' switch on timerconst sw_on_dl=3        ' switch on delay  [s]sub procedure Init_Main()' Osccal restore  OSCCAL=OSCCAL  asm     BSF     STATUS,RP0    ; set file register bank to 1     CALL    0x3FF         ; retrieve factory calibration value     MOVWF   OSCCAL        ; update register with factory cal value     BCF     STATUS,RP0    ; set file register bank to 0  end asm  CMCON=7                  ' disable comparator'  ANSEL=0                  ' disable analog inputs  GPIO=0                   ' reset out latches  TRISIO=1                 ' config. I/Oend subsub procedure wait_low()   ' wait input go low    while TRUE          if not(Button(trigg_port,trigg_pin,50,1)) then             break          end if    wendend subsub procedure pulse_outs()    out_A=1    Delay_ms(3000)    out_A=0    Delay_ms(2000)    out_B=1    Delay_ms(3000)    out_B=0end submain:     Init_main()     wait_low()while true      Delay_ms(10)      if trigg_port.trigg_pin=1 then Inc(sw_on_tmr)      else sw_on_tmr=0 end if      if sw_on_tmr=sw_on_dl*100 then pulse_outs()      wait_low() sw_on_tmr=0 end ifwendend.
Iti modific eu timpii daca va fi nevoie.

 

Revin. Mi-au venit piesele si am terminat de facut placuta cu montajul. Am atasat o poza cu ceea ce mi-a iesit. Traseul de legatura intre componente l-am facut din cositor pe spatele placutei. Saptamana ce urmeaza trebuie sa fac rost si de programatorul pt PIC de la un coleg sa scriu hex-ul, dupa care montez releele si il testez. Insa inainte de a-l scrie, as dori sa te intreb ceva legat de codul sursa, l-am parcurs si am inteles majoritatea instructiunilor, insa am cateva nelamuriri pe care as dori sa mi le clarifici daca esti amabil.

 

1)Cand ai declarat

symbol trigg_port=GPIO ' trigger input port

symbol trigg_pin=0 ' trigger input pin

nu se putea scrie si simplu

symbol trigger=GPIO.0 ' input trigger

 

2) Trebuie sa fie 2 intrari (portul 0 pt comanda de la switch si portul 3 care e IN by default) si 2 iesiri (portul 1 si 2 corespunzatoare lui out_A si out_B), insa tu ai declarat TRISIO=1 care din cate am citit in datasheetul de la PIC 12F629 face toti pinii input. Nu trebuia scris TRISIO=%100111 sau TRISIO=%100100 ? (ultimii 2 pini pot fi 0 sau 1 caci nu sunt folositi oricum)

 

3) Imi poti explica procedura wait_low()? Am incercat sa o inteleg, insa desi pare simpla, parca ceva e neclar. De ce ai pus if not (button(...,...,50,1))? Nu era echivalent scris if (button(...,...,50,0))?

 

4) Legat de pinul GP3/MCLR, am vazut ca in majoritatea schemelor pe langa alimentarea cu +5V i se inseriaza o rezistenta de 10k, insa in schema actuala nu apare.

 

Multumesc si scuze daca sunt stresant cu atatea intrebari, insa eu cand fac ceva vreau sa si inteleg ce fac.

Link spre comentariu

Salutare!1) Functia "Button" necesita argumente separate pentru port si pt pin, de aceea le-am declarat separat.2) Pinul GP3 este doar intrare ; bit-ul 3 din registrul TRISIO este "read-only' , deci daca se scrie un 0 la locatia respectiva este ignorat.3) este corect si asa:

if (button(...,...,50,0))

probabil din graba am pus dubla negatie.4) Pinul MCLR se leaga printr-o rezistenta( eventual inseriata si cu o dioda) atunci cand se foloseste programarea in circuit ( ICSP), si daca este necesar un reset manual/hardware, altfel se poate lega direct la +5V.
Link spre comentariu

Multumesc inca odata de promptitudine.Legat de punctul 2) intrebarea nu era legata de pinul GP3 ci de ce ai scris TRISIO=1. Declaratia asta nu face toti cei 6 pini input? In conditiile in care pinii GP1 si GP2 sunt output in schema, ar aparea o problema.Iar la punctul 3, procedura wait_low ce face mai precis? Porneste bucla aceea infinita prin care asteapta sa se apese switchul, sau asteapta sa fie released?

Link spre comentariu

TRISIO=1 ( in zecimal ) mai inseamna siTRISIO= 0x01 ( in hexazecimal) sau,TRISIO= %00000001 ( in binar)deci, doar bit-ul 0 este pus in 1 logic, si prin urmare doar pinul GP0 devine intrare; (GP3 este implicit intrare cum am spus mai sus).Procedura wait_low() asteapta eliberarea switch-ului.

Link spre comentariu

am terminat tot montajul azi, am programat si PIC-ul, dupa care l-am bagat in teste. Surpriza, nu functioneaza :jytuiyu Am verificat tot cablajul din nou, am masurat tensiunile totul ok. Intra in placa 12V, iar in uC intra 4.9-5V. Insa nu se intampla nimic pe cele 2 iesiri pe care ar trebui sa imi dea masa temporizat.

Link spre comentariu

Pe cele doua iesiri ale pic-ului ( pinii 5 si 6) trebuie sa ai +5V temporizat, NU masa.

In repaus cele doua iesiri sunt in 0V. Daca se tine apasat butonul de pe intrare peste 3 secunde:

1.pinul 6 comuta in 1 logic ( +5V) , polarizeaza Q2 si anclanseaza releul RL1- motorul se invarte intr-un sens timp de 3 secunde;

2.pinul 6 comuta in 0 logic (0V), se blocheaza Q2, releul declanseaza si motorul se opreste. starea de pauza dureaza 2 secunde;

3.pinul 5 comuta in 1 logic -> analog cu pct.1, motorul se invarte in sens invers timp de 3 secunde;

4.se asteapta eliberarea butonului si ciclul poate fi reluat.

Link spre comentariu

Da, asa ar trebui sa functioneze, insa nu se intampla asa. In repaus are 0.00V, daca ii dau pe intrare 12V mai mult de 3 secunde pe pinii de iesire variaza tensiunea intre 0.00V si 0.01V. Atat.

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