LGT8F328P-SSOP20 АЦП и ЦАП (Arduino)

Плата 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);  
}

 

Добавить комментарий

Войти с помощью: