Sari la conținut
ELFORUM - Forumul electronistilor

Control PWM via uart(LabView)


Postări Recomandate

Buna dimineata, ma chinui de cateva zile sa programez un pic16f876a sa primeasca date din labview(numere) si sa seteze pwm cu ele. Din LAbview trimit un numar si un carriere return(CR) ca sa sincronizez, am vazut pe serial cu hyperterminal ca trimite bine datele, dar nu reusesc sa programez in mikroC sa interpretez, am incercat sa afisez pe LCD ceea ce primesc, si am observat ca se incurca intre ele cifrele(cifra zecilor cu cifra sutelor etc etc).

char dist[] = "000.0"; int i;unsigned short current_duty1,current_duty2;void main() {          UART1_Init(9600);                       // Initialize USART module (8 bit, 38400 baud rate, no parity)           Delay_ms(300);         INTCON = 0;           //DEZACTIVARE INTRRUPERI         TRISA= 0xFF;         //PORTUL A CA INTRARE ANALOG         TRISB.F0=0;       //CONTROL         TRISB.F1=0;       //CONTROL         TRISB.F2=0;       //CONTROL         TRISB.F3=0;       //CONTROL         TRISC.F5=0;       //LED         TRISC.F4=0;      //LED         TRISC.F3=0;     //BUZZER                  PORTB.F0=0;         PORTB.F1=0;         PORTB.F2=0;         PORTB.F3=0;         PORTC.F4=0;         PORTC.F5=0;         PORTC.F3=0;         PWM1_Init(10000);         current_duty1 = 0;         PWM1_Start();         PWM1_Set_Duty(current_duty1);         PWM1_Init(10000);         current_duty2 = 0;         PWM2_Start();         PWM2_Set_Duty(current_duty2);    while (1) {    PORTB.F2=1;           if(UART1_Data_Ready()) //if data ready   {     if(UART1_Read() == 0x0D) //check for new line character     {       for(i=0;i<3;)       {         if(UART1_Data_Ready()) // if data ready         {           dist[i] = UART1_Read();  // read data                      i++;         }       }     }   }        current_duty1 = dist;  PWM1_Set_Duty(current_duty1);         }}
In limbajul arduino este o functie care seteaza limitele unei valori ca sa nu aiba valori peste maximul admis se numeste constrain http://arduino.cc/en/reference/constrain, cum se poate implementa o asfel de functie si in mikroC?

Sarbatori fericite si multumesc!

Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Functia Constrain

sub procedure Constrain(x, a, b as byte/word)    a = 10    b = 100    if x < a then       x = a    end if    if (x >= a) and (x <= b) then       x = x    end if    if x > b then       x = b    end ifend sub

Dupa fiecare citire a lui x, apelezi Constrain() si apoi x va fi limitat intre valorile necesare. Altfel, faci o interpolare liniara http://en.wikipedia.org/wiki/Linear_interpolation. Functia creata Constrain nu este liniara, dar poate nu ai nevoie de liniaritate.

 

Cu comunicatia UART nu stiu ce sa zic.

Link spre comentariu

Intradevar, compilatorul nu intelege de ce vrei sa pui un string (text) intr-o variabila short (int), dar va face implicit conversia. Ca este urat sau nu, este uneori util ca sa nu-ti dea erori de compilare, ci doar "warning-uri" ca ai o conversie implicita si apoi iti modifici tipurile in consecinta.Oricum, un char sau un short nu pot fi date "cu virgula". Ele au valori intregi intre 0 si 255.

Link spre comentariu

Compilatorul o sa inteleaga ca vrei sa scrii adresa continuta de dist in current_duty1(pointer catre char intr-un short int).Si chiar daca adresa ar incapea in curent_duty1 tot ar fi aberant :).Corect ar fi sa trimita un singur octet care sa contina valoarea impusa sau daca se vrea mai complicat se poate trimite un sir de caractere, dar in cazul asta trebuie facuta conversia valorii adica o functie apelata cu sirul de caracter care returneaza o valoare de tipul dorit(int,float...) nu un cast.

Link spre comentariu

Buna ziua, si La multi ani, tocmai ce am revenit din vacanta si m-am si apucat de treaba astazi, am citit comentariile voastre si va multumesc, am incercat altfel sa modific turatia cu Labview, in sensul ca am selectat 10 trepte de viteza(pas de 25 la pwm pe 8 biti-255 valori), astfel cand trimit o litera pe serial din Labview el imi seteaza automat o variabila virtuala cu o valoare multiplu de 25. functionea perfect codul, schimb si sensul, si frana etc, acum urmeaza sa implementez si funtiile de monitorizare parametri.

thunderer multumesc de functie, nici nu ai idee cat am cautat o astfel de secventa, ca de obicei cand dau de greu in programare ma scapi. Acesta este codul actual, fara parametri urmeaza sa implementez si asta. O zi frumoasa.

unsigned short current_duty1,current_duty2; unsigned char uart_rd; int val; void frana(){    current_duty1=255;    PWM1_Set_Duty(current_duty1);    current_duty2 = 255;    PWM2_Set_Duty(current_duty2);    PORTB.F2=0;    PORTB.F3=0;    PORTC.F4=1;      //LED    PORTC.F5=1;       //LED }  void stanga(){    PORTB.F2=1;    PORTB.F3=0;    PORTC.F4=1;      //LED    PORTC.F5=0;       //LED    PORTB.F5=1;    PORTB.F6=0;  }  void dreapta(){    PORTB.F2=0;    PORTB.F3=1;    PORTC.F5=1;       //LED    PORTC.F4=0;      //LED    PORTB.F5=0;    PORTB.F6=1;  }void main() {          UART1_Init(9600);                       // Initialize USART module (8 bit, 38400 baud rate, no parity)           Delay_ms(300);         INTCON = 0;           //DEZACTIVARE INTRRUPERI         TRISA= 0xFF;         //PORTUL A CA INTRARE ANALOG         TRISB.F2=0;       //CONTROL  High side         TRISB.F3=0;       //CONTROL  High side         TRISC.F5=0;       //LED         TRISC.F4=0;      //LED         TRISC.F3=0;     //BUZZER         TRISB.F5=0;     // PORT VIRTUAL         TRISB.F6=0;     // PORT VIRTUAL         PORTB.F0=0;         PORTB.F1=0;         PORTB.F2=0;         PORTB.F3=0;         PORTC.F4=0;         PORTC.F5=0;         PORTC.F3=0;         PORTB.F5=0;         PORTB.F6=0;         PWM1_Init(10000);         current_duty1 = 0;         PWM1_Start();         PWM1_Set_Duty(current_duty1);         PWM1_Init(10000);         current_duty2 = 0;         PWM2_Start();         PWM2_Set_Duty(current_duty2);  while (1) {         if (UART1_Data_Ready()) {     // If data is received,      uart_rd = UART1_Read();     // read the received data,      if (uart_rd==0x41)     //A         val=25;       if (uart_rd==0x42)   //B          val=50;        if (uart_rd==0x43)    //C        val=75;        if (uart_rd==0x44)      //D         val=100;        if (uart_rd==0x45)         //E         val=125;         if (uart_rd==0x46)         //F         val=150;         if (uart_rd==0x47)           //G            val=175;         if (uart_rd==0x48)          //H           val=200;         if (uart_rd==0x49)           //I           val=225;          if (uart_rd==0x4A)            //J           val=255;         if (uart_rd==0x4D)            //M            dreapta();         if (uart_rd==0x4E)            //N            stanga();         if (uart_rd==0x4F)            //O            frana();  }      if(PORTB.F5 == 1) {      current_duty1=val;    PWM1_Set_Duty(current_duty1);    current_duty2 = 0;    PWM2_Set_Duty(current_duty2);    }  else{  current_duty1=0;    PWM1_Set_Duty(current_duty1);        }        if(PORTB.F6 == 1) {      current_duty1=0;    PWM1_Set_Duty(current_duty1);    current_duty2 = val;    PWM2_Set_Duty(current_duty2);    }  else{  current_duty2=0;    PWM2_Set_Duty(current_duty2);       }  delay_ms(100);} }
Link spre comentariu

Liviu, evident nu au ce cauta in functie, ai dreptate :da . Trebuie pusi in programul principal la initializare, in afara oricarei bucle.Am scris repede acea functie, dar n-as folosi-o decat daca n-as avea memorie program. Altfel, o interpolare are face functia ceruta mai bine.

Link spre comentariu

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



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări