Satura rādītājs:

Arduino un PCF8591 ADC DAC IC: 7 soļi
Arduino un PCF8591 ADC DAC IC: 7 soļi

Video: Arduino un PCF8591 ADC DAC IC: 7 soļi

Video: Arduino un PCF8591 ADC DAC IC: 7 soļi
Video: Electronic Basics #10: Digital to Analog Converter (DAC) 2024, Novembris
Anonim
Arduino un PCF8591 ADC DAC IC
Arduino un PCF8591 ADC DAC IC

Vai esat kādreiz vēlējies savā Arduino projektā iegūt vairāk analogās ievades tapas, bet neesat vēlējies iegūt Mega? Vai arī vēlaties ģenerēt analogus signālus? Pēc tam iepazīstieties ar mūsu apmācības tēmu - NXP PCF8591 IC.

Tas atrisina abas šīs problēmas, jo tam ir viens DAC (digitālais -analogs) pārveidotājs, kā arī četri ADC (analogie -digitālie pārveidotāji) - tas viss ir pieejams, izmantojot I2C kopni. PCF8591 ir pieejams DIP, virsmas stiprinājuma un moduļa formā, kas ļauj viegli eksperimentēt.

Pirms turpināt, lejupielādējiet datu lapu. PCF8591 var darboties gan no 5 V, gan ar 3,3 V spriegumu, tāpēc, ja izmantojat Arduino Due, Raspberry Pi vai citu 3,3 V attīstības paneli, viss ir kārtībā. Tagad mēs vispirms izskaidrosim DAC, pēc tam ADC.

1. darbība: DAC (digitālā-analogā pārveidotāja) izmantošana

DAC (digitālā-analogā pārveidotāja) izmantošana
DAC (digitālā-analogā pārveidotāja) izmantošana

PCF8591 DAC izšķirtspēja ir 8 biti, tāpēc tas var ģenerēt teorētisku signālu starp nulles voltiem un atskaites spriegumu (Vref) 255 soļos. Demonstrēšanas nolūkos mēs izmantosim 5 V Vref, un jūs varat izmantot zemāku Vref, piemēram, 3,3 V, vai citu, ko vēlaties, lai maksimālā vērtība būtu… tomēr tam jābūt mazākam par barošanas spriegumu.

Ņemiet vērā, ka tad, kad analogās izejas slodze (reālā situācija), maksimālais izejas spriegums samazināsies-datu lapa (kuru lejupielādējāt) parāda 10% kritumu 10 kΩ slodzei. Tagad par mūsu demonstrācijas ķēdi.

