Аналоговое значение на Arduino продолжает расти - PullRequest
0 голосов
/ 25 сентября 2019

В настоящее время я пытаюсь сделать простой индикатор состояния зарядки для моей 12В свинцовой батареи.Поэтому я использую два резистора (11 кОм и 6,8 кОм) в качестве делителя напряжения и аналоговый вход Arduino UNO для измерения значения.Напряжение преобразуется в значение percantage, а затем выводится и отображается на 5 светодиодах (таким образом, 5 светодиодов означают заряд 100-90%, 4 светодиода - 90-80% и т. Д.).Также есть кнопка и реле для включения и устройства, подключенного к аккумулятору.

Однако, когда я подключаю arduino к аккумулятору, количество активируемых светодиодов продолжает увеличиваться.При активации он начинается с 3-х светодиодов и продолжает расти до 5-ти активированных светодиодов и остается там до деактивации.При измерении напряжения на делителе напряжения оно остается неизменным и не увеличивается.

Я не могу понять, почему эта проблема продолжает возникать.

Основная программа:

#include "AnalogConversionLib.c"
#include "VoltageCapacityFkt.c"
#include "DisplayLib.c"


#define Analog1 0


Spannung Volt;
Ladung Ldg;
disp dsp;   

bool led1;
bool led2;
bool led3;
bool led4;
bool led5;
bool ledEin;
bool Schutz=0;
bool Taster=0;
static bool TasterOld=0;
static bool State=0;

void setup()
{
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, INPUT_PULLUP);


}

void loop()
{

    Taster=digitalRead(8);


    Volt.AnalogIn=analogRead(Analog1);
    VoltageRead(&Volt);
    Ldg.Spg=Volt.ActVolt;
    CapFkt(&Ldg);
    dsp.Charge=Ldg.Charge;
    ChargeState(&dsp);


    if(Taster && !TasterOld && !State){
        Schutz=HIGH;

    }
    else if(Taster && !TasterOld == State){
        Schutz=LOW;
        led1=LOW;
        led2=LOW;
        led3=LOW;
        led4=LOW;
        led5=LOW;
    }
    else if(State){
        switch(dsp.Leds) {
            case 5:
                led1=HIGH;
                led2=HIGH;
                led3=HIGH;
                led4=HIGH;
                led5=HIGH;
                Schutz=HIGH;
                break;
            case 4:
                led1=HIGH;
                led2=HIGH;
                led3=HIGH;
                led4=HIGH;
                led5=LOW;
                Schutz=HIGH;
                break;
            case 3:
                led1=HIGH;
                led2=HIGH;
                led3=HIGH;
                led4=LOW;
                led5=LOW;
                Schutz=HIGH;
                break;
            case 2:
                led1=HIGH;
                led2=HIGH;
                led3=LOW;
                led4=LOW;
                led5=LOW;
                Schutz=HIGH;
                break;
            case 1:
                led1=HIGH;
                led2=LOW;
                led3=LOW;
                led4=LOW;
                led5=LOW;
                Schutz=HIGH;
                break;
            case 0:
                led1=LOW;
                led2=LOW;
                led3=LOW;
                led4=LOW;
                led5=LOW;
                Schutz=HIGH;
                break;
            case 6:
                led1=LOW;
                led2=LOW;
                led3=LOW;
                led4=LOW;
                led5=LOW;
                Schutz=LOW;
        }
    }
    else{
        led1=LOW;
        led2=LOW;
        led3=LOW;
        led4=LOW;
        led5=LOW;
        Schutz=LOW;    
   }



    digitalWrite(1, led1);
    digitalWrite(2, led2);
    digitalWrite(3, led3);
    digitalWrite(4, led4);
    digitalWrite(5, led5);
    digitalWrite(6, Schutz);
    digitalWrite(7, State);


    State=Schutz; 
    TasterOld=Taster;
}

AnalogConversionLib:

/***********************************************************************
*
*   Analogwert in Batteriespannung umwandeln
*
*
************************************************************************/



typedef struct {

    //Input
    int AnalogIn;

    //Output
    float ActVolt;

}Spannung;




void VoltageRead(Spannung *ptr)
{


    ptr->ActVolt=(((ptr->AnalogIn*5.0)/1023)*(12.4/4.7));

}

VoltageCapacityFkt:

/***********************************************************************
*
*   Spannung in Kapazit�t umwandeln
*
*
************************************************************************/


typedef struct {

    //Input
    float Spg;

    //Output
    float Charge;
} Ladung;




void CapFkt(Ladung *ptr){   


    if(ptr->Spg>=10.8){
        ptr->Charge=30.299*(ptr->Spg*ptr->Spg) - 655.35*ptr->Spg + 3546.5;
    }
    else{
        ptr->Charge=0;
    }

}

DisplayLib:

/***********************************************************************
*
*   Spannung in Kapazit�t umwandeln
*
*
************************************************************************/


typedef struct {

    //Input
    float Charge;

    //Output
    int Leds;

}disp;



void ChargeState (disp *ptr){



    if(ptr->Charge>=90.0){
        ptr->Leds=5;}
    else if(ptr->Charge>=80.0){
        ptr->Leds=4;}
    else if(ptr->Charge>=70.0){
        ptr->Leds=3;}
    else if(ptr->Charge>=60.0){
        ptr->Leds=2;}
    else if(ptr->Charge>=50.0){
        ptr->Leds=1;}
    else if(ptr->Charge>=40.0 && millis()%500>250){
        ptr->Leds=5;}
    else if(ptr->Charge<40.0){
        ptr->Leds=6;}
    else{ptr->Leds=0;}


}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Мне кажется, я заметил проблему!Кажется, что регулятор напряжения (7805) очень сильно нагревается при питании всех этих светодиодов.Таким образом, напряжение продолжает падать ниже 5 В (я даже измерил 3,79 В).Таким образом, аналоговый вход не может дать мне правильное значение.

Я сейчас пытаюсь использовать дополнительный регулятор напряжения, который может не перегреваться.Также я мог бы попытаться использовать вход AREF платы.

0 голосов
/ 25 сентября 2019

Обратите внимание, что следующая функция использует неправильные значения для резисторов, используемых в делителе напряжения (следовательно, понижая напряжение до 3,3 В вместо 5 В):

void VoltageRead(Spannung *ptr)
{


    ptr->ActVolt=(((ptr->AnalogIn*5.0)/1023)*(12.4/4.7));

}

Заменить 12,4 и 4,7 на 11 и 6,8 соответственно (значения, которые вы использовали в вашем делителе напряжения).Ваша комбинация резисторов для VD также понижает напряжение до 4,5 В вместо 5 В.Следовательно, рассчитанный процент батареи не будет точным.Используйте комбинацию резисторов для VD, которая понижает напряжение, близкое к 5 В.

...