Da jeg fornylig har kigget på følgende opgave, og andre har været interesseret i dette, lægger jeg mine resultater ud her på siden, så alle kan få glæde af det.
Her er et kredsløb der konverterer 4 kontakter/taster til analog signaler, så du med en microcontroller kan måle hvilke taster der er trykket ned.
Tasterne kan kombineres, så du kan fx. holde 3 taster nede samtidig, og så kan microcontrolleren alligevel aflæse den korrekte værdi.
Hvis vi kalder SW1 for D, SW2 for C, SW3 for B og SW4 for A, fik jeg følgende måleresultater med en 3k9 modstand (5%)
Det anbefales at bruge en 4k02 modstand i stedet for en 3k9 modstand.
Men endnu mere vigtigt er det at alle modstande er 1% modstande (eller bedre), for er de for unøjagtige, vil dine resultater kunne blive for skæve til at kunne bruges.
(ingen) 5V
A 257x
B 1721
AB 1296
C 1039
AC 867
BC 743
ABC 651
D 580
AD 522
BD 474
ABD 435
CD 402
ACD 373
BCD 348
ABCD 326
Hvis microcontrolleren nu kan måle 5V (hvilket jeg faktisk går ud fra i dette eksempel), så vil værdierne være cirka følgende for en 10-bit ADC:
1024 / 5000 mV * 2575 mV = 527
1024 / 5000 mV * 1721 mV = 352
1024 / 5000 mV* 1296 mV = 265
1024 / 5000 mV * 1039 mV = 212
1024 / 5000 mV * 867 mV = 177
1024 / 5000 mV * 743 mV = 152
1024 / 5000 mV * 651 mV = 133
1024 / 5000 mV * 580 mV = 118
1024 / 5000 mV* 522 mV = 106
1024 / 5000 mV* 474 mV = 97
1024 / 5000 mV* 435 mV = 89
1024 / 5000 mV* 402 mV = 82
1024 / 5000 mV* 373 mV = 76
1024 / 5000 mV* 348 mV = 71
1024 / 5000 mV* 326 mV = 66
Du kan med følgende kode checke hvilket område den målte værdi hører til:
if(value >= 0 && value < ((66 + 71) / 2))
{
/* value is 66 */
}
else if(value >= ((66 + 71) / 2) && value < ((71 + 76) / 2))
{
/* value is 71 */
}
else if(value >= ((71 + 76) / 2) && value < ((76 + 82) / 2))
{
/* value is 76 */
}
else if (...)
{
/* value is ... */
}
else if(value >= ((265 + 352) / 2) && value < ((352 + 527) / 2))
{
/* value is 352 */
}
else if(value >= ((352 + 527) / 2) && value < ((527 + 1024) / 2))
{
/* value is 527 */
}
else if(value >= ((527 + 1024) / 2))
{
/* value is 1023; no button pressed */
}
Jeg anbefaler at man ikke bruger mere end 4 switches. Du kan selvfølgelig selv vælge om du vil bruge push-buttons eller dip-switches.
Yderligere vil jeg understrege at det vil være en rigtig god idé at stabilisere sin ADC ved at tage gennemsnittet af minimum 4 målinger, for en ADC står ofte og flimrer med de to nederste bits.
Det er muligt at du kan sætte 5 switches på, og stadig få stabile resultater; dette har jeg ikke afprøvet, men jeg mener at resultaterne begynder at ligge temmelig tæt efter de første 4 switches.