Вопрос по ШИМу. Зависает Arduino

psina82
Offline
Зарегистрирован: 13.04.2017

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

Нужно накачать конденсатор большой емкости и большим напряжением. Третью ногу ардуино нано вывел на затвор полевика с подтяжкой на землю через резистор 10кОм. В части, где расположен конденсатор, установил делитель из резисторов 12кОм и 470кОм, чтобы мерить напряжение и не перекачать кондер. Все это выводится на дисплей OLED. Ардуино питается от USB и общего питания с основной платой пока нет (для отладки). Сама плата питается от 4 банок 18650 (14,8V).

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

А дальше в ход идет моя программа - подается шим-сигнал на затвор полевика и конденсатор "накачивается", отображая напряжение на дисплее. Стоит условие, шимить до тех пор, пока не накачает до 40 вольт (условно).

Но, подняв напряжение на 10-15 вольт, ардуино зависает, дисплей выключается, условие накачки пропускается и качает до бесконечности. Отключаю питание, включаю снова - на дисплее правильное напряжение (больше 40 вольт), следовательно накачка не идет дальше. Поднимаю в условиях до 60, запускаю - опять накачает на 10-15 вольт и зависание с бесконечным шимом. По мультиметру вижу, что напряжение растет, да и дроссель слышно как пищит.

Уже весь мозг сломал. Что я не учел? Выкладываю часть кода

#include <OLED_I2C.h>
const int nak = 3;  //накачка
const int napr = A7; //напряжение на кондере
const int scl = A5; //дисплей SCL
const int sda = A4; //дисплей SDA
float NaprKond = 0; //показание напряжения конденсатора

OLED  myOLED(sda, scl, 8);
extern uint8_t SmallFont[];

void setup() {
  myOLED.begin();
  myOLED.setFont(SmallFont);
}

void loop() {
  NaprKond = float(analogRead(napr)*0.183);
  
  myOLED.clrScr();
  myOLED.print("Capacitor: " + String(NaprKond) + "V", LEFT, 0);
  myOLED.update();

  if (NaprKond < 30.00) {
    analogWrite (nak, 5);
    myOLED.print("Charging...", CENTER, 50);
    myOLED.update();
  }
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а земли объеденил?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А схему подключения можно посмотреть?

psina82
Offline
Зарегистрирован: 13.04.2017

Земли объединил. Часть схемы выкладываю. Остальная часть, думаю, не важна.

Схема, наверное, кривовато сделана... Только учусь

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

преобразователь для гаусса мастеришь?

psina82
Offline
Зарегистрирован: 13.04.2017

jeka_tm пишет:

преобразователь для гаусса мастеришь?

Электроударник для PCP-винтовки

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

драйвер полевика поставь, хоть на 555 таймере

psina82
Offline
Зарегистрирован: 13.04.2017

Драйвер IR4427 стоит по схеме. Хотя, для моих мосфетов он и не нужен

psina82
Offline
Зарегистрирован: 13.04.2017

Может я не так понял, драйвер на накачивающий полевик поставить? Я использую IRL530N, ему не нужен драйвер. Только на полевике соленоида поставил.

Схему я брал с рабочего проекта. Есть у меня примерно такая же плата, управляемая PIC'ом. Но мне нужно расширить функционал платы, а для этого пика не хватает. Да и разбираться в программировании пиков не хочется.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

а насчет тянет, я бы не был так уверен. лишний нагрев полевика покажет нужен или нет

psina82
Offline
Зарегистрирован: 13.04.2017

Зависает. Изображение на дисплее тоже зависает. Если кидаю значение в ком-порт, то тоже после зависания ничего не шлет.

Если больше - то условие просто не должно выполняться, а должен выводить напряжение на экран и при это этом должна пропасть надпись "Charging..." и шим-сигнал прекратиться должен

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у тебя неверное представление. условие не выполнится, а вот шим каким был таким и останется

вольтметром проверял на аналоговом пине напряжение? может условие выполняется. просто ты неверно расчитал делитель

ты ардуину используешь или мегу8 какую нибудь?

psina82
Offline
Зарегистрирован: 13.04.2017

После перезапуска платы, условие не выполняется же. Значит, все верно у меня указано. Сравниваю я значение переменной, а не напряжения. На ноге в это время около 0.8 вольт.

Ардуино нано, Mega328

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

почему после перезапуска не выполняется? в смысле не зависает и правильно работает?

код совсем простой. хз что с ним не так. но все таки если напряжение выше допиши условие

psina82
Offline
Зарегистрирован: 13.04.2017

jeka_tm пишет:

почему после перезапуска не выполняется? в смысле не зависает и правильно работает?

Работает, потому что больше ШИМа нет. Показывает правильное напряжение на конденсаторе и не пытается накачать его дальше

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

допиши условие. сколько можно херней страдать

psina82
Offline
Зарегистрирован: 13.04.2017

Ну ок. Специально для тебя

#include <OLED_I2C.h>
const int nak = 3;  //накачка
const int napr = A7; //напряжение на кондере
const int scl = A5; //дисплей SCL
const int sda = A4; //дисплей SDA
float NaprKond = 0; //показание напряжения конденсатора

OLED  myOLED(sda, scl, 8);
extern uint8_t SmallFont[];

void setup() {
  myOLED.begin();
  myOLED.setFont(SmallFont);
}

void loop() {
  NaprKond = float(analogRead(napr)*0.183);
  
  myOLED.clrScr();
  myOLED.print("Capacitor: " + String(NaprKond) + "V", LEFT, 0);
  myOLED.update();

  if (NaprKond < 30.00) {
    analogWrite (nak, 5);
    myOLED.print("Charging...", CENTER, 50);
    myOLED.update();
  }
  else {
    //тест
  }
}

Те же яйца, вид сбоку

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а нифига. ты овен по зодиаку что ли? реально упертый

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

#include <OLED_I2C.h>
const int nak = 3;  //накачка
const int napr = A7; //напряжение на кондере
const int scl = A5; //дисплей SCL
const int sda = A4; //дисплей SDA
float NaprKond = 0; //показание напряжения конденсатора

OLED  myOLED(sda, scl, 8);
extern uint8_t SmallFont[];

void setup() {
  myOLED.begin();
  myOLED.setFont(SmallFont);
}

void loop() {
  NaprKond = float(analogRead(napr)*0.183);
  
  myOLED.clrScr();
  myOLED.print("Capacitor: " + String(NaprKond) + "V", LEFT, 0);
  myOLED.update();

  if (NaprKond < 30.00) {
    analogWrite (nak, 5);
    myOLED.print("Charging...", CENTER, 50);
    myOLED.update();
  }
  else {
    analogWrite (nak, 0);
  }
}

 

psina82
Offline
Зарегистрирован: 13.04.2017

Нашел осцилограф, подключил. В момент когда ардуино зависает, идут прострелы в -7 вольт на ноге накачки. Это, видимо, и есть причина зависания...

Теперь вопрос, откуда они берутся.

И почему у меня качает, только когда значение digitalWrite меньше 10 стоит. Ставлю 10 и больше - упирается накачка в 20-30 вольт

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

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

и параллельно катушке или транзистору нужно диод поставить от выбросов

 

psina82
Offline
Зарегистрирован: 13.04.2017

Выпаял из рабочей пикавской платы дроссель - действительно, я накосячил с намоткой. Вместо 12 витков в два слоя, намотал всего 6. С этой чуть стабильнее получается - до 36 вольт качает и зависает.

Но в той плате компоненты все те же самые стоят. Тот же полевик, эта же катушка...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

частота значит выше. и от выбросов нжуна защита. ссылку на ту схему дай

psina82
Offline
Зарегистрирован: 13.04.2017

Защита стоит вроде как

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

дай уже свой пример, на основе которого делаешь и свою схему

psina82
Offline
Зарегистрирован: 13.04.2017

Так выше же я выложил плату на PIC'е, которая у меня работает (ну как работает, выходные мосфеты периодически горят). А моя схема, по которой я собираю, выше есть. Там в обвязке не хватает только кнопок и разрядки конденсатора, но они и не нужны. Сейчас на плате разрядные резисторы даже не запаяны

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

тогда решай проблему выбросов на затворе, которые попадают на ардуину

и ты не давал ссылку

psina82
Offline
Зарегистрирован: 13.04.2017
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

с пиком дохлая ссылка

psina82
Offline
Зарегистрирован: 13.04.2017
psina82
Offline
Зарегистрирован: 13.04.2017

вернул обратно плюсовую дорожку от общей платы к ардуино и перестала плата зависать.

Собственно, дорожку общую резал, чтобы прошивать можно было и сразу тестировать. А из-за питания от USB и одновременно от платы, атмега перегревалась

psina82
Offline
Зарегистрирован: 13.04.2017

Чтобы не создавать новую тему, спрошу тут. Вопрос уже не по ШИМу.

Горят выходные транзисторы (200В, 130А)

  if (buttonState == LOW) {   
    // выстрел    
    digitalWrite(RUN, HIGH);
    delay(10);
    digitalWrite(RUN, LOW);
    delay(3000);
  }

RUN - пин, выходящий на ногу транзистора. Delay'ем пытаюсь установить паузу открытия транзистора. Если ставлю 3-9, то транзистор не открывается. А на 10 - открывается и сразу сгорает. Напряжение на конденсаторе поставил около 80 вольт, параллельно соленоиду стоит диод шоттки VS-31DQ10TR. Два выходных полевика подключены параллельно IRFB4227PBF.

Драйвер убрал из схемы, потому что на затвор полевика нужно от 3 до 5 вольт подавать.

Почему не открывается полевик при задержке меньше 10 мс и почему сгорает на 10? Мне кажется, проблема в коде...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. драйвер зря убрал

2. открывается на полную от 7В. лучше сразу 12В

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

проблема в схеме!

psina82
Offline
Зарегистрирован: 13.04.2017

С драйвером на пике тоже сгорали полевики... Думал, что проблема в драйвере, т.к. на затвор приходило +15В

С delay, как я понял, точности никакой не будет?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

импульсный ток расчитывал? выбросы точно гасишь?

например в гауссе на 350В у меня стоят тиристоры на 1200В. прикладываю картинку какие токи там

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

psina82
Offline
Зарегистрирован: 13.04.2017

Импульсный ток не знаю как рассчитать... Думал, что шоттки справится с этим.

Конденсатор стоит 100В 10000мкф, источник питания планируется 4 х 18650 либо 4 баночная LiPo, сейчас для тестов использую блок питания от ноутбука (15В 1.2А), драйвер, соответственно, берет питание оттуда. Чтобы питать ардуино, стоит 78L05, думаю, если взять питание драйвера от него, то не выдержит стабилизатор.

Проблема с полевиками у меня постоянно. Я их уже десятка два нажег, еще на плате с пиком. Стреляю - все нормально, 2-3 десятка выстрела, ничего не греется. Чуть полежит, один выстрел - и дохнет полевик. Изначально по схеме стоял супрессор 1.5KE100A (1500Вт, 100В) параллельно соленоиду, при этом полевики горели, теперь вот поставил VS-31DQ10TR, но проблема осталась.

По поводу теории - вполне может быть. Надо проверить. Но для этого придется плату заново разводить с драйвером. Нет у меня монтажной под рукой.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

100В 10000мкф))) ну тут смотря какая катушка. у меня 350В 680мкф параметры катушки на фото выше. так там импульсный ток 342А)) и то только потому что конденсатор разряжается, если бы емкость была больше и 500А было бы и выше в записимости от катушки. ставь драйвер, ставь несколько полевиков параллельно, 4-6. без питания подай импульсы, посмотри что на затворах, может одного драйвера не хватит раскачать такое количество полевиков

