Pagina 1 di 3

Due PWM con 16F877

MessaggioInviato: 16 mar 2011, 18:41
da LucaScia
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!

Re: Due PWM con 16F877

MessaggioInviato: 16 mar 2011, 21:54
da Candy
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.

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 11:20
da LucaScia
Ottima idea! Provo e vi faccio sapere :D
Grazie !

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 18:47
da LucaScia
Niente da fare, anche se ho letto in giro che 20us vanno bene per la carica del condensatore

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 19:42
da TardoFreak
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.

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 19:57
da Candy
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.

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 20:33
da LucaScia
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:

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 21:48
da Paolino
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.

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 22:40
da LucaScia
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 ;-)

Re: Due PWM con 16F877

MessaggioInviato: 17 mar 2011, 22:46
da Candy
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 ?