Vai Indietro   PcTuner Forum > Sezione Hardware > Progetti Elettronici
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 29-03-2010, 21.28.15   #1
Registered User
 

Iscritto da: 05-03-2010
Messaggi: 10
Feedback: (0)
utilizzo Pwm del pic

ho cercato in giro e anche sul datasheet ma non sono riuscito a capire molto bene;
è possibile variare il valore del duty cycle alla frequenza del sengale pwm generato!?
esempio:
parto con un segnale con DC=50% e Frequenza= 20Khz
il pwm genera un onda quadra con quelle caratteristiche,
io vorrei che l'onda successiva abbia DC=55% e la stessa frequenza
è possibile fare ciò!?!?
Grazie
Giano.sp Non in Linea   Rispondi Citando
Vecchio 29-03-2010, 21.58.41   #2
RockModerator
 
L'avatar di  RockRibelle
 

Iscritto da: 07-01-2009
Locazione: Lugano
Messaggi: 1,509
Feedback: (0)
Quote:
Originariamente inviato da Giano.sp Visualizza Messaggio
ho cercato in giro e anche sul datasheet ma non sono riuscito a capire molto bene;
è possibile variare il valore del duty cycle alla frequenza del sengale pwm generato!?
esempio:
parto con un segnale con DC=50% e Frequenza= 20Khz
il pwm genera un onda quadra con quelle caratteristiche,
io vorrei che l'onda successiva abbia DC=55% e la stessa frequenza
è possibile fare ciò!?!?
Grazie
Difficile rispondere se non ci dici con che PIC lavori e con quale generatore PWM. Alcuni PIC hanno la possibilità di generare il PWM sia con un modulo dedicato, sia con il modulo comparatore.
__________________
..Indomabile..
RockRibelle Non in Linea   Rispondi Citando
Vecchio 29-03-2010, 23.40.43   #3
Registered User
 

Iscritto da: 05-03-2010
Messaggi: 10
Feedback: (0)
Quote:
Originariamente inviato da RockRibelle Visualizza Messaggio
Difficile rispondere se non ci dici con che PIC lavori e con quale generatore PWM. Alcuni PIC hanno la possibilità di generare il PWM sia con un modulo dedicato, sia con il modulo comparatore.
io sto usando il pic 12f683
ma se esiste un pic cn qalche funzione che mi semplifica la vita cambio subito!!
Giano.sp Non in Linea   Rispondi Citando
Vecchio 30-03-2010, 08.03.40   #4
RockModerator
 
L'avatar di  RockRibelle
 

Iscritto da: 07-01-2009
Locazione: Lugano
Messaggi: 1,509
Feedback: (0)
Quote:
Originariamente inviato da Giano.sp Visualizza Messaggio
io sto usando il pic 12f683
ma se esiste un pic cn qalche funzione che mi semplifica la vita cambio subito!!
Nei PIC tutto é semplice e nulla é semplice, nel senso che se hai un modulo hardware, questo sarà sempre implementato dalla microchip in maniera da offrire il maggior numero di funzioni, ma ovviamente avrai più registri da configurare.
Come indicato nel manuale al capitolo 11
http://ww1.microchip.com/downloads/e...oc/41211D_.pdf
il PIC12F683 ha il modulo Capture/Compare/PWM (CCP) che permette di generare un PWM. Utilizza il Timer2, dunque devi prima programmarre proprio il Timer2 in modo da ottenere i tuoi 20 kHz. Mettiamo per ipotesi che il tuo PIC giri a 8 MHz (oscillatore interno) allora dovrai impostare T2CON a 0x04 (Timer2 On, postscaler 1:1, prescaler 1:1) e PR2 a 0x63 (99 decimale), in questo modo il Timer2 genera una frequenza di 8000000/4/100 = 20000 Hz.
Poi imposti il modulo CCP: registro CCP1CON a 0x0C (PWM mode active high).
Il PWM lo ottieni mettendo in CCPR1H la durata del periodo secondo la formula CCPR1H = Duty cycle * (PR2+1). Visto che PR2 vale 99 allora in CCPR1H metti il tuo valore in %, ad esempio proprio il valore 50.
Per contro non ho capito cosa ti seerve generare un PWM dal momento che, come dici tu, dopo solo un periodo vuoi già cambiare il valore. COmincia con il generare un PWM sul pin CCP1, poi per cambiare quel valore te la caverai in seguito.
La figura 11-3 del manuale ti aiuta a capire come funziona il CCP combinato con il Timer2.
__________________
..Indomabile..
RockRibelle Non in Linea   Rispondi Citando
Vecchio 30-03-2010, 14.40.31   #5
Registered User
 

Iscritto da: 05-03-2010
Messaggi: 10
Feedback: (0)
fin qui bene o male c'ero già arrivato anche grazie a questo :
PIC PWM Calculator & Code Generator
che mi calcola da solo ciò ke dovrò inserire nei registri ma il mio problema era proprio come poter variare il DC,
lo volevo utilizzare come un DAC; per generare ad esempio il più possibile uguale la nota di un pianoforte.
io avevo in mente d prendere la nota LA a 440Hz, moltiplico questo valore per la precisione che voglio ottenere/posso ottenere, ipotizziamo la moltiplico per 32.
ottengo f=14080 (questo valore è la frequenza con cui io darò 32 valori i quali formeranno il periodo della mia nota)
variando il duty cycle ad ogni periodo volevo provare a ricreare la l'onda generata dalla nota LA del pianoforte e per questo motivo avevo bisogno d variare il DC ad ogni impulso...
Non utilizzando il Pwm ho calcolato che non riuscirei a fare lo stesso..o almeno non ho trovato il modo...
anche utilizzando dei delay, sarebbero troppo lunghi per il mio utilizzo...
cmq ti ringrazio per la risposta...già mi hai kiarito l'utilizzo del pwm!
Giano.sp Non in Linea   Rispondi Citando
Vecchio 30-03-2010, 23.30.25   #6
RockModerator
 
