Перейти к содержанию

На Lcd1602 Плавает Напряжение 0.3 - 0.7В.


Рекомендуемые сообщения

Уважаемые специалисты! Помогите решить проблему с индикатором напряжение на дисплее!

имеется Arduino Nano 328р подключенная к LCD 1602 по каналу I2C и делитель напряжения для индикации на LCD.

Проблема в том что показатель напряжение на LCD плавает 30 - 70мв и не зависимо с какого источника питания я на него подаю напряжение (батарейка или стабилизированный БП)

В протеусе отображение работает как нужно не плавает.

Может где проблема в прошивке? Скетч bp4TLV3.rar Посмотрите пожалуйста!

Схема делителя и всего проекта.

post-188957-0-86616800-1452943381_thumb.jpg

Скрины как меняется индикация.

post-188957-0-79463500-1452943689_thumb.jpg

post-188957-0-39664900-1452943670_thumb.jpg

post-188957-0-80085300-1452943670_thumb.jpg

Изменено пользователем Стрелок

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Измеряйте 40 раз, складывайте измерения и потом результат делите на эти самые 40 раз тем самым получая усреднённое значение. И тогда можно будет выводить вплоть до трёх знаков после запятой без скачков

Что значит кому как удобно? Есть десятая часть а есть сотая часть, учите математику

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Ну это все же программный косяк?

Вот в этих строках нужно подобрать коррекция напряжения?

 //получаем значение напряжения и тока в нагрузке
 float Ucorr = -0.09; //коррекция напряжения, при желании можно подстроить
 float Uout = analogRead(A1) * ((5.0 + Ucorr) / 1023.0) * 7.0; //узнаем напряжение на выходе



Изменено пользователем Стрелок

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Нет, нужно править в функции где считывается АЦП. У вас она вроде как analogRead называется а коррекция нужна для того чтоб показания на дисплее совпадали с показаниями вашего мультиметра.

Изменено пользователем Viktor26

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

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

Нет, нужно править в функции где считывается АЦП.

Может подскажите значение, а лучше исправить в скетче!

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Моя порция бисера:

В коде верхнее напряжение 30 вольт. Встроенный АЦП имеет разрядность 10 бит. Из которых реально не мусор 8-9. Разрешающую способность сами посчитаете?

Ссылка на комментарий
Поделиться на другие сайты

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

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Вот весь скетч

