我如何获得变量,伏特,以显示浮点数字的液晶显示器?
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
}
}发布于 2016-11-21 12:51:15
如果函数lcd_printf()基于与Arduino的函数sprintf()相同的库,格式说明符'%f'即使用作'%.2f'也不能很好地管理。
步骤1:在提出替代解决方案之前,有必要从从模拟到数字转换器读取的数值中得到计算良好的浮点值。
如果模数转换器是10位,范围应该是1024 (而不是1023).
value = ADCW;//assign ADC conversion to value
volts=((float)value*5.0f)/(1024.0f); 步骤2.1:首先快速显示2小数固定浮点值的解决方案是将其转换成2个整数。
lcd_printf("Volts: %d.%02d ",(int)volts, (int)(volts*100)%100));//display on LCD而不是
lcd_printf("Volts: %.2f ",volts);//display on LCD步骤2.2:显示2-小数固定浮点值的更正式的解决方案是使用"Arduino sprintf float not formatting"中提出的dtostrf()函数。
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而不是
lcd_printf("Volts: %.2f ",volts);//display on LCD发布于 2016-11-22 14:44:57
我是在回答原文最后一句的问题,而不是标题。但这是你的项目的正确答案。
你说“我只需要小数点2位”,所以这应该告诉你,没有浮点数数学的必要。物理学家和工程师需要浮子来表示非常、非常小或非常大的数量,但你需要“定点”--这意味着进行整数运算并正确选择单元。定点更快、更准确,并且减少了编译的二进制文件的大小,因为不需要浮点代码。
最简单的解决方案是使用整数和显示毫伏,就像刚才使用的delay()函数使用整数毫秒数的参数,而不是秒的小数数一样。
#define VREF 5000
uint32_t mvolts;
.
.
mvolts=(value*VREF)>>10; // No floats here...
lcd_printf("milliVolts: %d",mvolts); // ...and no casts如果您必须显示伏特,那么这就实现了这样的功能:
lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10);请注意,顺便说一句,mvolt是一个32位整数,因为您现在正在将10位数乘以5000,这将不适合16位。这是需要的,因为您需要在进行缩放时保持值的准确性。我不认为这将偏离主题,因为我认为您确实希望显示正确的值,或者显示这两个小数位没有意义。
如果不小心,编译器将计算出5000/1024 - 4.8828125的值,然后执行整数运算,这会切断小数部分,并最终将ADC结果乘以4。为了保证正确的行为,先乘以5000,然后再除以-2单独的运算。由于1024是2**10,向右移动10位等于除以1024。
最后,不要假设从模数转换器中读取1023实际上意味着5.000伏特到4个重要数字;通过调整#define VREF以获得正确的结果来校准测试过的电压表。
发布于 2016-11-21 05:09:32
试试这个:
编辑:我刚刚编辑了显示电压,因为值是int。但原则是一样的。
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
}
}https://stackoverflow.com/questions/40712305
复制相似问题