psina82
Offline
Зарегистрирован: 13.04.2017

Вот моя катушка с ударником

14.5 мм диаметр катушки, 45 мм длина, на которую наматывал провод. Сам провод 0.8 мм, 4 слоя, сопротивление 0.7 ом.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у меня 6мм диаметр, 20 длина 14 слоев. провод 0,8. и расчетное сопротивление 0,05 по той программе

странно что так мало слоев провода

psina82
Offline
Зарегистрирован: 13.04.2017

поставил драйвер. Все то же самое. На небольших значениях delay не открывается транзистор. Ставлю 10 - опять КЗ получается и транзистор дохнет. Мне оптимально 3-4 мс поставить надо

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты на затворе смотрел что у тебя? без нагрузки

с драйвером и без

psina82
Offline
Зарегистрирован: 13.04.2017

Все, нашел косяк. Неправильно драйвер подключал. Теперь все работает.

Теперь надо сделать программируемый импульс, чтобы его можно было настроить в "поле" при помощи спускового крючка. И зашить в eeprom.

Только импульс надо будет записывать в сотнях микросекунд

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты так долго не мог найти ошибку в подключении драйвера?

psina82
Offline
Зарегистрирован: 13.04.2017

jeka_tm пишет:

ты так долго не мог найти ошибку в подключении драйвера?

не в нем ошибку искал сначала. Случайно даташит открыл и понял в чем дело

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

случайно открыл даташит))) ну как так можно, я думал ты уже все исключил и только потом обратился с проблемой. какой я наивный

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ну хоть чесно, а то большинство - всем спасибо проблема решилась сама сабой, а некотырые начинают фантазировать, типо разорвал землю и все завелось.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

jeka_tm пишет:

случайно открыл даташит))) ну как так можно, я думал ты уже все исключил и только потом обратился с проблемой. какой я наивный

"Если ничто другое не помогает, прочтите, наконец, инструкцию!" (с) Аксиома Кана

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Jeka_M пишет:

"Если ничто другое не помогает, прочтите, наконец, инструкцию!" (с) Аксиома Кана

Дали, были люди, умели говорить ... а щас всё по простому и по сермяжному: "RTFM || GTFO" :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

RTFM я не тот программист, у меня нет такого в обиходе. А второе первый раз встречаю)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

jeka_tm пишет:

RTFM я не тот программист, у меня нет такого в обиходе. А второе первый раз встречаю)

Да, ладно, подзабыли просто

Read The Fucking Manual || Get The Fuck Out

В общем, "учи матчасть или иди нах" - очень часто хочется так ответить на посты, начинающиеся с фразы "я - новичок" :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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