[code]
/*
Лабораторный блок питания под управлением arduino
Версия 2 (29.12.2015)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <EEPROM.h>
// задаем константы
float umax = 30.00; //максимальное напряжение
float umin = 0.00; //минимальное напряжение
float ah = 0.0000; //Cчетчик Ампер*часов
const int down = 10;	 //выход валкодера 1/2
const int up = 8;	 //выход валкодера 2/2
const int pwm = 9;	 //выход ШИМ
const int power = 7;	 //управление релюхой
long previousMillis = 0; //храним время последнего обновления дисплея
long maxpwm = 0;		 //циклы поддержки максимального ШИМ
long interval = 500;	 // интервал обновления информации на дисплее, мс
int mig = 0;			 //Для енкодера (0 стоим 1 плюс 2 минус)
float level = 10;		 //"уровень" ШИМ сигнала
float com = 100;
long com2 = 0;
int mode = 0;			//режим (0 обычный, спабилизация тока, защита по току)
float Ioutmax = 1.0;	 //заданный ток
int set = 0;			 //пункты меню, отображение защиты...
int knopka_a = 0;		//состояние кнопок
int knopka_b = 0;
int knopka_ab = 0;
boolean off = false;
boolean red = false;
boolean blue = false;
float counter = 5;	 // переменная хранит заданное напряжение
int disp = 0;			//режим отображения 0 ничего, 1 мощьность, 2 режим, 3 установленный ток, 4 шим уровень
float Uout ;			 //напряжение на выходе
int incomingByte;
void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{
byte *x = (byte *)&val;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{	
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
void setup() {
cli();
DDRB |= 1<<1 | 1<<2;
PORTB &= ~(1<<1 | 1<<2);
TCCR1A = 0b00000010;
//TCCR1A = 0b10100010;
TCCR1B = 0b00011001;
ICR1H = 255;
ICR1L = 255;
sei();
int pwm_rez = 11;
pwm_rez = pow(2, pwm_rez);
ICR1H = highByte(pwm_rez);
ICR1L = lowByte(pwm_rez);
Serial.begin(9600);
pinMode(pwm, OUTPUT);
pinMode(down, INPUT);
pinMode(up, INPUT);
pinMode(12, INPUT);
pinMode(11, INPUT);
pinMode(power, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
// поддерживаем еденицу на входах от валкодера
digitalWrite(up, 1);
digitalWrite(down, 1);
//поддерживаем еденицу на контактах кнопок
digitalWrite(12, 1);
digitalWrite(11, 1);
//запуск дисплея
lcd.init();
lcd.backlight();
lcd.print("	WELCOME!	");
//загружаем настройки из памяти МК
counter = EEPROM_float_read(0);
Ioutmax = EEPROM_float_read(4);
mode = EEPROM_float_read(12);
disp = EEPROM_float_read(10);
//Если в памяти еще нет настроек - задаем что нибудь кроме нулей
if(counter==0) counter = 5; //5 вольт
if(Ioutmax==0) Ioutmax = 2; //2 ампера

//включаем реле
digitalWrite(power, 1);
}
//функции при вращении енкодера
void uup(){ //енкодер +
if(set==0){//обычный режим - добавляем напряжения
 if(counter<umax) {
 counter = counter+0.1;//добавляем
 }
}
if(set==1){ //переключаем режим работы вперед
mode = mode+1;
if(mode>2) mode=2;
}
if(set==2){ //настройка тока, добавляем ток
iplus();
}

if(set==3){//сброс счетчика А*ч
ah = 0;
set = 0;
disp = 5;
}
if(set==4){//сохранение текущих настроек в память
save();
}
}
void udn(){ //валкодер -
if(set==0){
if(counter>umin+0.1)counter = counter-0.1; //убавляем напнряжение
}
if(set==1){
mode = mode-1; //переключаем режим работы назад
if(mode<0) mode=0;
}
if(set==2){//убавляем ток
iminus();
}
}
void iplus(){
Ioutmax = Ioutmax+0.01;
if(Ioutmax>0.2) Ioutmax=Ioutmax+0.04;
if(Ioutmax>1) Ioutmax=Ioutmax+0.05;


if(Ioutmax>10.00) Ioutmax=10.00;
}
void iminus(){
Ioutmax = Ioutmax-0.01;
if(Ioutmax>0.2) Ioutmax=Ioutmax-0.04;
if(Ioutmax>1) Ioutmax=Ioutmax-0.05;


if(Ioutmax<0.03) Ioutmax=0.03;
}
void save(){
 lcd.clear();
lcd.setCursor (0, 0);
lcd.print(" S A V E - OK ");
 EEPROM_float_write(0, counter);
 EEPROM_float_write(4, Ioutmax);
 EEPROM_float_write(12, mode);
 EEPROM_float_write(10, disp);
 //мигаем светодиодами
digitalWrite(A2, 1);
digitalWrite(A3, 1);
 delay(500);
digitalWrite(A2, 0);
digitalWrite(A3, 0);
 set = 0; //выходим из меню
}
void loop() //основной цикл работы МК
{

unsigned long currentMillis = millis();

/* Вншнее управление */
if (Serial.available() > 0) { //если есть доступные данные
	// считываем байт
	incomingByte = Serial.read();

}else{
 incomingByte = 0;
}

if(incomingByte==97){ //a
if(counter>umin+0.1)counter = counter-0.1; //убавляем напнряжение

}
	if(incomingByte==98){ //b

if(counter<umax)	 counter = counter+0.1;//добавляем

}

 if(incomingByte==99){ //c
iminus();
 }

 if(incomingByte==100){ //d
	 iplus();
 }
if(incomingByte==101) mode = 0;
if(incomingByte==102) mode = 1;
if(incomingByte==103) mode = 2;
if(incomingByte==104) save();
if(incomingByte==105){
digitalWrite(power, 1); //врубаем реле если оно было выключено
 delay(100);
digitalWrite(A2, 0); //гасим красный светодиод
 Serial.print('t');
Serial.print(0);
Serial.print(';');
off = false;
set = 0;//выходим из меню
}

if(incomingByte==106) off = true;
if(incomingByte==107) ah = 0;

/* конец внешнего управления */



//получаем значение напряжения и тока в нагрузке
float Ucorr = -0.0835; //коррекция напряжения, при желании можно подстроить
float Uout = analogRead(A1) * ((5.0 + Ucorr) / 1023.0) * 7.0; //узнаем напряжение на выходе



float Iout = analogRead(A0) / 100.00; // узнаем ток в нагрузке

if(Iout==0.01) Iout = 0.03; else
if(Iout==0.02) Iout = 0.04; else
if(Iout==0.03) Iout = 0.05; else
if(Iout==0.04) Iout = 0.06; else
if(Iout>=0.05) Iout = Iout + 0.02;
if(Iout>=0.25)Iout = Iout + 0.01;
//if(Iout>=1)Iout = Iout * 1.02;




/* ЗАЩИТА и выключение */

if (((Iout>(counter+0.3)*2.0) | Iout>10.1 | off) & set<4 & millis()>100 ) // условия защиты
{
 digitalWrite(power, 0); //вырубаем реле
 level = 8190; //убираем ШИМ сигнал
 digitalWrite(A2, 1);	

Serial.print('I0;U0;r1;W0;');
Serial.println(' ');
 set = 6;

}


//Зашита от длительного максимального шим
if (level==0 & off==false)
{
 if(set<4)//если уже не сработала защита
 {
	maxpwm--; //добавляем +1 к счетчику
	digitalWrite(A2, 1); //светим красным для предупреждения о максимальном ШИМ
 }
}
else //шим у нас не максимальный, поэтому поубавим счетчик
{
 maxpwm++;
 if(maxpwm>8190)//если счетчик дошел до нуля
 {
	maxpwm = 8190; //таким его и держим
	if(set<4) digitalWrite(A2, 0); // гасим красный светодиод. Перегрузки нет.
 }
}


/* ЗАЩИТА КОНЕЦ */


// считываем значения с входа валкодера
boolean regup = digitalRead(up);
boolean regdown = digitalRead(down);

if(regup<regdown) mig = 1; // крутится в сторону увеличения
if(regup>regdown) mig = 2; // крутится в сторону уменшения
if(!regup & !regdown) //момент для переключения
{
if(mig==1) uup();//+
if(mig==2) udn(); //-
mig = 0; //сбрасываем указатель направления
}
if(mode==0 | mode==1) //если управляем только напряжением (не режим стабилизации тока)
{

//Сравниваем напряжение на выходе с установленным, и принимаем меры..
if(Uout>counter)
{
float raz = Uout - counter; //на сколько напряжение на выходе больше установленного...
if(raz>0.05)
{
 level = level - raz * 20; //разница большая управляем грубо и быстро!
}else{
 if(raz>0.015) level = level - raz * 3 ; //разница небольшая управляем точно
}
}
if(Uout<counter)
{
float raz = counter - Uout; //на сколько напряжение меньше чем мы хотим
if(raz>0.05)
{
 level = level + raz * 20; //грубо
}else{
 if(raz>0.015) level = level + raz * 3 ; //точно
}
}
if(mode==1&&Iout>Ioutmax) //режим защиты по току, и он больше чем мы установили
{
digitalWrite(power, 0); //вырубаем реле
	Serial.print('t');
Serial.print(2);
Serial.print(';');

//зажигаем красный светодиод
digitalWrite(A2, 1);
level = 8190; //убираем ШИМ сигнал
set=5; //режим ухода в защиту...
}

}else{ //режим стабилизации тока
if(Iout>=Ioutmax)
{
//узнаем запас разницу между током в нагрузке и установленным током
float raz = (Iout - Ioutmax);
if(raz>0.3) //очень сильно превышено (ток больше заданного более чем на 0,3А)
{
 level = level + raz * 20; //резко понижаем ШИМ
}else{
 if(raz>0.05) //сильно превышено (ток больше заданного более чем на 0,1А)
 {
	level = level + raz * 5; //понижаем ШИМ
 }else{
	if(raz>0.00) level = level + raz * 2; //немного превышен (0.1 - 0.01А) понижаем плавно
 }
}


//зажигаем синий светодиод
digitalWrite(A3, 1);
}else{ //режим стабилизации тока, но ток у нас в пределах нормы, а значит занимаемся регулировкой напряжения
digitalWrite(A3, 0);//синий светодиод не светится
//Сравниваем напряжение на выходе с установленным, и принимаем меры..
if(Uout>counter)
{
float raz = Uout - counter; //на сколько напряжение на выходе больше установленного...
if(raz>0.1)
{
 level = level + raz * 20; //разница большая управляем грубо и быстро!
}else{
 if(raz>0.015) level = level + raz * 5; //разница небольшая управляем точно
}
}
if(Uout<counter)
{
float raz = counter - Uout; //на сколько напряжение меньше чем мы хотим
float iraz = (Ioutmax - Iout); //
if(raz>0.1 & iraz>0.1)
{
 level = level - raz * 20; //грубо
}else{
 if(raz>0.015) level = level - raz ; //точно
}
}
}
}//конец режима стабилизации тока
if(off) level = 8190;
if(level<0) level = 0; //не опускаем ШИМ ниже нуля
if(level>8190) level = 8190; //не поднимаем ШИМ выше 13 бит
//Все проверили, прощитали и собственно отдаем команду для силового транзистора.
if(ceil(level)!=255) analogWrite(pwm, ceil(level)); //подаем нужный сигнал на ШИМ выход (кроме 255, так как там какая-то лажа)

