2017-02-24 3 views
1

J'utilise un microcontrôleur dans Proteus avec son ADC intégré (sortie 10 bits) et un écran LCD, mais lors de l'entrée d'un signal de 5V, il affichera seulement jusqu'à 4092mV, même si l'écran LCD est parfaitement bien parce que j'ai essayé de sortir d'autres caractères.ADC_READ pas maxi

Voici le code et une image de Proteus.

int tension; 
int valeurnum; 
char valeurchar[10]; 

void main() { 
    ADCON1=14; 
    TRISA=1;TRISB=0; 
    Lcd_Init(); 
    while(1){ 
      tension=ADC_Read(0); 
      valeurnum=(5000/1023)*tension; 
      Lcd_Cmd(_LCD_CLEAR); 
      Lcd_Cmd(_LCD_CURSOR_OFF); 
      IntToStr(valeurnum,valeurchar); 
      Lcd_Out(1,1,valeurchar); 
      delay_ms(1000);; 
      } 
} 

Si vous les gars HAV une idée sur ce que je pouvais faire ou vérifier, ou si vous avez besoin de plus d'infos, s'il vous plaît me dire, merci beaucoup à l'avance et bonne journée!

Proteus Layout

+1

Ceci est probablement un problème avec votre électronique, peut-être la tension de référence pour l'ADC est pas assez bon – Ctx

+0

bizarre parce que 5 V va dans le potentiomètre (et désolé pour beeing un débutant) –

+0

Etes-vous sûr la formule de conversion est correct ('valeurnum = (5000/1023) * tension;')? –

Répondre

2

Apparemment, je fait une erreur avec des formules, je perdais trop de précision avec le nombre lui-même lors de la division.

float valeurnum; 
char valeurchar[20]; 
void main() { 
    ADCON1=14; 
    TRISA=1;TRISB=0; 
    Lcd_Init(); 
    while(1){ 
      valeurnum=ADC_Read(0); 
      valeurnum=valeurnum*5000; 
      valeurnum=valeurnum/1024; 
      Lcd_Cmd(_LCD_CLEAR); 
      Lcd_Cmd(_LCD_CURSOR_OFF); 
      FloatToStr(valeurnum,valeurchar); 
      Lcd_Out(1,1,valeurchar); 
      delay_ms(1000);; 
      } 
} 
+2

Vous pouvez écrire ceci dans une seule ligne 'valeurnum = (ADC_Read (0) * 5000)/1024);' –