- Wymagane składniki
- Moduł DAC MCP4725 (przetwornik cyfrowo-analogowy)
- Komunikacja I2C w MCP4725
- Schemat obwodu i wyjaśnienie
- Programowanie STM32F103C8 do konwersji cyfrowo-analogowej
- Testowanie DAC z STM32
Wszyscy wiemy, że Mikrokontrolery pracują tylko z wartościami cyfrowymi, ale w realnym świecie mamy do czynienia z sygnałami analogowymi. Właśnie dlatego ADC (konwertery analogowo-cyfrowe) służy do konwersji rzeczywistych wartości analogowych na postać cyfrową, tak aby mikrokontrolery mogły przetwarzać sygnały. Ale co, jeśli potrzebujemy sygnałów analogowych z wartości cyfrowych, więc oto przetwornik cyfrowo - analogowy (DAC).
Prostym przykładem konwertera cyfrowo-analogowego jest nagrywanie piosenki w studio, w którym artysta wokalista używa mikrofonu i śpiewa piosenkę. Te analogowe fale dźwiękowe są konwertowane do postaci cyfrowej, a następnie przechowywane w pliku w formacie cyfrowym, a gdy utwór jest odtwarzany przy użyciu zapisanego pliku cyfrowego, te wartości cyfrowe są konwertowane na sygnały analogowe dla wyjścia głośnika. Czyli w tym systemie zastosowano DAC.
DAC może być używany w wielu zastosowaniach, takich jak sterowanie silnikiem, regulacja jasności diod LED, wzmacniacz audio, kodery wideo, systemy akwizycji danych itp.
Połączyliśmy już moduł DAC MCP4725 z Arduino. Dzisiaj użyjemy tego samego układu DAC MCP4725 do zaprojektowania przetwornika cyfrowo-analogowego za pomocą mikrokontrolera STM32F103C8.
Wymagane składniki
- STM32F103C8
- Układ scalony DAC MCP4725
- Potencjometr 10 k
- Wyświetlacz LCD 16x2
- Płytka prototypowa
- Podłączanie przewodów
Moduł DAC MCP4725 (przetwornik cyfrowo-analogowy)
MCP4725 IC to 12-bitowy moduł konwertera cyfrowo-analogowego, który służy do generowania wyjściowych napięć analogowych od (0 do 5 V) i jest sterowany za pomocą komunikacji I2C. Jest również wyposażony we wbudowaną nieulotną pamięć EEPROM.
Ten układ scalony ma rozdzielczość 12-bitową. Oznacza to, że używamy (od 0 do 4096) jako danych wejściowych, aby zapewnić napięcie wyjściowe w odniesieniu do napięcia odniesienia. Maksymalne napięcie odniesienia wynosi 5 V.
Wzór do obliczenia napięcia wyjściowego
Napięcie O / P = (napięcie odniesienia / rozdzielczość) x wartość cyfrowa
Na przykład, jeśli użyjemy 5V jako napięcia odniesienia i przyjmijmy, że wartość cyfrowa to 2048. Więc do obliczenia wyjścia DAC.
Napięcie O / P = (5/4096) x 2048 = 2,5 V.
Pinout MCP4725Poniżej znajduje się obraz MCP4725 z wyraźnie zaznaczonymi nazwami pinów.
Kołki MCP4725 |
Posługiwać się |
NA ZEWNĄTRZ |
Wyjścia napięcia analogowego |
GND |
GND dla wyjścia |
SCL |
Linia zegara szeregowego I2C |
SDA |
Linia danych szeregowych I2C |
VCC |
Wejściowe napięcie odniesienia 5 V lub 3,3 V. |
GND |
GND dla wejścia |
Komunikacja I2C w MCP4725
Ten układ scalony DAC może być połączony z dowolnym mikrokontrolerem za pomocą komunikacji I2C. Komunikacja I2C wymaga tylko dwóch przewodów SCL i SDA. Domyślnie adres I2C dla MCP4725 to 0x60. Kliknij link, aby dowiedzieć się więcej o komunikacji I2C w STM32F103C8.
Piny I2C w STM32F103C8:
SDA: PB7 lub PB9, PB11.
SCL: PB6 lub PB8, PB10.
Schemat obwodu i wyjaśnienie
Połączenia między STM32F103C8 i 16x2 LCD
Nr styku wyświetlacza LCD |
Nazwa styku wyświetlacza LCD |
Nazwa styku STM32 |
1 |
Ziemia (Gnd) |
Mielone (G) |
2 |
VCC |
5V |
3 |
VEE |
Kołek ze środka potencjometru dla kontrastu |
4 |
Zarejestruj Wybierz (RS) |
PB11 |
5 |
Odczyt / zapis (RW) |
Mielone (G) |
6 |
Włącz (EN) |
PB10 |
7 |
Bit danych 0 (DB0) |
Brak połączenia (NC) |
8 |
Bit danych 1 (DB1) |
Brak połączenia (NC) |
9 |
Bit danych 2 (DB2) |
Brak połączenia (NC) |
10 |
Bit danych 3 (DB3) |
Brak połączenia (NC) |
11 |
Bit danych 4 (DB4) |
PB0 |
12 |
Bit danych 5 (DB5) |
PB1 |
13 |
Bit danych 6 (DB6) |
PC13 |
14 |
Bit danych 7 (DB7) |
PC14 |
15 |
Dioda LED dodatnia |
5V |
16 |
Negatyw LED |
Mielone (G) |
Połączenie między MCP4725 DAC IC a STM32F103C8
MCP4725 |
STM32F103C8 |
Multimetr |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
NA ZEWNĄTRZ |
PA1 |
Sonda dodatnia |
GND |
GND |
Sonda ujemna |
VCC |
3,3 V. |
NC |
Potencjometr jest również podłączony, z centralnym pinem podłączonym do wejścia analogowego PA1 (ADC) STM32F10C8, lewy pin podłączony do GND i prawy pin podłączony do 3,3 V STM32F103C8.
W tym samouczku połączymy układ scalony DAC MCP4725 z STM32 i użyjemy potencjometru 10k, aby podać analogową wartość wejściową do styku PA0 ADC STM32. A następnie użyj ADC do konwersji wartości analogowej na postać cyfrową. Następnie wyślij te wartości cyfrowe do MCP4725 przez magistralę I2C. Następnie przekonwertuj te wartości cyfrowe na analogowe za pomocą układu scalonego DAC MCP4725, a następnie użyj innego styku PA1 ADC STM32, aby sprawdzić wyjście analogowe MCP4725 z pinu OUT. Na koniec wyświetl wartości ADC i DAC z napięciami na wyświetlaczu LCD 16x2.
Programowanie STM32F103C8 do konwersji cyfrowo-analogowej
Programator FTDI nie jest teraz potrzebny do przesłania kodu do STM32F103C8. Wystarczy podłączyć go do komputera przez port USB STM32 i rozpocząć programowanie za pomocą ARDUINO IDE. Odwiedź ten link, aby dowiedzieć się więcej o programowaniu STM32 w Arduino IDE. Kompletny program tego samouczka STM32 DAC jest podany na końcu.
Najpierw dołącz bibliotekę dla I2C i LCD przy użyciu biblioteki wire.h, SoftWire.h i liquidcrystal.h. Dowiedz się więcej o I2C w mikrokontrolerze STM32 tutaj.
#zawierać
Następnie zdefiniuj i zainicjalizuj piny LCD zgodnie z pinami LCD połączonymi z STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Następnie zdefiniuj adres I2C układu scalonego DAC MCP4725. Domyślny adres I2C przetwornika DAC MCP4725 to 0x60
# zdefiniować MCP4725 0x60
W konfiguracji void ()
Najpierw rozpocznij komunikację I2C na pinach PB7 (SDA) i PB6 (SCL) STM32F103C8.
Wire.begin (); // Rozpoczyna komunikację I2C
Następnie ustaw wyświetlacz LCD na tryb 16x2 i wyświetl komunikat powitalny.
lcd.begin (16,2); lcd.print ("PRZEGLĄD OBWODU"); opóźnienie (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC z MCP4725"); opóźnienie (2000); lcd.clear ();
W pustej pętli ()
1. Najpierw w buforze umieść wartość bajtu kontrolnego (0b01000000).
(010-ustawia MCP4725 w trybie zapisu) bufor = 0b01000000;
2. Następująca instrukcja odczytuje wartość analogową z pinu PA0 i konwertuje ją na wartość cyfrową z zakresu od 0 do 4096, ponieważ ADC ma rozdzielczość 12-bitową i zapisuje ją w zmiennej adc .
adc = analogRead (PA0);
3. Poniższe stwierdzenie jest wzorem używanym do obliczenia napięcia na podstawie wartości wejściowej przetwornika ADC (od 0 do 4096) przy napięciu odniesienia 3,3 V.
float ipvolt = (3,3 / 4096,0) * adc;
4. Umieść najbardziej znaczące wartości bitowe w buforze, przesuwając 4 bity w prawo w zmiennej ADC, a najmniej znaczące wartości bitowe w buforze, przesuwając o 4 bity w lewo w zmiennej adc .
bufor = adc >> 4; bufor = adc << 4;
5. Poniższa instrukcja odczytuje wartość analogową z pinu PA1 ADC modułu STM32, który jest wyjściem DAC (pin OUTPUT układu scalonego DAC MCP4725). Ten pin można również podłączyć do multimetru, aby sprawdzić napięcie wyjściowe.
unsigned int analogread = analogRead (PA1);
6. Następnie wartość napięcia ze zmiennej odczytu analogowego jest obliczana za pomocą wzoru z następującym stwierdzeniem.
float opvolt = (3,3 / 4096,0) * odczyt analogowy;
7. W tej samej pętli void () istnieje kilka innych instrukcji, które wyjaśniono poniżej
Rozpoczyna transmisję z MCP4725:
Wire.beginTransmission (MCP4725);
Wysyła bajt kontrolny do I2C
Wire.write (bufor);
Wysyła MSB do I2C
Wire.write (bufor);
Wysyła LSB do I2C
Wire.write (bufor);
Kończy transmisję
Wire.endTransmission ();
Teraz wyświetl te wyniki na wyświetlaczu LCD 16x2 za pomocą lcd.print ()
lcd.setCursor (0,0); lcd.print ("Adres IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (odczyt analogowy); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); opóźnienie (500); lcd.clear ();
Testowanie DAC z STM32
Kiedy zmieniamy wartość wejściowego ADC i napięcie, obracając potencjometr, zmienia się również wyjściowa wartość DAC i napięcie. Tutaj wartości wejściowe są wyświetlane w pierwszym wierszu, a wartości wyjściowe w drugim wierszu wyświetlacza LCD. Multimetr jest również podłączony do wtyku wyjściowego MCP4725 w celu sprawdzenia napięcia analogowego.
Pełny kod z filmem demonstracyjnym znajduje się poniżej.