/* УПРАВЛЕНИЕ */
if (digitalRead(11)==0 && digitalRead(12)==0 && knopka_ab==0 ) { // нажата ли кнопка a и б вместе
knopka_ab = 1;
//ah = 0.000;
knopka_ab = 0;
}

if (digitalRead(11)==0 && knopka_a==0) { // нажата ли кнопка А (disp)
knopka_a = 1;
disp = disp + 1; //поочередно переключаем режим отображения информации
if(disp==6) disp = 0; //дошли до конца, начинаем снова
}
if (digitalRead(12)==0 && knopka_b==0) { // нажата ли кнопка Б (menu)
knopka_b = 1;
set = set+1; //
if(set>4 | off) {//Задействован один из режимов защиты, а этой кнопкой мы его вырубаем. (или мы просто дошли до конца меню)
off = false;
digitalWrite(power, 1); //врубаем реле если оно было выключено
delay(100);
digitalWrite(A2, 0); //гасим красный светодиод
Serial.print('t');
Serial.print(0);
Serial.print(';');
 Serial.print('r');
Serial.print(0);
Serial.print(';');
Serial.println(' ');
set = 0;//выходим из меню
}
lcd.clear();//чистим дисплей
}
//сбрасываем значения кнопок или чего-то вроде того.
if(digitalRead(12)==1&&knopka_b==1) knopka_b = 0;
if(digitalRead(11)==1&&knopka_a==1) knopka_a = 0;

/* COM PORT */
if(currentMillis - com2 > com) {
// сохраняем время последнего обновления
com2 = currentMillis;

//Считаем Ампер*часы
ah = ah + (Iout / 36000);
Serial.print('U');
Serial.print(Uout);
Serial.print(';');

Serial.print('I');
Serial.print(Iout);
Serial.print(';');

Serial.print('i');
Serial.print(Ioutmax);
Serial.print(';');

Serial.print('u');
Serial.print(counter);
Serial.print(';');

Serial.print('W');
Serial.print(level);
Serial.print(';');

Serial.print('c');
Serial.print(ah);
Serial.print(';');

Serial.print('m');
Serial.print(mode);
Serial.print(';');

Serial.print('r');
Serial.print(digitalRead(A2));
Serial.print(';');

Serial.print('b');
Serial.print(digitalRead(A3));
Serial.print(';');


Serial.println(' ');

}

/* ИНДИКАЦИЯ LCD */

if(set==0){
//стандартный екран

//выводим уснановленное напряжение на дисплей
lcd.setCursor (0, 1);
lcd.print("U>");
if(counter<10) lcd.print(" "); //добавляем пробел, если нужно, чтобы не портить картинку
lcd.print (counter,1); //выводим установленное значение напряжения
lcd.print ("V "); //пишем что это вольты

//обновление информации

/*проверяем не прошел ли нужный интервал, если прошел то
выводим реальные значения на дисплей*/
if(currentMillis - previousMillis > interval) {
// сохраняем время последнего обновления
previousMillis = currentMillis;
//выводим актуальные значения напряжения и тока на дисплей

lcd.setCursor (0, 0);
lcd.print("U=");
if(Uout<9.99) lcd.print(" ");
lcd.print(Uout,2);
lcd.print("V I=");
lcd.print(Iout, 2);
lcd.print("A ");

//дополнительная информация
lcd.setCursor (8, 1);
if(disp==0){ //ничего
 lcd.print("		 ");
}	
if(disp==1){ //мощьность
 lcd.print(" ");
 lcd.print (Uout * Iout,2);
 lcd.print("W ");
}
if(disp==2){ //режим БП
 if(mode==0)lcd.print ("standart");
 if(mode==1)lcd.print ("shutdown");
 if(mode==2)lcd.print (" drop");
}
if(disp==3){ //максимальный ток
 lcd.print (" I>");
 lcd.print (Ioutmax, 2);
 lcd.print ("A ");
}
if(disp==4){ // значение ШИМ
 lcd.print ("pwm:");
 lcd.print (ceil(level), 0);
 lcd.print (" ");
}
if(disp==5){ // значение ШИМ
 if(ah<1){
	//if(ah<0.001) lcd.print (" ");
	if(ah<=0.01) lcd.print (" ");
	if(ah<=0.1) lcd.print (" ");
	lcd.print (ah*1000, 1);
 lcd.print ("mAh ");
 }else{
	if(ah<=10) lcd.print (" ");
 lcd.print (ah, 3);
 lcd.print ("Ah ");
 }
}
}
}
/* ИНДИКАЦИЯ МЕНЮ */
if(set==1)//выбор режима
{
lcd.setCursor (0, 0);
lcd.print("> MENU 1/4 ");
lcd.setCursor (0, 1);
lcd.print("mode: ");
//режим (0 обычный, спабилизация тока, защита по току)
if(mode==0) lcd.print("normal		 ");
if(mode==1) lcd.print("shutdown ");
if(mode==2) lcd.print("drop	 ");
}
if(set==2){//настройка тока
lcd.setCursor (0, 0);
lcd.print("> MENU 2/4 ");
lcd.setCursor (0, 1);
lcd.print("I out max: ");
lcd.print(Ioutmax);
lcd.print("A");
}
if(set==3){//спрашиваем хочет ли юзер сохранить настройки
lcd.setCursor (0, 0);
lcd.print("> MENU 3/4	 ");
lcd.setCursor (0, 1);
lcd.print("Reset A*h? ->");
}
if(set==4){//спрашиваем хочет ли юзер сохранить настройки
lcd.setCursor (0, 0);
lcd.print("> MENU 4/4	 ");
lcd.setCursor (0, 1);
lcd.print("Save options? ->");
}
/* ИНДИКАЦИЯ ЗАЩИТЫ */
if(set==5){//защита. вывод инфы
lcd.setCursor (0, 0);
lcd.print("ShutDown!	 ");
lcd.setCursor (0, 1);
lcd.print("Iout");
lcd.print(">Imax(");
lcd.print(Ioutmax);
lcd.print("A)");
level=0;
Serial.print('I0;U0;r1;W0;');
Serial.println(' ');
}

if(set==6){//защита. вывод инфы критическое падение напряжения
Serial.print('I0;U0;r1;W0;');
digitalWrite(A2, true);
Serial.println(' ');
level=0;
lcd.setCursor (0, 0);
if (off==false){ lcd.print("[ OVERLOAD ]");
lcd.setCursor (0, 1);
 //и обьясняем юзеру что случилось

 if((Iout>(counter+0.3)*2.0) | Iout>10.0){
	 Serial.print('t');
Serial.print(1);
Serial.print(';');
 lcd.print(" Iout >= Imax ");
 }

}else{

lcd.print("[	 OFF	 ]");
lcd.setCursor (0, 1);
Serial.print('t');
Serial.print(4);
Serial.print(';');
}
}

}

[/code]

Изменено пользователем Стрелок

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Что-то я не нашёл в вашем скетче функции с иминем analogRead. Постарайтесь не найти сами, мне с телефона не совсем удобно. Она может быть в подключаемых библиотеках.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Ну в скетче только одна строка где указано это имя analogRead

 float Uout = analogRead(A1) * ((5.0 + Ucorr) / 1023.0) * 5.0; //узнаем напряжение на выходе

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Уж поверте, это еще ой как хорошо. что вы хотели от 10бит?

еще и библиотеки стороннии, хрен знает кто их писал и как, это же ардуино, не знаю почему ее так назвали но должны были назвать "ЧЖ"(через жопу).

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

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

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Это ещё почему не должно, вы же шим используете, посмотрите реальным осциллографом на сигнал шим из мк. Он не идеален. Показания перестанут плавать если написать функцию чтения АЦП которая будет усреднять значения. А может и не получиться. Хрен его знает как там шим регулирует, может он скачет как придурошный вверх/вниз.

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Шим не подключен в данный момент ни куда. Просто на вход ардуино (А1) через делитель подаю напряжение от батарейки 3.7в на дисплее отображается плавающее напряжение.

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Сам МК тоже работает, и ядро излучает помехи. везде так. хотите чтоб не плавало (повторяю в третий раз) нужно усреднять значения АЦП. не сравнивайте с протеусом, там изначально заложены идеальные условия, в реале такого не будет как в протезе

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

В коде верхнее напряжение 30 вольт. Встроенный АЦП имеет разрядность 10 бит. Из которых реально не мусор 8-9. Разрешающую способность сами посчитаете?

Всё так оно и есть. Просто людям лень считать. Ну или просто не умеют.

От себя - это не проблема, это физика. Смиритесь с этим.

Ссылка на комментарий
Поделиться на другие сайты

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

Не знаеш как? Спроси у Google'а !!!

Ссылка на комментарий
Поделиться на другие сайты

Ничего такого не нахожу в библиотеке!

Скрин архива

post-188957-0-92091300-1452978596_thumb.jpg

Могу открыть только файл LiquidCrystal_I2C.h

Его содержимое

//YWROBOT
#ifndef LiquidCrystal_I2C_h
#define LiquidCrystal_I2C_h
#include <inttypes.h>
#include "Print.h"
#include <Wire.h>
// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80
// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00
// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
// flags for backlight control
#define LCD_BACKLIGHT 0x08
#define LCD_NOBACKLIGHT 0x00
#define En B00000100  // Enable bit
#define Rw B00000010  // Read/Write bit
#define Rs B00000001  // Register select bit
class LiquidCrystal_I2C : public Print {
public:
 LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
 void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
 void clear();
 void home();
 void noDisplay();
 void display();
 void noBlink();
 void blink();
 void noCursor();
 void cursor();
 void scrollDisplayLeft();
 void scrollDisplayRight();
 void printLeft();
 void printRight();
 void leftToRight();
 void rightToLeft();
 void shiftIncrement();
 void shiftDecrement();
 void noBacklight();
 void backlight();
 void autoscroll();
 void noAutoscroll();
 void createChar(uint8_t, uint8_t[]);
 void setCursor(uint8_t, uint8_t);
#if defined(ARDUINO) && ARDUINO >= 100
 virtual size_t write(uint8_t);
#else
 virtual void write(uint8_t);
#endif
 void command(uint8_t);
 void init();
////compatibility API function aliases
void blink_on();	  // alias for blink()
void blink_off();		    // alias for noBlink()
void cursor_on();			 // alias for cursor()
void cursor_off();		   // alias for noCursor()
void setBacklight(uint8_t new_val);    // alias for backlight() and nobacklight()
void load_custom_character(uint8_t char_num, uint8_t *rows); // alias for createChar()
void printstr(const char[]);
////Unsupported API functions (not implemented in this library)
uint8_t status();
void setContrast(uint8_t new_val);
uint8_t keypad();
void setDelay(int,int);
void on();
void off();
uint8_t init_bargraph(uint8_t graphtype);
void draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len,  uint8_t pixel_col_end);
void draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len,  uint8_t pixel_col_end);

private:
 void init_priv();
 void send(uint8_t, uint8_t);
 void write4bits(uint8_t);
 void expanderWrite(uint8_t);
 void pulseEnable(uint8_t);
 uint8_t _Addr;
 uint8_t _displayfunction;
 uint8_t _displaycontrol;
 uint8_t _displaymode;
 uint8_t _numlines;
 uint8_t _cols;
 uint8_t _rows;
 uint8_t _backlightval;
};
#endif

С Уважением!

Ссылка на комментарий
Поделиться на другие сайты

Да если бы я знал как посчитать
Да очень просто. Это же обычная арифметика.

10 бит - ~1000 дискрет. 30 вольт делим на 1000 - получаем 30 мв на 1 дискрету. Это получилось разрешение вашего АЦП.

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

Вы уже, на сколько помню, создавали подобную тему. И в ней была, на сколько я помню, такая же "проблема".

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
    • Типа такого: https://aliexpress.ru/item/2044864227.html?sku_id=58855020183
    • поняли неправильно. У ТЛ494 никакой защиты нет, усилители ошибки не защита, они не должны приводить к ложным импульсам. Причем тут "микруха" ?  надо нагружать ВСЁ. До сих пор вообще непонятно о каком ИИП идет речь и сколько у него каналов. Бесполезно схему рисовать? - Помогать так бесполезно. Картина кривая по самое "немогу" продолжаются картинки, снятые через ногу и без цены деления.
×
×
  • Создать...