2016-11-21 2 views
0

LCD에 부동 소수점 숫자를 표시하려면 어떻게해야합니까?LCD에 부동 소수점 숫자 표시

LCD에는 끝에 E가있는 소수점이 많은 부동 소수점 값만 표시됩니다. 소수점 2 자리 만 필요하므로 어떻게 표시합니까?

int main (void){ 

    adcinit(); 

    lcd_init();//initializes LCD 
    lcd_clear();//clear screen 
    lcd_home(); 


    uint16_t value; 
    float volts; 
    while(1){ 
     ADCSRA |= (1<<ADSC);//start ADC conversion 
     delay_ms(54);//delay 54 millisecond 
     value = ADCW;//assign ADC conversion to value 
     volts=(value*5)/1023; 
     lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display 
     lcd_printf("ADC Value: %d ",value);//display on LCD 
     lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display 
     lcd_printf("Volts: %f ",volts);//display on LCD 
    } 
} 
+0

무엇이 표시됩니까? – immibis

+2

여기에 문제가 있습니다.'volts = (value * 5)/1023'입니다. 이들 모두는 정수이므로 계산 결과는 정수입니다. 이것은 아마도 당신이 원하는 것이 아닙니다. 'volts = (value * 5f)/1023f'를 사용해보십시오. – msandiford

+0

밀리 볼트를 표시하는 것을 고려해보십시오. '부호없는 볼트 = (값 * 5000L + 1024/2/*이 값을 반올림 * /)/1024;'로 지정하고 FP 연산을 피하십시오. – chux

답변

0

, 포맷 지시자 '%f'에도 잘 관리하지 않는다.

1 단계 : 대체 솔루션을 제안하기 전에 아날로그 - 디지털 변환기에서 읽은 숫자 값에서 잘 계산 된 부동 소수점 값을 가져와야합니다. ADC의 가 10 비트 인 경우

의 범위는 1,024 (1023 대신)이어야한다.

value = ADCW;//assign ADC conversion to value 
volts=((float)value*5.0f)/(1024.0f); 

Step2.1 : 1 및 빠른 해결책은 2 고정 소수점 부동 소수점 값이 정수 2로 변환하는 표시. 대신

lcd_printf("Volts: %.2f ",volts);//display on LCD 

단계 2.2

lcd_printf("Volts: %d.%02d ",(int)volts, (int)(volts*100)%100));//display on LCD 

: 2 진수 고정 부동 소수점 값을 표시하기 위해 더 많은 '공식'용액 "Arduino sprintf float not formatting" 제안 같이 dtostrf() 함수를 사용하는 것이다. 하지 제목 - 대신

lcd_printf("Volts: %.2f ",volts);//display on LCD 
0

이 시도 :

편집 : 값이 INT 이었기 때문에 난 그냥, 전압의 표시 편집. 그러나 프린시 페는 동일 할 것입니다. 함수가 lcd_printf()의 Arduino하는 기능 sprintf() 같 라이브러리에 기반하면 '%.2f'로서 사용될 때

int main (void){ 

    adcinit(); 

    lcd_init();//initializes LCD 
    lcd_clear();//clear screen 
    lcd_home(); 


    uint16_t value; 
    float volts; 
    while(1){ 
     ADCSRA |= (1<<ADSC);//start ADC conversion 
     delay_ms(54);//delay 54 millisecond 
     value = ADCW;//assign ADC conversion to value 
     volts=(float)(value*5)/1023; 
     lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display 
     lcd_printf("ADC Value: %d ",value);//display on LCD 
     lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display 
     lcd_printf("Volts: %.2f ",volts);//display on LCD 
    } 
} 
+1

캐스팅이 잘못되었거나 적어도이 코드를 읽는 누군가에게 명확하지 않습니다. Typical은 volts = (value * 5.0)/1023입니다. (여기에 대해서는 1023에 대해 논하지 않음) –

+0

캐스트는 부서의 왼쪽에 적용되므로 불필요하게 혼란 스럽긴해도 정확하다고 보입니다. –

1

내가 원래 게시물의 마지막 문장의 질문에 대답 해요의

char str_volts[15]; // to store the float-to-string converted value 
lcd_printf("Volts: %s ",dtostrf(volts, 4, 2, str_volts));//display on LCD 
// 4 = minimum number of char ('X.XX'), 2 = number of decimals 

. 그러나 이것은 귀하의 프로젝트에 대한 올바른 대답입니다.

"나는 소수점 2 자리 만 필요합니다."- 그래서 이것은 부동 소수점 연산이 필요 없다는 것을 말해 줄 것입니다. 물리학 자 및 엔지니어는 매우, 아주 작은 또는 매우 큰 양을 표현하기 위해 수레가 필요하지만 "고정 소수점"이 필요합니다. 이는 정수 수학을 수행하고 단위를 올바르게 선택하는 것을 의미합니다. 고정 소수점은 부동 소수점 코드가 필요 없기 때문에 더 빠르고 정확하며 컴파일 된 바이너리의 크기를 줄입니다.

가장 간단한 해결책은 방금 사용했던 delay() 함수가 초의 정수가 아니라 밀리 초의 인수를 취하는 것과 같은 방식으로 정수를 사용하고 밀리 볼트를 표시하는 것입니다.지금 10 비트 숫자를 곱하고 있기 때문에, mvolts 32 비트 정수인지,

lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10); 

공지 사항, 그런데 :

#define VREF 5000 
uint32_t mvolts; 
. 
. 
mvolts=(value*VREF)>>10; // No floats here... 
lcd_printf("milliVolts: %d",mvolts); // ...and no casts 

당신은 볼트를 표시해야하는 경우는,이 ​​트릭을 수행 5000으로, 16 비트에 맞지 않습니다. 이는 스케일링을 수행하는 동안 값의 정확성을 유지해야하기 때문에 필요합니다. 나는 그것이 올바른 값을 표시하고 싶거나 두 자리 소수점을 표시 할 필요가 없다고 생각할 때 이것이 주제를 벗어나고 있다고 생각하지 않습니다.

조심하지 않으면 컴파일러에서 5000/1024 - 4.8828125 값을 계산 한 다음 소수 부분을 잘라내어 ADC 결과에 4를 곱하는 정수 계산을 수행합니다. 행동, 5000 배를 곱한 다음 2 개의 별도 연산을 나눕니다. 1024가 2 ** 10이므로 오른쪽으로 10 비트 이동하는 것은 1024로 나눈 것과 동일합니다.

마지막으로 ADC에서 1023을 읽는 것은 실제로 5.000 볼트에서 4 개의 유효 숫자를 의미한다고 가정하지 마십시오. 올바른 결과를 얻으려면 #define VREF을 미세 조정하여 테스트 된 전압계에 대해 보정하십시오.

+0

방금 ​​내 대답을 편집 했으므로 플로트가 필요하다고 생각한 이유는 스케일링 요소를 나타내는 것일 수 있습니다. chux와 msandiford는 둘 다 똑같은 문제에 관해 위에 논평했다 - 나는 단지 더 큰 길이의 일을 설명하고있다. –

+0

전압의 센트 만 원한다면'lcd_printf()'가 정확한 결과를 얻기 위해'mvolts % 1000/10'을 호출하면 마지막 표현식을 나눌 수 있습니다. –

+0

Luis : 좋은 경향이 있습니다. 생각해라. –

관련 문제