- Необходими компоненти
- ЦАП модул MCP4725 (цифрово-аналогов преобразувател)
- I2C комуникация в MCP4725
- Електрическа схема и обяснение
- Програмиране на STM32F103C8 за цифрово-аналогово преобразуване
- Тестване на DAC със STM32
Всички знаем, че микроконтролерите работят само с цифрови стойности, но в реалния свят трябва да се справим с аналогови сигнали. Ето защо ADC (Analog to Digital Converters) е там, за да преобразува аналоговите стойности от реалния свят в цифрова форма, така че микроконтролерите да могат да обработват сигналите. Но какво, ако се нуждаем от аналогови сигнали от цифрови стойности, така че тук идва DAC (цифрово-аналогов преобразувател).
Един прост пример за преобразувател Digital to Analog е записването на песен в студио, където изпълнител певец използва микрофон и пее песен. Тези аналогови звукови вълни се преобразуват в цифрова форма и след това се съхраняват във файл с цифров формат и когато песента се възпроизвежда с помощта на съхранения цифров файл, тези цифрови стойности се преобразуват в аналогови сигнали за изход на високоговорители. Така че в тази система се използва ЦАП.
ЦАП може да се използва в много приложения като управление на двигателя, контрол на яркостта на LED светлините, аудио усилвател, видео енкодери, системи за събиране на данни и др.
Вече свързваме DCP модула MCP4725 с Arduino. Днес ще използваме същата интегрална схема на DAC за MCP4725, за да проектираме цифрово-аналогов преобразувател с помощта на микроконтролера STM32F103C8.
Необходими компоненти
- STM32F103C8
- MCP4725 ЦАП IC
- 10k потенциометър
- 16x2 LCD дисплей
- Макет
- Свързване на проводници
ЦАП модул MCP4725 (цифрово-аналогов преобразувател)
MCP4725 IC е 12-битов цифрово-аналогов преобразуващ модул, който се използва за генериране на изходни аналогови напрежения от (0 до 5V) и се управлява чрез използване на I2C комуникация. Той също така се предлага с вградена енергонезависима памет EEPROM.
Този IC има 12-битова резолюция. Това означава, че използваме (0 до 4096) като вход, за да осигурим изходното напрежение по отношение на еталонното напрежение. Максималното референтно напрежение е 5V.
Формула за изчисляване на изходното напрежение
O / P напрежение = (еталонно напрежение / разделителна способност) x цифрова стойност
Например, ако използваме 5V като референтно напрежение и нека приемем, че цифровата стойност е 2048. Така че за изчисляване на изхода на ЦАП.
O / P напрежение = (5/4096) x 2048 = 2.5V
Pinout на MCP4725По-долу е изображението на MCP4725 с ясно посочващи имена на щифтове.
Щипки от MCP4725 |
Използвайте |
ВЪН |
Извежда аналогово напрежение |
GND |
GND за изход |
SCL |
Линия за сериен часовник I2C |
SDA |
Линия за серийни данни на I2C |
VCC |
Входно референтно напрежение 5V или 3.3V |
GND |
GND за вход |
I2C комуникация в MCP4725
Този DAC IC може да бъде свързан с всеки микроконтролер, използващ комуникацията I2C. I2C комуникацията изисква само два проводника SCL и SDA. По подразбиране I2C адресът за MCP4725 е 0x60. Следвайте връзката, за да научите повече за I2C комуникацията в STM32F103C8.
I2C щифтове в STM32F103C8:
SDA: PB7 или PB9, PB11.
SCL: PB6 или PB8, PB10.
Електрическа схема и обяснение
Връзки между STM32F103C8 и 16x2 LCD
LCD щифт № |
Име на LCD щифт |
Име на щифта STM32 |
1 |
Земя (Gnd) |
Земя (G) |
2 |
VCC |
5V |
3 |
VEE |
ПИН от центъра на потенциометъра за контраст |
4 |
Избор на регистър (RS) |
PB11 |
5 |
Четене / запис (RW) |
Земя (G) |
6 |
Активиране (EN) |
PB10 |
7 |
Бит за данни 0 (DB0) |
Без връзка (NC) |
8 |
Бит за данни 1 (DB1) |
Без връзка (NC) |
9 |
Бит за данни 2 (DB2) |
Без връзка (NC) |
10 |
Бит за данни 3 (DB3) |
Без връзка (NC) |
11. |
Бит за данни 4 (DB4) |
PB0 |
12 |
Бит за данни 5 (DB5) |
PB1 |
13 |
Бит за данни 6 (DB6) |
PC13 |
14. |
Бит за данни 7 (DB7) |
PC14 |
15 |
LED Положителен |
5V |
16. |
LED отрицателен |
Земя (G) |
Връзка между DCP IC на MCP4725 и STM32F103C8
MCP4725 |
STM32F103C8 |
Мултиметър |
SDA |
PB7 |
NC |
SCL |
PB6 |
NC |
ВЪН |
PA1 |
Положителна сонда |
GND |
GND |
Отрицателна сонда |
VCC |
3.3V |
NC |
Свързан е и потенциометър, като централният щифт е свързан към PA1 аналоговия вход (ADC) на STM32F10C8, левият щифт е свързан към GND и най-десният щифт е свързан към 3.3V на STM32F103C8.
В този урок ще свържем микросхема на ЦАП MCP4725 със STM32 и ще използваме 10k потенциометър, за да осигурим аналогова входна стойност на STM32 ADC щифт PA0. И след това използвайте ADC, за да конвертирате аналогова стойност в цифрова форма. След това изпратете тези цифрови стойности към MCP4725 чрез I2C шина. След това преобразувайте тези цифрови стойности в аналогови с помощта на DAC MCP4725 IC и след това използвайте друг ADC щифт PA1 на STM32, за да проверите аналоговия изход на MCP4725 от пина OUT. Накрая покажете и двете ADC и DAC стойности с напрежения в 16x2 LCD дисплея.
Програмиране на STM32F103C8 за цифрово-аналогово преобразуване
Сега не е необходим FTDI програмист за качване на код в STM32F103C8. Просто го свържете към компютър чрез USB порт на STM32 и започнете да програмирате с ARDUINO IDE. Посетете тази връзка, за да научите повече за програмирането на вашия STM32 в Arduino IDE. В края е дадена пълната програма за този урок по DAC на STM32.
Първо включете библиотека за I2C и LCD, използвайки библиотека wire.h, SoftWire.h и liquidcrystal.h. Научете повече за I2C в микроконтролера STM32 тук.
#include
След това дефинирайте и инициализирайте LCD щифтовете според LCD щифтовете, свързани със STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
След това дефинирайте I2C адреса на IC DAC на MCP4725. MCP4725 DAC адресът по подразбиране за I2C е 0x60
#define MCP4725 0x60
В настройката за празнота ()
Първо започнете комуникацията I2C на щифтовете PB7 (SDA) и PB6 (SCL) на STM32F103C8.
Wire.begin (); // Започва комуникацията I2C
След това настройте LCD дисплея в режим 16x2 и изведете приветствено съобщение.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); забавяне (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("ЦАП с MCP4725"); забавяне (2000); lcd.clear ();
В цикъла void ()
1. Първо в буфера поставете контролната байтова стойност (0b01000000).
(010-Задава MCP4725 в режим на запис) буфер = 0b01000000;
2. Следващото изявление чете аналоговата стойност от пин PA0 и я преобразува в цифрова стойност, варираща от 0 до 4096, тъй като ADC е 12-битова разделителна способност и се съхранява в променливата adc .
adc = analogRead (PA0);
3. Това следващо изявление е формула, използвана за изчисляване на напрежението от входната стойност на ADC (0 до 4096) с референтното напрежение 3.3V.
float ipvolt = (3.3 / 4096.0) * adc;
4. Поставете най-значимите битови стойности в буфера, като преместите 4 бита надясно в променливата ADC, и най-малко значимите битови стойности в буфера, като преместите 4 бита наляво в променливата adc .
буфер = adc >> 4; буфер = adc << 4;
5. Следващото изявление чете аналогова стойност от ADC пин PA1 на STM32, който е изходът на ЦАП (изходният щифт на MCP4725 DAC IC). Този щифт може също да бъде свързан към мултицет, за да се провери изходното напрежение.
неподписан int analogread = analogRead (PA1);
6. Освен това стойността на напрежението от променливата аналогова четене се изчислява, като се използва формулата със следното твърдение.
float opvolt = (3.3 / 4096.0) * аналогово четене;
7. В същия цикъл void () има няколко други изявления, които са обяснени по-долу
Започва предаването с MCP4725:
Wire.beginTransmission (MCP4725);
Изпраща контролния байт към I2C
Wire.write (буфер);
Изпраща MSB към I2C
Wire.write (буфер);
Изпраща LSB към I2C
Wire.write (буфер);
Завършва предаването
Wire.endTransmission ();
Сега покажете тези резултати на LCD 16x2 дисплея с помощта на lcd.print ()
lcd.setCursor (0,0); lcd.print ("A IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvolt); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (analogread); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); забавяне (500); lcd.clear ();
Тестване на DAC със STM32
Когато променяме входната стойност на ADC и напрежението чрез завъртане на потенциометъра, стойността и напрежението на изходния ЦАП също се променят. Тук входните стойности са показани в първия ред, а изходните стойности във втория ред на LCD дисплея. Към изходния щифт MCP4725 е свързан и мултицет, за да се провери аналоговото напрежение.
Пълният код с демонстрационно видео е даден по-долу.