L'avatar di  RockRibelle
 

Iscritto da: 07-01-2009
Locazione: Lugano
Messaggi: 1,509
Feedback: (0)
Non mi stancherò mai ri ripetere che quando si pongono delle domande sul forum, sarebbe meglio dare subito tutte le indicazioni di cui si é in possesso, e non aspettare che altri del forum pongano le domande giuste..
Puoi utilizzare l'interrupt generato dal Timer2 per attribuire al registro di duty cycle il nuovo valore secondo una tabella o utilizzando un accumulatore di fase e un table lookup su una tabella contenente un sinus.
__________________
..Indomabile..
RockRibelle Non in Linea   Rispondi Citando
Vecchio 30-03-2010, 23.34.54   #7
Registered User
 

Iscritto da: 05-03-2010
Messaggi: 10
Feedback: (0)
Mmm...scusami ma sono troppo ignorante per capire...
se non ti stai alterando troppo per la mia ignoranza
ce la faresti a spiegarti meglio!?
Ti voglio bene
Giano.sp Non in Linea   Rispondi Citando
Vecchio 11-06-2012, 13.06.59   #8
Registered User
 

Iscritto da: 11-06-2012
Messaggi: 2
Feedback: (0)
Salve, sto lavorando con un PIC16f887. IL mio problema e che devo compilare un programma in ccs che mi generi un segale pwm con una det. frequenza e attraverso il potenziometro sul pic, in base alla tensione (0 - 5 V) variare il duty cycle.
Ho letto di tutto sul pic e come generare il pwm ma ancora nn ci sono riuscito anche se sono consapevole che è una stupidaggine.
la porzione di codice scritta da me è

Main ()
unsigbed int pwm1
setup CCP1 (CCP_PWM)
setup_timer_2( t2_div_by1,49,1)
QUESTE ISTRUZIONI SERVONO PER SETTARE LA PORTA CCP1 E SETTARE IL TIMER DEL PIC PER GENERARE UN PWM CON UN DETERMINATO PR2 .

1 domanda : Bastano per generare il pwm quando collego il pic all'oscilloscopio?

2 domanda : Per far variare il duty cycle attraverso il potenziometro cosa devo fare, che codice devo scrivere????

help me please
POTETE rispondermi anche all' email Amatofabio2006@libero.it
grazie
shinelco Non in Linea   Rispondi Citando
Vecchio 11-06-2012, 14.06.20   #9
Registered User
 

Iscritto da: 05-03-2010
Messaggi: 10
Feedback: (0)
Non conosco il css ma ho le conoscenze sufficienti su pwm e adc:

per il pwm è indispensabile settare pr tmr e ccpxcon e scrivere il valore del DC nel registro ccprxl /h

Per modificare il DC tramite potenziometro devi acquisire il dato analogico dalla porta quindi settando i registri ANSEL ADCON0 ADCON1
e poi copiare il valore letto tramite il registro ADRESH:ADRESL e copiarlo direttamente in CCPRXL:CCPRXH
Giano.sp Non in Linea   Rispondi Citando
Vecchio 11-06-2012, 16.59.01   #10
RsX
IMHO User...
 
L'avatar di  RsX
 

Iscritto da: 14-05-2007
Locazione: Puglia
Messaggi: 2,093
Feedback: (0)
qualcosa di simile
Codice:
setup_adc_ports(AN0);
set_adc_channel(0);
setup_adc(ADC_CLOCK_DIV_32);

while( TRUE ) {
set_pwm1_duty(read_adc());
}
per impostare l'adc leggi il manuale di ccs e poi fai attenzione a convertire il valore 0-255 o 0-1023 dell'adc nei valori accettati dal pwm che non è detto siano 0-1023

da un esempio che ho trovato mi pare di capire che per come hai impostato il pwm
Codice:
setup_timer_2( t2_div_by1,49,1)
i valori sono 0-49, quindi dovrai moltiplicare il valore adc a 10bit per 49/1023

Codice:
set_pwm1_duty((int)((float)read_adc()*0.0479));
__________________
Hell Is Getting Near
E' il tempo che si piega ad ACS-G
AlexTA il "zenio del crimine idraulico"
RsX Non in Linea   Rispondi Citando
Vecchio 03-07-2012, 07.59.50   #11
Registered User
 

Iscritto da: 11-06-2012
Messaggi: 2
Feedback: (0)
Nn ho capito bene come lo devo fare !!!
I registri vanno dichiarati con #include all inizio del programm e poi?
Scusa l ignoranza ma voglio capire meglio
shinelco Non in Linea   Rispondi Citando
Rispondi Per le vostre immagini su questo forum potete usare PcTunerUp!
Iscriviti gratuitamente alla nostra newsletter.


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 
Strumenti Discussione
Modalità Visualizzazione

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +2. Attualmente sono le 23.25.33.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright © 2010 - Master New Media S.r.l. a socio unico - P.I. 02947530784. Tutti i diritti di proprietà letteraria e artistica sono riservati- Privacy
www.pctuner.net è testata telematica registrata presso il Tribunale di Torino, n. 39 del 07.05.2008, Editore Master New Media S.r.l.