Sari la conținut

Control intensitate LED folosind potentiometru


Postări Recomandate

Salut,

 

Incerc sa citesc valoarea unui potentiometru si sa o folosesc intr-un PWM ca sa reglez intensitatea luminoasa a unui LED, dar ceva nu functioneaza...

Stiu ca valoarea citita de potentiometru ia valori intre 0 si 1023, iar valoarea lui Duty al PWM-ului este intre 0 si 255, am incercat sa impart la 4 valoarea citita din potentiometru dar tot nu functioneaza. HELP !!!

 

Multumesc anticipat !

 

Codul este:

 

unsigned int valPot; //variabila care "citeste" potentiometrul
void main() {
 TRISA.F0 = 1; //intrare analog potentiometru
 TRISC.F2 = 0; //iesire LED
 PWM1_Init(500); //initializare PWM la 5Hz
 PWM1_Start();  //star PWM
 while(1){
  valPot = ADC_Read(0); //Analog/Digital Converter
  PWM1_Set_Duty(valPot);
}
}
Link spre post
Distribuie pe alte site-uri

In primul rand as dori sa va spun ca nu m-am axat pe PIC-uri, ci pe microcontrolere AVR si ceva ARM-uri STM. Deci, nu prea sunt familiarizat cu programul microC for PIC, dar cred ca veti putea face usor o analogie, avand in vedere ca ceea ce voi prezenta mai jos este compatibil cu microC for AVR iar diferenta dintre soft-uri nu este foarte mare.

Asa cum ati scris codul de mai sus, variabila valPot va citi valori mai mari de 255, ceea ce nu este bine, deoarece nu va fi corect intelese de rutina PWM1_Set_Duty.

In al doilea rand, codul prezentat de dvs. are mai multe lacune.

 

O posibila solutie sau rezolvare ar arata asa:

 

char PWM_duty;
unsigned int i;
unsigned long adc;
 
void main() {
 
DDB2_bit = 0;  // Setez PORTB pin 2 ca intrare ADC - verificati daca portul PB2 este intrare ADC - MCU.
 
PWM_duty = 127;  // valoarea initiala a factorului de umplere PWM - ajustati aceasta valoare daca led-ul doriti sa fie aprins mai mult sau mai putin - depinde foarte mult de tipul de tranzistor de c-da LED folosit
 
DDB0_bit = 1;  // Setez PORTB pin 0 ca iesire PWM pentru control LED printr-un tranzistor (depinde de puterea LED-ului) - verificati daca PB0 poate fi iesire PWM
  
PWM1_Init(_PWM1_FAST_MODE, _PWM1_PRESCALER_8, _PWM1_NON_INVERTED, PWM_duty);  // initializeaza PWM
 
ADC_Init();    // Initializeaza ADC
 
i = 0; adc = 0;  // reseteaza variabilele
 
do  {
      //aplicam un mic oversampling pentru o mai buna rezolutie de masura cu atat mai mult cu cat domeniul de reglaj PWM a luminozitatii LED-ului, daca vom folosi un tranzistor extern, se rezuma la o parte din domeniul de variabile: 0...255;
      
      adc = 0;
      for(i=0;i
                           {
                           adc = adc + ADC_read(1); // citeste si aduna de 256 ori valoarea adc de la canalul 1 adc
                           }
      adc = adc / 16;
      if(adc > 16431)  adc = 16431; // anuleaza "overflow"
 
   // Regleaza factorul de umplere PWM pe led
 
      if (adc++) {    // detecteaza daca valoarea adc creste
      Delay_ms(40);                             
      PWM_duty--;                           
      PWM1_Set_Duty(PWM_duty);               
       }
       else
               if (adc--) {   // detecteaza daca valoarea adc scade
                   Delay_ms(40);                           
                   PWM_duty++;                         
                   PWM1_Set_Duty(PWM_duty);             
                   }
 
   // Asteapta
    Delay_ms(200);
 
  } while(1);
 
}
 

Mai ramane sa transpuneti codul in microC for PIC, facand ajustarile necesare.

 

Numai bine

Link spre post
Distribuie pe alte site-uri
  • 3 weeks later...

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
  • Navigare recentă   0 membri

    Nici un utilizator înregistrat nu vede această pagină.



×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock