Использование внутреннего опорного напряжения для датчика

Я использую литиевую батарею 3,7~4,2 В. Я использую внутреннее опорное напряжение для считывания постоянного напряжения батареи, поскольку мы знаем, что уровень напряжения батареи истощается со временем. Проблема в том, что мой датчик (мини-солнечная панель) считывает максимальное значение при слабом освещении и не выходит за этот уровень, независимо от того, сколько света падает на него на более позднем этапе. Мне нужно, чтобы моя логика была <<< если считанное напряжение датчика меньше 3 В, определите ночь и сделайте что-нибудь, тогда как если уровень напряжения выше 3 В, определите день и ложитесь спать. Весь проект готов, осталось только разобраться.

void setup(){
 Serial.begin(9600);
 pinMode (A0, INPUT);
 pinMode (A1, INPUT);
}

void loop() {  
 printVolts();
  //REFS1 И REFS0 на 1 1 -> внутреннее опорное напряжение 1,1 В
  analogReference( INTERNAL);
  // Читаем A1 (MUX0)
  ADMUX = 0b00000000;   
  DIDR0 = 0;  
  // Начать преобразование рекламы
  ADCSRA |= (1<<ADSC);
  // Обнаружение окончания преобразования
  while (bit_is_set(ADCSRA,ADSC));
  val = ADCL | (ADCH << 8);
  val = val * 5.7; // Умножаем на значение, обратное делителю
  Serial.println("val:     ");
  Serial.println(val); 
}    
void printVolts()
{
  int sensorValue = analogRead(A1);
  voltage =  (sensorValue/ val) * 1023.; 

delay(1000);
Serial.println(                    "voltage:  ");
Serial.print(voltage); 
 }

В настоящее время я использую плату arduino в качестве прототипа, позже я буду использовать микросхему attiny.

//////////////////////////////////edit1///////////// ///////////////////

Схема

////////////////////////Макс. чтение при потолочном освещении Макс. чтение при потолочном освещении

/////////////////////////////////////Напряжение после закрытия всей панели рукой Напряжение после закрытия всей панели рукой

//////////////////////////edit2///////////////////// ////////////////////////

#include <avr/io.h>
float val;
float voltage;
int led = 8;
void setup(){
 Serial.begin(9600);
 pinMode (A0, INPUT);
 pinMode (A1, INPUT);
 pinMode (led, OUTPUT);

}

void loop() {  
 printVolts();
  //REFS1 И REFS0 на 1 1 -> внутреннее опорное напряжение 1,1 В
    ADMUX = _BV(REFS0)  | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  // Читаем A1 (MUX0)
  ADMUX = 0b00000000;   
  // Начать преобразование рекламы
  ADCSRA |= (1<<ADSC);
  // Обнаружение окончания преобразования
  while (bit_is_set(ADCSRA,ADSC));
 long result = ADCL | (ADCH << 8);
 val = result;
  val = val * 5.7; // Умножаем на значение, обратное делителю
  Serial.println("val:     ");
  Serial.println(val);
}
 void printVolts()
{
  int sensorValue = analogRead(A1);
  voltage =  ((sensorValue/ val) * 1023.); 
delay(1000);
Serial.println(                    "voltage:  ");
Serial.print(voltage); 
if (voltage<=199){
    digitalWrite (led, HIGH);
  }
  else if (voltage>=200){
    digitalWrite (led, LOW);
  }
}

Этот код должен работать.

///////////////////////////EDIT3///////////////////// /////////////////////////

ATtiny44A

#include <avr/io.h>
float val;
float voltage;
int led = 3;
#define solar 2 

void setup(){
 Serial.begin(9600);
 pinMode (A0, INPUT);
 pinMode (A1, INPUT);
 pinMode (led, OUTPUT);

}

void loop() {  
 printVolts();
  //REFS1 И REFS0 на 1 1 -> внутреннее опорное напряжение 1,1 В
     ADMUX = _BV(MUX5) | _BV(MUX0) ;
  // Читаем A1 (MUX0)
  ADMUX = 0b00000001;   //PA1
  // Начать преобразование рекламы
  ADCSRA |= (1<<ADSC);
  // Обнаружение окончания преобразования
  while (bit_is_set(ADCSRA,ADSC));
 val = ADCL | (ADCH << 8);
 //длинный результат = ADCL | (АДСН<<8);
  //вал = результат;
  val = val * 5.7; // Умножаем на значение, обратное делителю
  Serial.println("val:     ");
  Serial.println(val);
}
 void printVolts()
{
  int sensorValue = analogRead(2); //PA2
  voltage =  (sensorValue/ val) * 1023.; 

delay(1000);
Serial.println(                    "voltage:  ");
Serial.print(voltage); 
if (voltage<=214){
    digitalWrite (led, HIGH);
  }
  else if (voltage>=214){
    digitalWrite (led, LOW);
  }
}

