Vai al contenuto
PLC Forum


Pwm Con 16f84


Omarro

Messaggi consigliati

Salve,

devo generare un segnale pwm con il pic 16f84 con quarzo 4mhz e frequenza del pwm 1khz, ma sinceramente non ho idea di come fare, potete darmi qualche suggerimento??

grazie

Link al commento
Condividi su altri siti


Giorgio Demurtas

quanti passi vuoi? cioè tra 0% e 100% di d.c. quanti intervalli vuoi?

Ci sono dei pic che hanno il PWM integrato, ma comunque si può sempre implementare da zero su un piedino qualunque.

ciao

Link al commento
Condividi su altri siti

ciao,

non sono un grande esperto comunque il 16f84 non ha la gestione interna del pwm quindi devi

simularla attivando e disattivando un uscita del pic con la frequenza che vuoi tu

Non so cosa ci devi fare comunque questa soluzione non è molto raccomandata se la frequenza deve essere precisa,

in alternativa potresti utilizzare un 16f877 che ha la gestione interna del pwm

costa di più ma se ti serve un frequenza precisa in questo modo stai tranquillo.

ps. Correggetemi se ho detto qualche cavolata

ciao ciao

Link al commento
Condividi su altri siti

fino a qui ci sono però la frequenza non so come gestirla, più che altro il duty cycle

per es con freq 1khz

il duty cycle del 6 % dovrei fare un ritardo di 60 microsec

e poi altro ritardo di 940 microsec il che non so come fare...

Link al commento
Condividi su altri siti

cavoli tuoi !!!!!!!

scherzo ovviamente solo che non posso esserti di aiuto

a me non mi obbliga nessuno !!!! eh eh !!!

comunque è meglio così con l'assembler ai una precisione doc e soprattutto cosa da non sottovalutare le dimensioni dell'hex sono ridottissime.

ciao e ... in bocca al lupo

Link al commento
Condividi su altri siti

Con questo codice dovresti avere un ritardo esatto di 60 ms con un quarzo a 4mhz


PDelay  movlw     .66      
        movwf     PDel0    
PLoop1  movlw     .181    
        movwf     PDel1    
PLoop2  clrwdt              
        clrwdt            
        decfsz    PDel1, 1 
        goto      PLoop2    
        decfsz    PDel0, 1
        goto      PLoop1    
        clrwdt              
        return    
con quest'altro invece 940ms sempre a 4mhz di clk
PDelay  movlw     .251     
        movwf     PDel0     
PLoop0  movlw     .29       
        movwf     PDel1    
PLoop1  movlw     .25      
        movwf     PDel2    
PLoop2  clrwdt             
        clrwdt             
        decfsz    PDel2, 1  
        goto      PLoop2    
        decfsz    PDel1,  1 
        goto      PLoop1    
        decfsz    PDel0,  1 
        goto      PLoop0    
        return              

Per il resto se è per scuola bisogna che un attimino ti dai da fare...

A meno che non ti pigli voglia di sfruttare gli interrrupt del tmr0 (scelta molto + elegante e hi tech dal mio punto di vista) puoi provare con queste temporizzazioni...

A proposito, ricorda che questi codici danno il tempo di delay esatto comprensivi di istruzione call e return, quindi devi sempre e comunque considerare in aggiunta o in sottrazione i cicli macchina di tutte le altre operazioni che svolgi per alzare e abbassare l'uscita del processore!!

Buon divertimento.

Modificato: da Niki77
Link al commento
Condividi su altri siti

non vorrei si faccia confusione, io so programmare ma mancava l'idea di come fare comunque...

ho fatto questo con il TMR0

main

BSF PORTA,4

movlw 6

movwf dutycycle

call Delay

BCF PORTA,4

movlw 94

movwf dutycycle

call Delay

goto main

il delay

Delay

movlw 251

movwf TMR0

DelayLoop

movf TMR0,W

btfss STATUS,Z

goto DelayLoop

movlw 251

movwf TMR0

decfsz dutycycle,1

goto DelayLoop

return

il problema è che quando misuro con il tester l'uscita da PORTA.4 misuro una tensione non consona a 6% di duty cycle molto strano poiche questo ciclo sovrebbe fare un ritardo da 10 microsecondi per il numero messo in DUTYCYLE con un freq di 1khz il 6% di 5 volt è 300mV invece misuro 800mV il 16% il che è molto strano...

invece in secondo programma da me svolto in C, sostanzialmente ho riportato da assembler in C il ritardo è di una precisione "micidiale" come mai?

ahh dimenticavo il prescaler a un divisore impostato a 2

Grazie

Link al commento
Condividi su altri siti

OK RISOLTO sono Uno SCEMO!!! :D

siccome a casa ero sprovvisto di 16f84 ho provato con il 16f876a il problema che il registro dutycycle lo avevo messo a 0x10 di memoria ma purtroppo il 16f876a a quell'allocazione non ha RAM libera ma altri registri...

adesso ho cabiato e funzia.

GRAZIE lo stesso per l'aiuto

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...