Всем любителям дешевизны посвящается
В данной теме пытаюсь собрать зарядку для электромобиля со свободным ПО и регулируемым током из доступных деталей. Буду благодарен за помощь в разработке.
на основе материалов изложеных по следующей ссылке:
https://www.instructables.com/id/Arduino-EV-J1772-Charging-Station/
Защита Узо отдельным блоком, реле отдельным модулем, светодиод отдельным модулем,включать заряд реле 30 А или пускатель можете выбрать самостоятельно.
Еще нужно добавить несколько терморезисторов для измерения температуры пистолета самого блока и вилки где он подключается в розетку (пока в разработке.)
Перечень материалов:
Коробка пластиковая 200*100*70
Ардуино уно
набор радиокомпонентов на 5 долларов.
двухполярная dc-dc повышайка для ОУ
модуль дисплея, модуль реле, модуль светодиод , уно прото шилд.
Красивая кнопка герметичная лифтовая, можно с подсветкой :)
Действия
На прото шилде собираем схему измерения тока и схему подачи шим на базе ОУ.
фото схему и фото добавлю чуть позже.
оцилографом проверяем корректность работы шим.
Up to 51A Amps = Duty cycle x 0.6 Duty cycle = Amps / 0.6
10% 6A
20% 12A
30% 18A
код программы буду благодарен за помощь.
01 | #include <LiquidCrystal_I2C.h> |
02 | LiquidCrystal_I2C lcd(0x27,20,4); |
08 | int tiks1,tiks2,tiks3,tiks4,tiks5; |
11 | const int analogInPin = A1; |
13 | const int buttonPin = 14; |
24 | pinMode(grePin, OUTPUT); |
25 | pinMode(bluPin, OUTPUT); |
26 | pinMode(redPin, OUTPUT); |
27 | pinMode(14, INPUT_PULLUP); |
29 | TCCR1A = TCCR1A & 0xe0 | 1; ///установка режима шим на 10 выход 978 герц |
30 | TCCR1B = TCCR1B & 0xe0 | 0x0b; ///установка режима шим на 10 выход 978 герц |
36 | buttonState = digitalRead(buttonPin); |
37 | if (buttonState == HIGH) { |
39 | prevbutt=1; delay (50); |
41 | if (sostoyanie ==1){regim++;regim++;tikdisp=500; if (regim>=18){regim=6;} lcd.clear();} |
45 | if (regim==6) { analogWrite(10, 24);} |
46 | if (regim==8) { analogWrite(10, 31);} |
47 | if (regim==10){ analogWrite(10, 39);} |
48 | if (regim==12){ analogWrite(10, 46);} |
49 | if (regim==14){ analogWrite(10, 53);} |
50 | if (regim==16){ analogWrite(10, 61);} |
53 | tikdisp++; if (tikdisp>500){ |
54 | /////////////////////////выводим на дисплей |
55 | lcd.setCursor(1,0); lcd.print( "UA OPEN CHARGE" ); |
56 | if (sostoyanie ==1){lcd.setCursor(0,1); lcd.print( "UAOC Not Connected " );} |
57 | if (sostoyanie ==2){lcd.setCursor(0,1); lcd.print( "UAOC Connected " );} |
58 | if (sostoyanie ==3){lcd.setCursor(0,1); lcd.print( "UAOC Charging " );} |
59 | if (sostoyanie ==4){lcd.setCursor(0,1); lcd.print( "UAOC Ventilation Req. " );} |
60 | if (sostoyanie ==5){lcd.setCursor(0,1); lcd.print( "UAOC diod test failed " );} |
61 | lcd.setCursor(0,2); lcd.print( "charg current:" ); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print( "A" ); |
62 | lcd.setCursor(0,3); lcd.print( "count:" );lcd.setCursor(7,3); lcd.print(count,1);lcd.setCursor(12,3); lcd.print( "kWh" ); |
63 | //////////// моргаем светодиодом |
64 | digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW); |
65 | if (sostoyanie ==1){ digitalWrite(grePin, HIGH);} |
66 | if (sostoyanie ==2){ digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);} |
67 | if (sostoyanie ==3){ digitalWrite(bluPin, HIGH);} |
68 | if (sostoyanie ==4){ digitalWrite(redPin, HIGH);} |
69 | if (sostoyanie ==5){ digitalWrite(redPin, HIGH);digitalWrite(bluPin, HIGH);} |
73 | sensorValue = analogRead(analogInPin); |
75 | if (sensorValue>500){higeside=sensorValue;} |
76 | if (sensorValue<500){lowside=sensorValue; } |
78 | /////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов |
80 | if (higeside<900 ) {tiks5++; if (tiks5>=50){tiks5=50; }} else { tiks5 --; if (tiks5<=0){tiks5=0;};} |
81 | if (higeside>900&& lowside>420 ) {tiks4++; if (tiks4>=50){tiks4=50; }} else { tiks4 --; if (tiks4<=0){tiks4=0;};} |
82 | if (higeside>900&& lowside>340 && lowside<420 ) {tiks3++; if (tiks3>=50){tiks3=50; }} else { tiks3 --; if (tiks3<=0){tiks3=0;};} |
83 | if (higeside>900&& lowside>250 && lowside<340 ) {tiks2++; if (tiks2>=50){tiks2=50; }} else { tiks2 --; if (tiks2<=0){tiks2=0;};} |
84 | if (higeside>900&& lowside<250 ) {tiks1++; if (tiks1>=50){tiks1=50; }} else { tiks1 --; if (tiks1<=0){tiks1=0;};} |
86 | if (tiks5>=30){sostoyanie = 5;tikdisp=500;} |
87 | if (tiks4>=30){sostoyanie = 4;tikdisp=500;} |
88 | if (tiks1>=30){sostoyanie = 1;tikdisp=500;} |
89 | if (tiks2>=30){sostoyanie = 2;tikdisp=500;} |
90 | if (tiks3>=30){sostoyanie = 3;tikdisp=500;} |
добавки к проекту схемы распайки модулей.
если вы покупаете модули то первые две схемы Вам не нужны. Только последняя для подачи шим на вывод авто.
код программы буду благодарен за помощь.
пока не понятно, какая помощь требуется
Нет
помогите пож. сделать несущую частоту ШИМ в пределах стандарта 980-1020 гц.
Проверю спасибо, пока только меньше 980 получалось.
помогите пож. сделать несущую частоту ШИМ в пределах стандарта 980-1020 гц.
Вот здесь есть пример как делать ШИМ произвольной частоты.
эта ветка для оконченных проектов.
Сгорела машина.
Да уж
"окончательный код" ? - кровь из глаз... Может вы хотели сказать "черновик" ?
Вместо пяти -шести одинаковых условий используйте switch - case. ... А на месте быстрого накручивания переменных tiks3 и подобное... может просто два раза прочитать порт с небольшой задержкой?
В строке 96 грубая ошибка, время так считать нельзя
Пожалуй черновик.
Все поправлю.
Только в строка 96 не понял почему нельзя?
читайте
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
Все поправлю.
Только в строка 96 не понял почему нельзя?
Подскажите что в итоге с ваше зарядкой для leaf?
Тоже интересна тема. Что в итоге получилось? Можно повторять?
Вангую, ТС, с его познаниями, сгорел в аццком пламени взорвавшихся литиевых батарей.
не стоит, код полный....
Судя по коду, автору лет тринадцать...
ну по крайней мере старался разобраться.
Хочется повторения но без выбора тока, с отображением потребленной энергии. Китайцы вовсю уже шлепают но ценник конский. Пистолет есть а вот остальное предстоит собрать. Смотрю варианты.....
Смотрю варианты.....
если вы программист - не надо "смотреть варианты", пишите сами. А если нет - ей богу, лучше переплатите китайцам, потому как невежественные автокулибины немного надоели тут...
Машина сгорела.
поправил код:
001
#include <LiquidCrystal_I2C.h>
002
#include <EEPROM.h>
003
004
LiquidCrystal_I2C lcd(0x27,20,4);
// адрес дисплея бывает 0x3F
005
unsigned
long
currentTime;
//тайминг
006
unsigned
long
loopTime;
//тайминг
007
int
prevbutt =1;
// переменная для кнопки
008
int
regim=EEPROM.read(1);;
// переменная режим зарядки
009
int
prevregim=1;
010
int
sostoyanie=5;
//(состояние подключения от 1 до 5)
011
int
prevsost=5;
//(состояние подключения от 1 до 5)
012
int
higeside=0;
//переменная пик вольтажа
013
int
lowside=0;
//минимум вольтажа
014
int
hs=0;
//переменная пик вольтажа старый
015
int
ls=0;
//переменная низ вольтажа старый
016
int
so=0;
017
int
timerh=0;
018
int
timerm=0;
019
int
timetik=0;
020
byte
timecheck=0;
021
int
tiks1,tiks2,tiks3,tiks4,tiks5;
//переменные уменьшающие количество ошибок
022
int
tikdisp=0;
//переменная обновления дисплея
023
int
sensorValue;
// переменная в которую читаем показания вольтажа
024
const
int
analogInPin = A1;
//на каком порту мерять напряжение
025
float
count = 0;
//будет счетчик киловатт
026
const
int
buttonPin = 14;
// на каком порту кнопка
027
const
int
grePin = 11;
// на каком порту зеленый светодиод
028
const
int
redPin = 13;
// на каком порту красный светодиод
029
const
int
bluPin = 12;
// на каком порту голубой светодиод
030
const
int
pwmout = 10;
// на каком порту шим выход на ОУ
031
const
int
relePin= 3
032
033
;
// на каком порту шим выход на ОУ
034
int
buttonState = 0;
// переменная для кнопки
035
int
outputValue = 0;
// исходящее значение PWM шим на ОУ
036
int
flagt;
037
void
setup
() {
038
Serial
.begin(9600);
// раскоментировать для отстройки напряжений с аналогового порта
039
lcd.init();
// инициализация дисплея
040
lcd.backlight();
// включить подсветку
041
pinMode(grePin, OUTPUT);
//назначение выходов
042
pinMode(bluPin, OUTPUT);
//назначение выходов
043
pinMode(redPin, OUTPUT);
//назначение выходов
044
pinMode(relePin, OUTPUT);
//назначение выходов
045
pinMode(14, INPUT_PULLUP);
//назначение выходов
046
pinMode(9, OUTPUT);
047
pinMode(10, OUTPUT);
048
049
cli();
050
TCCR1A = bit(COM1A0) | bit(COM1A1) | bit(COM1B1);
051
TCCR1B = bit(WGM13) | 3;
052
ICR1 = 125;
053
OCR1A = OCR1B = 25;
054
sei();
055
if
(regim!=6 &®im!=8 &®im!=10 &®im!=12 &®im!=14 &®im!=16 &®im!=24 ) {regim=6 ; }
056
OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ;
057
}
058
059
void
loop
() {
060
061
if
(sostoyanie ==1 ){
062
buttonState = digitalRead(buttonPin);
// читаем состояние кнопки
063
if
(buttonState == HIGH) {
// если нажата
064
if
(prevbutt==0){
// если предидущее отпущено
065
prevbutt=1; delay (50);
// антидребезг
066
flagt=0;
067
lcd.clear();
068
regim++;regim++;
if
(regim>=26){regim=6; }
069
OCR1A = OCR1B = regim*2;EEPROM.write(1, regim) ;
// при нажатии меняем режим зарядки только при статусе неподключено
070
}}
else
{prevbutt=0;}
// кнопка отпущена
071
}
072
073
074
075
sensorValue = analogRead(analogInPin);
// читаем показания аналогового порта для выбора режима работы
076
if
(sensorValue>500){higeside=sensorValue;}
// если показания больше 500 это пик
077
if
(sensorValue<500){lowside=sensorValue; }
// если показания меньше 500 это низ
078
079
/////////////////выбор состояния подключения в зависимости от состояния на аналоговом порту защита от быстрой перемены режимов
080
081
if
(lowside>250 ) {tiks5++;
if
(tiks5>=15){tiks5=15; }}
else
{ tiks5 --;
if
(tiks5<=0){tiks5=0;};}
082
if
(higeside<680&& lowside<250 &&higeside>580 ) {tiks4++;
if
(tiks4>=15){tiks4=15; }}
else
{ tiks4 --;
if
(tiks4<=0){tiks4=0;};}
083
if
(higeside<780&& lowside<250 &&higeside>680 ) {tiks3++;
if
(tiks3>=15){tiks3=15; }}
else
{ tiks3 --;
if
(tiks3<=0){tiks3=0;};}
084
if
(higeside<880&& lowside<250 &&higeside>780 ) {tiks2++;
if
(tiks2>=15){tiks2=15; }}
else
{ tiks2 --;
if
(tiks2<=0){tiks2=0;};}
085
if
(higeside>880&& lowside<250 ) {tiks1++;
if
(tiks1>=15){tiks1=15; }}
else
{ tiks1 --;
if
(tiks1<=0){tiks1=0;};}
086
087
if
(tiks5>=10){sostoyanie = 5;
if
(prevsost!=5){prevsost=5;flagt=0;}}
088
if
(tiks4>=10){sostoyanie = 4;
if
(prevsost!=4){prevsost=4;flagt=0;}}
089
if
(tiks1>=10){sostoyanie = 1;
if
(prevsost!=1){prevsost=1;flagt=0;}}
090
if
(tiks2>=10){sostoyanie = 2;
if
(prevsost!=2){prevsost=2;flagt=0;}}
091
if
(tiks3>=10){sostoyanie = 3;
if
(prevsost!=3){prevsost=3;flagt=0;}}
092
093
/////////////////////////////////////////////////////////быстрая часть
094
currentTime = millis();
// считываем время, прошедшее с момента запуска программы
095
if
((currentTime-loopTime) > flagt)
096
{
097
098
/////////////////////////выводим на дисплей
099
lcd.setCursor(1,0); lcd.print(
"UA OPEN CHARGE"
);
100
if
(sostoyanie ==1){lcd.setCursor(0,1); lcd.print(
" Not Connected "
);timerm=0;timerh=0;}
101
if
(sostoyanie ==2){lcd.setCursor(0,1); lcd.print(
" Connected "
);}
102
if
(sostoyanie ==3){lcd.setCursor(0,1); lcd.print(
" Charging "
);}
103
if
(sostoyanie ==4){lcd.setCursor(0,1); lcd.print(
" Vent. Req "
);}
104
if
(sostoyanie ==5){lcd.setCursor(0,1); lcd.print(
" Diod test failed"
);}
105
if
(sostoyanie !=3){timecheck--;}
else
{timecheck++;}
if
(timecheck==6){timecheck=1;timerm++;}
if
(timecheck<0){timecheck=0;}
106
if
(timerm==60){timerh++;timerm=0;}
if
(timerm<0){timerm=0;}
107
lcd.setCursor(0,2); lcd.print(
"charg current:"
); lcd.setCursor(14,2); lcd.print(regim);lcd.setCursor(17,2); lcd.print(
"A"
);
108
lcd.setCursor(0,3); lcd.print(
"timer:"
); lcd.setCursor(8,3); lcd.print(timerh);lcd.setCursor(10,3); lcd.print(
"h "
);lcd.setCursor(12,3);lcd.print(timerm); lcd.print(
" m"
);
109
110
// раскоментировать для теста напряжения
111
//lcd.setCursor(16,3);lcd.print(higeside,0);
112
113
//////////// моргаем светодиодом
114
digitalWrite(grePin, LOW);digitalWrite(bluPin, LOW);digitalWrite(redPin, LOW);
115
if
(sostoyanie ==1){ digitalWrite(grePin, HIGH);}
116
if
(sostoyanie ==2){ digitalWrite(grePin, HIGH);digitalWrite(redPin, HIGH);}
117
if
(sostoyanie ==3){ digitalWrite(bluPin, HIGH);}
118
if
(sostoyanie ==4){ digitalWrite(redPin, HIGH);}
119
if
(sostoyanie ==5){ digitalWrite(redPin, HIGH);}
120
if
(sostoyanie ==3){ digitalWrite(relePin, HIGH);}
else
{digitalWrite(relePin, LOW);}
121
122
123
//
124
loopTime= currentTime;
125
flagt=10000;
//такт проход
126
127
//отправка в сериал напряжений для настройки
128
//следующие 9 строк можно закоментировать
129
130
//Serial.print ("LS = "); Serial.println (lowside);
131
//Serial.print ("HS = "); Serial.println (higeside);
132
//Serial.print ("regim = ");
133
//if (sostoyanie ==1){Serial.println(" Not Connected ");}
134
//if (sostoyanie ==2){Serial.println(" Connected ");}
135
//if (sostoyanie ==3){Serial.println(" Charging ");}
136
//if (sostoyanie ==4){Serial.println(" Vent. Req ");}
137
//if (sostoyanie ==5){Serial.println(" Diod test failed");}
138
//Serial.println(" ");// раскоментировать для отстройки напряжений
139
140
}
141
}
поправил код:
код все такой же кривой, как и раньше
Мужики, простой вопрос: что эта тема делает в "проектах"?
Сгорела машина
Есть варианты удалить все свои темы с форума?
Есть варианты удалить все свои темы с форума?
Прошу не повторять моих ошибок, машина сгорела. Закройте ветку пока другие люди не повредили свое имущество. Никому не рекомендую повторять.
Прошу удалить тему или закрыть пожалуйста.
Абсолютно не удивлен. О том, что с твоими навыками не стоит лезть в автоэлектрику - тебя предупреждали еще в начале темы.
Зря потер свою сообщения, где ты доказывал. что "код и такой сойдет, лишь бы дешево....". С ними картинка была бы полнее.
Модераторы, предлагю оставить эту тему как назидание другим безголовым автокулибиным. Закройте редактирование, скройте код, но не удаляйте сообщения.
Да согласен.
фоточки будут?
это не оно?