Нужен совет по нескольким вопросам в создании АЗУ для авто

Yurannich
Offline
Зарегистрирован: 19.03.2019

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

Аппаратное: Arduino Nano, Encoder, датчик тока ACS750, транзистор 85L02H (N-channel 85A, подтяжка от минуса 10кОм)  и временно БП от ноутбука на 19В 4.5А

Что сделано: на энкодер реагируем, напряжение и ток растёт, управление транзистором осуществляется с вывода D3, при этом значения на ACS750 плавают т.е. показываем 0.061А, а следом например 1.230. На клемме аккумулятора при подключении высокочастотный писк (осциллограф пока в ремонте)

Вопросы:

1. Как на ACS750 нормально измерять ток?

2. Высокочастотный писк связан с шим?

3. Транзистор взят первый попавшийся, может посоветуете более подходящий для данной задачи?

Просьба: укажите на ошибки в коде - хочется ток мониторить постоянно, а не при каждом повороте энкодера

Скетч:

#define CLK 10
#define DT 11
#define SW 12
#include "GyverEncoder.h"
const int analogIn = A4;
// Set your scale factor
int mVperAmp = 40; // See Scale Factors Below
int pwmPin = 3; // connected to the MOSFET's gate
int val = 0;  // set between 0 and 255
// Set you Offset
int ACSoffset = 2500; // See offsets below
int RawValue= 0;
double Voltage = 0;
double Amps = 0;
Encoder enc1(CLK, DT, SW);
void setup() {
pinMode(pwmPin, OUTPUT);
Serial.begin(9600);
enc1.setTickMode(AUTO);
enc1.setType(TYPE2);    // тип энкодера TYPE1 одношаговый, TYPE2 двухшаговый. Если ваш энкодер работает странно, смените тип
}
void loop() {
// enc1.tick();  // не нужна, в этом режиме (AUTO) она входит в каждую функцию!
if (enc1.isTurn()) {     // если был совершён поворот (индикатор поворота в любую сторону)
// ваш код
 RawValue = analogRead(analogIn);
 Voltage = (RawValue / 1023.0) * 5000; // Gets you mV
 Amps = ((Voltage - ACSoffset) / mVperAmp);
if (enc1.isRight()) val++;
if (enc1.isLeft()) val--;
analogWrite(pwmPin, val);
Serial.print("Raw Value = " ); // shows pre-scaled value 
 Serial.print(RawValue); 
 Serial.print("\t mV = "); // shows the voltage measured 
 Serial.print(Voltage,3); // the '3' after voltage allows you to display 3 digits after decimal point
 Serial.print("\t Amps = "); // shows the voltage measured 
 Serial.println(Amps,3); // the '3' after voltage allows you to display 3 digits after decimal point
 Serial.println(val);
 delay(250); 
}
//if (enc1.isRight()) Serial.println("Right");         // если был поворот
//if (enc1.isLeft()) Serial.println("Left");
//if (enc1.isRightH()) Serial.println("Right holded"); // если было удержание + поворот
//if (enc1.isLeftH()) Serial.println("Left holded");
//if (enc1.isPress()) Serial.println("Press");         // нажатие на кнопку (+ дебаунс)
//if (enc1.isRelease()) Serial.println("Release");     // отпускание кнопки (+ дебаунс)
//if (enc1.isHolded()) Serial.println("Holded");       // если была удержана и энк не поворачивался
//if (enc1.isHold()) Serial.println("Hold");         // возвращает состояние кнопки
//Serial.println(val);
}

Всем заранее спасибо!

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

К библиотекам Гайвера у старожил форума неоднозначное отношение однако )))

asam
Offline
Зарегистрирован: 12.12.2018

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

Писк из-за шима. Ну и для правильной зарядки нужно не только ток но и напряжение на АКБ мерять

Yurannich
Offline
Зарегистрирован: 19.03.2019

ua6em пишет:

К библиотекам Гайвера у старожил форума неоднозначное отношение однако )))

Я не в курсе, но думаю, что это вопрос "религии". Сначала надо добиться стабильной работы.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Yurannich пишет:

[ Сначала надо добиться стабильной работы.

Вот с этим, какрас, у гайверовского кода и проблемы