////////////////////////////////////////////////// ////////////////////// ЗНАЧЕНИЕ С командой AnalogReference(INTERNAL).

179.47val:
5831.10 напряжение:
179.47val:
5831.10 напряжение:
179.47val:
5831.10 напряжение:
179.47val:
5831.10 напряжение:
179.47val:
5831.10 напряжение:
179.47val:

максимальное значение достигается при слабом освещении и не может превышать этот уровень.

 ADMUX |=  (0<<REFS0) |(1<<REFS1);
 ADMUX = _BV(MUX5) | _BV(MUX0) ;

если я использую эти команды, серийный монитор показывает:

напряжение:
132.47val:
3357,30 напряжение:
инфвал:
3334,50 напряжение:
132.23val:
3345,90 напряжение:
133.00val:
3351,60

низкое чтение

напряжение:
8.24val:
3351,60 напряжение:
7.94val:
3351,60 напряжение:
7.63val:
3351,60 напряжение:
9.46val:
3351,60

Высокое чтение

напряжение:
183,75значения:
3357,30 напряжение:
178.86val:
3357,30 напряжение:
181.00val:
3357,30 напряжение:
181.61val:
3351,60

, 👍-3

Обсуждение

**Комментарии были [перемещены в чат](https://chat.stackexchange.com/rooms/143109/discussion-on-question-by-electro-nooobbbb-using-internal-voltage-reference-for); пожалуйста, не продолжайте обсуждение здесь. ** Перед публикацией комментария под этим, пожалуйста, ознакомьтесь с [целями комментариев](/help/привилегии/комментарий). Комментарии, которые не требуют пояснений или предложений по улучшению, обычно относятся к [ответу](/help/how-to-answer), [мета] или [чату]. Комментарии, продолжающие обсуждение, могут быть удалены., @Juraj


1 ответ


2

Проблема в том, что мой датчик (мини-солнечная панель) считывает максимальное значение при слабом освещении и не выходит за этот уровень, независимо от того, сколько света падает на него на более позднем этапе.

Напряжение в открытом состоянии не является хорошим способом определения уровня света, падающего на солнечную панель, в этой ситуации. Гораздо лучше измерить ток, генерируемый солнечным элементом, добавив сюда резистор...

Значение резистора можно найти с помощью...

В=ИК

... где...

В=1,1 В

I=максимальный ток, который солнечная батарея может генерировать при полном освещении

Если вы сделаете это, то сможете считать контакт A1 с помощью опорного напряжения 1,1 В и сможете измерять весь диапазон условий освещения с помощью солнечного элемента с помощью простого кода Arduino, подобного этому. ..

analogReference(INTERNAL);  // встроенная ссылка, равная 1,1 вольта
int v=analogRead(A1);       // Возвращает значение 0-1023, представляющее уровень освещенности

PS: обратите внимание, что если вы измерите напряжение батареи с помощью делителя, как показано, вы получите ток (около 0,8 миллиампер, когда батарея достигает минимального напряжения) ВСЕ ВРЕМЯ - даже когда цепь выключена. Вы не хотите делать это с литиевой батареей, так как ее напряжение ниже потенциально может привести к необратимому повреждению. Вам действительно следует прислушаться к моему ответу на другой вопрос здесь.

PPS: обычно лучше задать свой реальный вопрос напрямую, а не задавать кучу вопросов, которые являются синтетическими и отражают проблемы, которые, как вы думаете, у вас есть, а не проблемы, которые у вас есть на самом деле. Предоставленный вами код и чертежи должны соответствовать тому, о чем вы просите, и тому, над чем вы на самом деле работаете (и друг другу!). Часто бывает так, что проблема находится не там, где вы думаете, поэтому демонстрация кода и рисунков, которые не отражают того, что происходит на самом деле, просто тратит усилия людей и в конечном итоге не помогает вам решить вашу настоящую проблему. :)

,

Тогда как мне уменьшить напряжение батареи до Vref? Я читал, что еще один способ сделать это - изменить значение резистора на 47 кОм и 10 кОм, таким образом они будут потреблять 65 мкА. Если я подключу резистор к солнечному концу, потребляемый ток увеличится, что приведет к медленной зарядке батареи, что опять же не подходит для конкретного проекта., @electro_nooobbbb

«Тогда как мне уменьшить напряжение батареи до Vref?» Лучший способ измерить напряжение вашего источника питания — измерить опорное напряжение 1,1 В по отношению к Vcc, как это было предложено в моем ответе на ваш другой вопрос и в статье, указанной там., @bigjosh

