Modstands DAC (Læst 2744x)

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Modstands DAC
« Dato: Oktober 08, 2011, 02:19:41 »
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:
Kode:
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.
« Senest Redigeret: Oktober 08, 2011, 02:24:21 af pacman »

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: Modstands DAC
« Svar #1 Dato: Januar 17, 2012, 21:52:52 »
Hej Pacman.

Nu har jeg siddet og kigget din post igennem, og bliver lige nød til at stille et relaterende spørgsmål.

Hvis jeg har fx. 6 knapper og gerne vil køre dem på 1 analog indgang, hvad skal jeg så gøre for at undgå at brænde den analog indgang af?

Tænker at jeg eventuelt kunne bruge en: 10K ohm, 15K ohm, 20K ohm osv osv osv, så en 5k ohm extra på hver knap, om jeg så ikke kunne lave en måling uden at ødelægge porten på mit arduino uno board? (Arduino chippen på uno er en Atmega328P-PU)

For kan ikke rigtig finde noget info om hvor mange amp's den analoge indgang kan klare.

Mvh. Danni.
Mvh. Danni Hansen.