Плата LGT8F328P-SSOP20 основана на китайском микроконтроллер LGT8F328p и является клоном популярной AVR ATmega328p (Arduino NANO). Микроконтроллер LGT8F328p практически полностью совместим с микроконтроллером ATmega328p и обладает рядом дополнительных функций и возможностей превышающих ATmega328p.
Более подробно узнать о модуле LGT8F328P-SSOP20 и как его прошивать можно узнать из — http://rcl-radio.ru/?p=129239.
В этой статье будет показано несколько примеров использования АЦП и ЦАП в микроконтроллере LGT8F328P. Так как я использую модуль LGT8F328P-SSOP20 который не имеет преобразователя интерфейса CH340, то для его прошивки и доступа к монитору порта будет использована заранее подготовленная плата Arduino UNO. Для доступа к монитору порта выводы RX TX платы LGT8F328P-SSOP20 необходимо соединить в выводами RX TX платы Arduino UNO.
Особенность АЦП в LGT8F328P является наличие нескольких опорных напряжений (1,024 В, 1,25 B, 2,048 B, 2,56 B, 4,096 B, VCC), несколько множителей входного сигнала (1, 8, 16 , 32) и увеличенная по сравнению Atmega328 разрядность АЦП до 12 бит. Так же имеется возможность использования дифференциального входа.
Измерение напряжения 3,3 В
uint16_t value; void setup() { analogReference(INTERNAL4V096);//INTERNAL1V024 INTERNAL1V25 INTERNAL2V048 INTERNAL2V56 INTERNAL4V096 DEFAULT Serial.begin(9600); } void loop() { value = analogRead(A0); Serial.println(value/4095.00*4.096,3); delay(1000); }
На вход А0 подано напряжение 3,3 В
Так как выбрано опорное 4,096 В и разрядность 12 бит (0…4095), то для получения результата измерения в вольтаx измеренное значение делим на разрядность (4095 значений в 12 бит) и умножаем на опорное 4,096.
Измерение дифференциального сигнала
#include "differential_amplifier.h" void setup() { Serial.begin(9600); analogReference(INTERNAL2V048); ;//INTERNAL1V024 INTERNAL1V25 INTERNAL2V048 INTERNAL2V56 INTERNAL4V096 DEFAULT } void loop() { int u_plus = analogDiffRead(A0, A1, GAIN_1);//GAIN_1 GAIN_8 GAIN_16 GAIN_32 int u_minus = analogDiffRead(A1, A0, GAIN_1);//GAIN_1 GAIN_8 GAIN_16 GAIN_32 float u = 2.048/4095.00*(u_plus-u_minus); Serial.print(u,3);Serial.println(" V"); delay(1000); }
На вход A0 и A1 подано напряжение от элемента питания 1,5 В, напряжение измеряется только между аналоговыми входами любой полярности.
Так как выбрано опорное 2,048 В и разрядность 12 бит (0…4095), то для получения результата измерения в вольтаx измеренное значение делим на разрядность (4095 значений в 12 бит) и умножаем на опорное 2,048.
Измерение напряжения питания подаваемое на вход VCC
uint16_t vcc5d1 = 0; void setup() { Serial.begin(9600); // using internal 1.024V reference analogReference(INTERNAL1V024); } void loop() { vcc5d1 = analogRead(VCCM); vcc5d1 *= 5; Serial.print("Analog Power Supply: = "); Serial.print(vcc5d1/4095.00,3); Serial.println("V"); delay(500); }
ЦАП
ЦАП имеет разрядность 8 бит и его цифровое значение может меняться от 0 до 255 в диапазоне установленного опорного напряжения. Ниже показан пример использования ЦАП, опорное напряжение установлено на 4,048 В, если подключить вольтметр на выход 4, то Вы увидите как каждую секунду напряжение меняется с 0 В до 4 В с шагом 1 В.
void setup() { analogReference(INTERNAL4V096); pinMode(4, ANALOG); } void loop() { analogWrite(4, 0);// 0V delay(1000); analogWrite(4, 62);// 1V delay(1000); analogWrite(4, 125);// 2V delay(1000); analogWrite(4, 187);// 3V delay(1000); analogWrite(4, 249);// 4V delay(1000); }