Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Due PWM con 16F877

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Due PWM con 16F877

Messaggioda Foto UtenteLucaScia » 16 mar 2011, 18:41

Salve a tutti, Piacere Luca.
Ho un piccolo problema riguardo l'uso di due PWM differenti sul PIC 16F877.
Dunque credo sia la sezione migliore poiché reputo un errore nel codice, ma non mancherò di postare lo schema se richiesto, per certezza!
Vorrei (come esercizio basilare prima di usarlo in altro) gestire la luminosità di due led collegati a due generici pin in uscita del PIC, con due segnali PWM separati controllati da due potenziometri separati.
Ecco qui il codice:
Codice: Seleziona tutto
/*
* programma per generare il PWM e regolare
* il Duty Cycle con un potenziometro
*/
#include <PIC.h>
#include <stdio.h>
#include "delay.c"
int main(void)
{
     short ang, ang1;

      TRISB=0; //PORTB tutte uscite
      TRISC=0; //PORTC tutte uscite

      T2CON=4; //Timer2 acceso con prescaler a 1
      CCP1CON=12; //Modulo CCP1 settato in modalita' PWM
     CCP2CON=12; //Modulo CCP2 settato in modalita' PWM
      PR2=0xfe; //Step massimo del duty cycle (e frequenza)

     ADCON0 = 0b11000001; //attiva porte analogiche
     ADCON1= 0b10000000;

     while(1)
    {
      CHS0=0; // seleziona la porta da leggere (RA0) 
      DelayUs(10); //ritardo per il cambio porta analogica      
      ADGO = 1; //Fa partire la conversione
      while(ADGO)
      continue; //Attende che la conversione sia completa
      ang = ADRESL+(ADRESH<<8); // risultato a 10 bit
      CCPR1L=ang/4;  //duty cycle CCP1

      CHS0=1; //seleziona la porta da leggere (RA1)
      DelayUs(10); //ritardo per il cambio porta analogica
      ADGO = 1; //Fa partire la conversione
      while(ADGO)
      continue; //Attende che la conversione sia completa
      ang1 = ADRESL+(ADRESH<<8); // risultato a 10 bit
      CCPR2L=ang1/4; //duty cycle CCP2
     }
}

Il PIC comanda entrambe le uscite PWM indifferentemente dal potenziometro utilizzato, dunque ogni potenziometro ha influenza su entrambi i pin dedicati al PWM (ovvero CCP1 e CCP2) il che non dovrebbe accadere poiché dovrebbero essere indipendenti!.
Grazie a tutti!
Avatar utente
Foto UtenteLucaScia
10 1 2
 
Messaggi: 34
Iscritto il: 26 ott 2010, 13:32

0
voti

[2] Re: Due PWM con 16F877

Messaggioda Foto UtenteCandy » 16 mar 2011, 21:54

Basta un ritardo di 10 us per caricare il condesatore interno al convertitore e leggere qundi correttamente l'analogica switchata ?
Probabilmente no e, se non ci sono altri errori che così ad un primo sguardo non vedo, ti suggerirei di non convertire nulla se non dopo almeno 1 ms dalla commutazione del canale analogico.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10125
Iscritto il: 14 giu 2010, 22:54

0
voti

[3] Re: Due PWM con 16F877

Messaggioda Foto UtenteLucaScia » 17 mar 2011, 11:20

Ottima idea! Provo e vi faccio sapere :D
Grazie !
Avatar utente
Foto UtenteLucaScia
10 1 2
 
Messaggi: 34
Iscritto il: 26 ott 2010, 13:32

0
voti

[4] Re: Due PWM con 16F877

Messaggioda Foto UtenteLucaScia » 17 mar 2011, 18:47

Niente da fare, anche se ho letto in giro che 20us vanno bene per la carica del condensatore
Avatar utente
Foto UtenteLucaScia
10 1 2
 
Messaggi: 34
Iscritto il: 26 ott 2010, 13:32

0
voti

[5] Re: Due PWM con 16F877

Messaggioda Foto UtenteTardoFreak » 17 mar 2011, 19:42

A questo punto l' unica cosa da fare e' separare i due problemi quindi:
- Prima verifichi il PWM mettendoci valori fissi e verificando che funzioni come si deve.
- Poi verifichi la conversione A/D.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,8k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[6] Re: Due PWM con 16F877

Messaggioda Foto UtenteCandy » 17 mar 2011, 19:57

Ed inoltre:
- che compilatore usi ? E con che impostazioni ?
- Sicuro che la dichiarazione
Codice: Seleziona tutto
short ang, ang1;
corrisponda a degli interi ?

Se non ci salti fuori come ti ha suggerito TF, più tardo provo a controllare bene.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10125
Iscritto il: 14 giu 2010, 22:54

0
voti

[7] Re: Due PWM con 16F877

Messaggioda Foto UtenteLucaScia » 17 mar 2011, 20:33

Dunque ho anche provato a compilare con ang e ang1 come INT ma non va ugualmente...
Seguendo le indicazioni di TardoFreak ho provato i due PWM separatamente impostando due valori fissi, e testando su due led diversi i due PWM funzionano correttamente dato che i led hanno luminosità differenti!
Insomma questi li escludo dal problema...vedo ora di invertare qualcosa per testare due A/D separati...qualche consiglio semplice?
Grazie ; :ok:
Avatar utente
Foto UtenteLucaScia
10 1 2
 
Messaggi: 34
Iscritto il: 26 ott 2010, 13:32

0
voti

[8] Re: Due PWM con 16F877

Messaggioda Foto UtentePaolino » 17 mar 2011, 21:48

LucaScia ha scritto:...vedo ora di invertare qualcosa per testare due A/D separati...qualche consiglio semplice?
Grazie ; :ok:

Ci provo ;-)
- Articolo sulla conversione A/D
- Articolo sulla generazione dei segnali PWM

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[9] Re: Due PWM con 16F877

Messaggioda Foto UtenteLucaScia » 17 mar 2011, 22:40

Grazie Paolino per il link!
Comunque avevo già provato semplicemente con dei led e anche i due A/D separati funzionano correttamente e separatamente...Il che ci dice che anche i collegamenti sono giusti.
Bene :shock:
Qualcuno ha altre idee del perché sto discorso non funziona con i due PWM regolati da due potenziometri??
Comunque grazie siete stati gentilissimi :ok:

Ps Avevo già letto prima quei due tutorial ;-)
Avatar utente
Foto UtenteLucaScia
10 1 2
 
Messaggi: 34
Iscritto il: 26 ott 2010, 13:32

0
voti

[10] Re: Due PWM con 16F877

Messaggioda Foto UtenteCandy » 17 mar 2011, 22:46

Nella conversione A/D c'è di mezzo anche la frequenza del quarzo, e la regolazione del convertitore; la tensione di riferimento, che nel tuo caso dovrebbe essere interna.

Posta il programma completo, lo schema, e, sopratutto, che compilatore usi ?

Sei certo che la conversione A/D funzioni bene ? Come lo hai verificato ?
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10125
Iscritto il: 14 giu 2010, 22:54

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti