hallo,
also da du eine kommastelle willst würde ich mit 10-fachem adc messwert rechnen, denn dann kann mit integer arithmetik gerechnet werden, was sich positiv auf die maschinencodegrösse und performance auswirkt. weiters bieten sich bei den divisionen durch 2er potenzen bitshifts an (1024 = 2^10). und do solltest mindestens auf eine weitere kommastelle runden.
um deine eigendliche frage zu beantworten:
angenommen du freundest dich mit dem vorschlag des 10-fachen adc wertes an... dann erhältst du die ziffer vor dem komma durch dividision mit 10, und die nachkomma ziffer mit einem modulo 10.
so würde mein vorschlag als c code aussehen: (nicht getestet, es ist schon spät und bier!)
vermutlich liesse sich der code weiter optimieren... vieleicht hat ja noch jemand eine ideeCode:#define AREF_VOLTAGE 50 // 10x the voltage for integer arithmetics ... uint_16 dividend = AREF_VOLTAGE * adc_value; // we need this twice uint_8 voltage = dividend >> 10; // division by 1024 (=2^10) uint_16 remainder = dividend - (voltage << 10); //for rounding if(remainder >= 512) voltage++; // minimal rounding without math lib //if(remainder >> 9) voltage++; // could be more efficient... uint_8 ones = voltage / 10; //note: integer division uint_8 tenths = voltage % 10; // modulo
lg + hth
Lesezeichen