«Если я подключу резистор к солнечному концу, потребляемый ток увеличится, что приведет к медленной зарядке батареи, что опять же не подходит для конкретного проекта». Ваш вопрос касается использования солнечного элемента в качестве датчика для измерения уровень света. Этот ответ говорит вам хороший способ сделать это. Если вы используете солнечную батарею для зарядки аккумулятора, то это не отражено ни в вопросе, ни в коде, ни на чертеже, поэтому нам сложно вам в этом помочь! :) И обратите внимание, что зарядка аккумулятора - это *совсем* другое, чем использование его в качестве датчика освещенности., @bigjosh

Да, вы правы, я не использую его как датчик освещенности, он будет заряжать аккумулятор, но он должен определять день и ночь, как упоминалось в моем посте. если напряжение упадет ниже определенного уровня, он должен определить ночь, или он превысит этот уровень, он должен определить день и перейти в режим глубокого сна, позже я подключу солнечную батарею к батарее для зарядки — Я только что обсудил это выше в разделе комментариев, так как это следующий шаг, поэтому я не добавил его на схему, на самом деле солнечная батарея будет подключена к батарее. прямо сейчас я сосредоточен на том, как правильно читать эти уровни напряжения, @electro_nooobbbb

Это все очень разные вещи, которые задаются в этом вопросе и в других ваших. Обратите внимание, что зарядка литиевой батареи нетривиальна и не так проста, как простое подключение к ней солнечной батареи. Посетите https://batteryuniversity.com/article/bu-409-charging-lithium-ion для получения дополнительной информации., @bigjosh

я понял, что объясняется в ссылке, меня беспокоит не перезарядка, потому что эти литиевые батареи требуют много времени для зарядки, и мы не собираемся заряжать их так долго, если в дневное время они заряжаются, они никогда не могут превышать 4 В или скажем, 3,7 (я испытал это), так что да, это не моя главная проблема, я также подключил один диод Шоттки для защиты. В настоящее время, забыв о зарядной части, меня беспокоит код, упомянутый выше, будет здорово, если вы можете помочь с этим., @electro_nooobbbb

В приведенном выше коде много проблем, и он не компилируется. Лучший способ решить эту проблему (или любую другую) — найти *минимальный* код и схему, которые воспроизводят проблему, и опубликовать это вместе с (1) тем, что вы хотите, (2) тем, что на самом деле происходит с поставляемым код и схема. Для меня очень часто просто систематическое выполнение этих шагов на самом деле приводит к тому, что я решаю проблему самостоятельно, но если нет, то, по крайней мере, вы облегчаете другим людям помощь, когда вы публикуете ее., @bigjosh

Привет, я обязательно свяжусь с вами и опубликую текущий выпуск. Мне нужно немного времени, чтобы проверить, так как здесь, в моей стране, ночь., @electro_nooobbbb

Кстати, могу ли я узнать об ошибке, которую вы получаете, почему она не компилируется для вас?, @electro_nooobbbb

Например, в printVolts() вы используете переменную val, хотя здесь ее нет. Я предполагаю, что в вашем коде вы непреднамеренно переключаетесь между ссылками 5 В и 1,1 В, потому что вы иногда используете функции Arduino, иногда напрямую изменяя регистры. Также обратите внимание, что с вашими текущими значениями резистора вы не можете измерить напряжение батареи с опорным напряжением 1,1 В, потому что выходное напряжение может быть выше 1,1 В даже при минимально возможном напряжении батареи., @bigjosh

О, я использовал это, потому что, согласно формуле измерения напряжения, ему нужно опорное напряжение, которое в моем коде предположительно составляет 1,1 В, другое дело, что мне пришлось использовать регистры в некоторых местах, пробуя новые вещи, чтобы заставить его работать. Мне все еще интересно, почему он не скомпилировался для вас. Я разместил новый код, пожалуйста, попробуйте, @electro_nooobbbb

Приведенный выше код работает, но я все еще не очень им доволен, если возможно, проверьте и дайте мне знать, все ли в порядке. Я пытался использовать только функции Arduino, у меня это не сработало, только этот подход вроде как сработал., @electro_nooobbbb

Мне очень жаль, что я только что перепроверил код, о котором вы сказали, что он не компилируется, да, здесь отсутствует часть глобального объявления, я забыл добавить ее в пост, но попробуйте новый код, который я сейчас использую. :), @electro_nooobbbb

Привет, @bigjosh, я добавил код attiny44A в сообщение выше, проблема с ним в том, что если (напряжение >= 214), если это значение до 210, светодиод погаснет при напряжении 3,0-3,1 В, он отлично работает при потолочном освещении, но снаружи яркость больше, поэтому мой мультиметр показывает около 3,8-4 В (снаружи в тени), теперь, чтобы соответствовать этому значению, мы должны отрегулировать напряжение <= (НАСТРОЙКА), если я поставлю значение 214, светодиод остается полностью включенным независимо от какое напряжение показывает., @electro_nooobbbb

@thebusybee Привет, можешь направить?, @electro_nooobbbb

привет, вы можете проверить сообщения выше, @electro_nooobbbb