Ņemiet vērā, ka I2C kopnē tiek izmantoti 10kΩ uzvilkšanas rezistori un 10μF kondensators starp 5V un GND. I2C kopnes adresi nosaka tapu A0 ~ A2 kombinācija, un kopā ar tām uz GND adrese ir 0x90. Analogo izeju var ņemt no 15. tapas (un 13. tapā ir atsevišķs analogs GND. Pievienojiet arī 13. tapu pie GND un ķēdi GND ar Arduino GND.

Lai kontrolētu DAC, mums ir jānosūta divi baiti datu. Pirmais ir vadības baits, kas vienkārši aktivizē DAC un ir 1000000 (vai 0x40), un nākamais baits ir vērtība no 0 līdz 255 (izvades līmenis). Tas ir parādīts šādā skicē:

// 52.1. Piemērs PCF8591 DAC demonstrācija

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C kopnes adrese void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (0x40); // vadības baits - ieslēdziet DAC (bināro 1000000) Wire.write (i); // vērtība, kas jānosūta uz DAC Wire.endTransmission (); // beigt pārraidi}

par (int i = 255; i> = 0; --i)

{Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (0x40); // vadības baits - ieslēdziet DAC (bināro 1000000) Wire.write (i); // vērtība, kas jānosūta uz DAC Wire.endTransmission (); // beigt transmisiju}}

Vai paziņojumā #define pamanījāt autobusa adreses bitu maiņu? Arduino sūta 7 bitu adreses, bet PCF8591 vēlas 8 bitu, tāpēc mēs pārslēdzam baitu par vienu bitu.

2. darbība:

Attēls
Attēls

Skices rezultāti ir parādīti attēlā, mēs esam savienojuši Vref ar 5 V un osciloskopa zondi un GND attiecīgi ar analogo izeju un GND.

3. darbība:

Attēls
Attēls

Ja jums patīk līknes, varat izveidot sinusa viļņus, izmantojot tālāk redzamo skici. Masīvā tiek izmantota uzmeklēšanas tabula, kurā ir nepieciešamie iepriekš aprēķinātie datu punkti:

// 52.2. Piemērs PCF8591 DAC demo - sinusa vilnis

#include "Wire.h" #define PCF8591 (0x90 >> 1) // I2C kopnes adrese uint8_t sine_wave [256] = {0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96, 0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE, 0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4, 0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD0, 0xD5, 0xD5, 0xD 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC, 0xFx, 0xF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xFx, 0xFx 0xED, 0xEB, 0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC, 0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9, 0xC7, 0xC4, 0xC0, 0xC4, 0xC4, 0xC4, 0xC4 0xB3, 0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C, 0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7D, 0x7A, 0x7, 0x7 0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52, 0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x 3C, 0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28, 0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18, 0x16, 0x15, 0x13, 0x11, 0x10, 0x0, Fx 0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x01 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x26, 0x2 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37, 0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x6, 0x6 0x70, 0x74, 0x77, 0x7A, 0x7D}; void setup () {Wire.begin (); } void loop () {for (int i = 0; i <256; i ++) {Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (0x40); // vadības baits - ieslēdziet DAC (bināro 1000000) Wire.write (sine_wave ); // vērtība, kas jānosūta uz DAC Wire.endTransmission (); // beigt transmisiju}}

4. solis:

Attēls
Attēls

Šai DSO attēla izmešanai mēs nomainījām Vref uz 3.3V - ņemiet vērā sinusa viļņa maksimumu izmaiņas.

Tagad varat eksperimentēt ar DAC, lai radītu skaņas efektus, signālus vai kontrolētu citas analogās shēmas.

5. darbība. ADC (analogo ciparu pārveidotāju) izmantošana

Ja esat izmantojis funkciju analogRead () savā Arduino (jau pirmajā nodaļā), tad jūs jau esat iepazinies ar ADC. Bez PCF8591 mēs varam nolasīt spriegumu starp nulli un Vref, un tas atgriezīs vērtību no nulles līdz 255, kas ir tieši proporcionāla nullei un Vref.

Piemēram, mērot 3.3V, jāatgriež 168. ADC izšķirtspēja (8 bitu) ir zemāka nekā iebūvētajam Arduino (10 bitu), tomēr PCF8591 var darīt to, ko Arduino ADC nevar. Bet mēs pie tā nonāksim pēc brīža. Pirmkārt, lai vienkārši izlasītu katra ADC tapas vērtības, mēs nosūtām kontroles baitu, lai pateiktu PCF8591, kuru ADC mēs vēlamies lasīt. ADC no nulles līdz trim kontroles baits ir attiecīgi 0x00, 0x01, ox02 un 0x03.

Tad mēs lūdzam divus datu baitus atpakaļ no ADC un uzglabājam otro baitu lietošanai. Kāpēc divi baiti? PCF8591 vispirms atgriež iepriekš izmērīto vērtību - pēc tam pašreizējo baitu. (Skatīt 8. attēlu datu lapā). Visbeidzot, ja neizmantojat visas ADC tapas, pievienojiet neizmantotos GND. Šis skices piemērs vienkārši pa vienam izgūst vērtības no katra ADC tapas un pēc tam parāda tās sērijas monitorā:

#ietver "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C kopnes adrese #define ADC0 0x00 // kontroles baiti atsevišķu ADC lasīšanai #define ADC1 0x01 #define ADC2 0x02 #define ADC3 0x03 baitu vērtība0, vērtība1, vērtība2, vērtība3; void setup () {Wire.begin (); Sērijas sākums (9600); } void loop () {Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (ADC0); // vadības baits - lasiet ADC0 Wire.endTransmission (); // beigu transmisija Wire.requestFrom (PCF8591, 2); vērtība0 = Wire.read (); vērtība0 = Wire.read (); Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (ADC1); // vadības baits - lasiet ADC1 Wire.endTransmission (); // beigu transmisija Wire.requestFrom (PCF8591, 2); vērtība1 = Wire.read (); vērtība1 = Wire.read (); Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (ADC2); // vadības baits - lasiet ADC2 Wire.endTransmission (); // beigu transmisija Wire.requestFrom (PCF8591, 2); vērtība2 = Wire.read (); vērtība2 = Wire.read (); Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (ADC3); // vadības baits - lasiet ADC3 Wire.endTransmission (); // beigu transmisija Wire.requestFrom (PCF8591, 2); value3 = Wire.read (); value3 = Wire.read (); Sērijas nospiedums (vērtība0); Serial.print (""); Serial.print (vērtība1); Serial.print (""); Serial.print (vērtība2); Serial.print (""); Sērijas nospiedums (vērtība3); Serial.print (""); Sērijas.println (); }

Izpildot skici, jums tiks parādītas katras ADC vērtības sērijas monitorā. Lai gan tā bija vienkārša demonstrācija, lai parādītu, kā individuāli lasīt katru ADC, tā ir apgrūtinoša metode, lai vienlaikus iegūtu vairāk nekā vienu baitu no konkrētas ADC.

6. darbība

Lai to izdarītu, mainiet vadības baitu, lai pieprasītu automātisku palielināšanu, ko veic, iestatot vadības baita 2. bitu uz 1. Tātad, lai sāktu no ADC0, mēs izmantojam jaunu kontroles baitu ar bināro 00000100 vai heksadecimālo 0x04. Pēc tam pieprasiet piecus baitus datu (atkal mēs ignorējam pirmo baitu), kā rezultātā PCF8591 atgriezīs visas vērtības vienā baitu ķēdē. Šis process ir parādīts šādā skicē:

#ietver "Wire.h"

#define PCF8591 (0x90 >> 1) // I2C kopnes adreses baits vērtība0, vērtība1, vērtība2, vērtība3; void setup () {Wire.begin (); Sērijas sākums (9600); } void loop () {Wire.beginTransmission (PCF8591); // modināt PCF8591 Wire.write (0x04); // vadības baits - lasiet ADC0, tad automātiski palieliniet Wire.endTransmission (); // beigu transmisija Wire.requestFrom (PCF8591, 5); vērtība0 = Wire.read (); vērtība0 = Wire.read (); vērtība1 = Wire.read (); vērtība2 = Wire.read (); value3 = Wire.read (); Sērijas nospiedums (vērtība0); Serial.print (""); Serial.print (vērtība1); Serial.print (""); Serial.print (vērtība2); Serial.print (""); Sērijas nospiedums (vērtība3); Serial.print (""); Sērijas.println (); }

Iepriekš mēs minējām, ka PCF8591 var darīt kaut ko tādu, ko Arduino ADC nevar, un tas piedāvā diferenciālu ADC. Atšķirībā no Arduino viengabala (ti, tā atgriež starpību starp pozitīvā signāla spriegumu un GND, diferenciālis ADC pieņem divus signālus (kuriem nav obligāti jābūt saistītiem ar zemi) un atgriež starpību starp abiem signāliem Tas var būt ērti, lai izmērītu nelielas slodzes šūnu sprieguma izmaiņas utt.

7. darbība:

Attēls
Attēls

PCF8591 iestatīšana diferenciālajai ADC ir vienkārša vadības baita maiņa. Ja atgriežaties datu lapas septītajā lappusē, tad apsveriet dažādus analogās ievades programmēšanas veidus. Iepriekš četrām ievadēm izmantojām režīmu “00”, tomēr jūs varat izvēlēties citus, kas ir skaidri ilustrēti, piemēram, attēlu.

Tātad, lai iestatītu kontroles baitu divām diferenciālām ieejām, izmantojiet bināro 00110000 vai 0x30. Tad ir vienkārši pieprasīt datu baitus un strādāt ar tiem. Kā redzat, ir arī viena/diferenciāla kombinācija un sarežģīta trīs diferenciāla ieeja. Tomēr pagaidām tos atstāsim.

Cerams, ka jūs atradāt šo interesējošo jautājumu, pievienojot eksperimentiem DAC vai uzzinot mazliet vairāk par ADC. Lūdzu, apsveriet iespēju pasūtīt savu PCF8591 no PMD Way.

Šo ziņu jums sniedza pmdway.com - viss veidotājiem un elektronikas entuziastiem ar bezmaksas piegādi visā pasaulē.

Ieteicams: