На транзистор практически любой импульсный, на двигатель - из расчета максимального тока двигателя.
sany_sch пишет:
Как организовать аппаратную защиту мосфета?
При превышении некоторого значения тока, транзистор нужно закрывать до следующего импульса, причем сделать это на логике, а не программно.
sany_sch пишет:
Почему нельзя програмно? если поставить датчик тока, и показания равны 0, тоесть двигатель стоит, то ШИМ не более 5 или 10. (найти эксперементально) . и дальше добавдляем по 1. Тогда будут исключены резкие запуски двигателя.
Потому что нет гарантии, отсутствия ошибок в программе, невозможности сбоев и что ардуина работает быстрее, чем нарастает ток.
Так номиналы считать нужно, основываясь на токе ограничения и шунте. А я их не знаю. Могу лишь заложиться на какие либо значения, что бы по образу и подобию можно было посчитать.
Если шунт 0.1 Ом, ток ограничения 5А - падение на шунте 0.5 В. Следовательно делитель на другом входе опера должен давать те же 0.5 В. Например нижний 510 Ом, верхний 4.7 кОм дадут 0.489 В, т.е. ток 4.89А. Номинал сопрота от шунта к оперу принципиального значения не имеет, например пусть будет 5-10 кОм.
Всё же решил делать на симистре. Судя по отзывам на этом сайте на постоянке с управлением на транзисторе выходит сложно. Нужен выпрямитель, сетевой фильтр, защита по току, всё это конечно можно приодолеть, я расчитывал на блок питания от копмпьютера, там всё это есть, но нашёл очень удачное решение вот здесь: http://www.cncmasterkit.ru/viewtopic.php?f=3&t=1565 Если меня это не устроит, буду делать на постоянке. Там решена проблема с delite благодаря таймерам: код самый последний в теме, правда нашёл я там две ошибки. Очень важно, что в коде есть PID регулеровка. Есть там и дисплей, у меня он как раз завалялся, думаю, что лишнем не будет если на нём будет отражаться частота вращения (стоит он не дорого). Сегодня проверил на осциллографе, ардуинка работает. Осталось наладить под свой двигатель и свой тахогенератор.
Код с исправлениями и я выбрассил из него, на мой взгляд, лишние:
А я продолжу мучить транзисторы. В силовую цепь, по совету Будимира, поставлено сопротивление 0,05 Ом 5 Ватт и поставлен датчик тока 20А который ограничит ШИМ при отсутствии нагрузки. И отключит транзистор при повышенной нагрузке.
В программе избавлюсь от delay . Сброс ШИМ сделаю без задержек, а нарастание по количеству циклов. Например за 20 циклов ШИМ +1. От количества циклов будет зависить плавность пуска.
Пробуй, но я боюсь, что индукция двигателя при разных частотах будет выдавать сюрпризы. Тут и на 50 герцах, паразитные гармоники прут. Я так и не разобрался, - почему даже на симистрах двигатель иногда дёргается, хотя судя по осциллограмме сигнал чистый.
Пробуй, но я боюсь, что индукция двигателя при разных частотах будет выдавать сюрпризы. Тут и на 50 герцах, паразитные гармоники прут. Я так и не разобрался, - почему даже на симистрах двигатель иногда дёргается, хотя судя по осциллограмме сигнал чистый.
Не знаю, ищите, у меня не дёргаются, работают чисто. На лобзиковом станке раньше дёргался, закрепил лучше таходатчик, он там самодельный, и уже год всё отлично. Пользуюсь очень часто.
Не знаю, ищите, у меня не дёргаются, работают чисто. На лобзиковом станке раньше дёргался, закрепил лучше таходатчик, он там самодельный, и уже год всё отлично. Пользуюсь очень часто.
На двигателе штатный таходатчик, разобрал, посмотрел, вроде ломаться нечему. Но проблема одна, что на тда, что на ардуино, иногда может набирать обороты, когда от него этого и не требуется. Возможно дело в двигателе, я грешу на индуктивность, может межвитковое замыкание, пока не пойму.
На двигателе штатный таходатчик, разобрал, посмотрел, вроде ломаться нечему. Но проблема одна, что на тда, что на ардуино, иногда может набирать обороты, когда от него этого и не требуется. Возможно дело в двигателе, я грешу на индуктивность, может межвитковое замыкание, пока не пойму.
Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее. Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.
Сгоревшие движки обычно продолжают вращатся. И данным платам, без разницы сгоревший двигатель или нет. Она продолжает поддерживать обороты, главное чтоб симистор выдержал нагрузку.
Основная причина набора оборотов неправильные показания таходатчика. У вас тахогенератор или датчик Холла? Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.
Сделал небольшое дополнение, на мой взгляд полезное. При достижении ШИМ максимального значения загорается светодиод и сигнализирует, что большего из двигателя не "выжать".
Теперь вопрос. При экстренной остановке остаются последние показания прерываний. Как сбросить значение при отсутствии прерываний?
Сейчас просто раз в секунду, после вывода значений на экран, делаю принудительный сброс. Но понимаю, что это не правильно.
Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее. Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.
Логично, обороты у меня скакали когда датчик был отключён. Но при маленьком показании потенциометра.
sany_sch пишет:
У вас тахогенератор или датчик Холла? Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.
ТДА без таходатчика просто не запускается. Или это у вас на контроллере так было?
Было и на ардуино и tda, но с tda разобрался после того, как поменял мотор, стал работать стабильно. С ардуино разбираюсь. Оказывается прёт, какаято наводка. С таходатчика сигнал идёт чистый, а ардуино плюсует к сигналу 50 герц. Сейчас ставлю нормальное питание и тыкаю конденсаторы, пока вроде помогает. Пытаюсь разобраться с pid регулятором плавает сильно частота вращения ротора. В общем процесс идёт. А у Вас как? Двигатель работает стабильно?
И да и нет. на холостых, без нагрузки, обороты очень плавают. А при нагрузе, средней, почти стабильно.
Думаю, проблема в том, что на постоянке у таких движков присутствует так называемый "разнос". Движок, на одном напряжении, всё время набирает обороты. Разбираюсь.
Ещё не получается с датчиком тока. Из-за ШИМа показания скачут. Наверное нужен кондёр для сглаживания и усреднения. Не знаю какой и куда поставить.
Спасибо, это уже читал, и ещё что-то про ПИД регулирование.
Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор. Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.
Спасибо, это уже читал, и ещё что-то про ПИД регулирование.
Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор. Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.
Мне сложно, что посоветовать в С++ я тоже не силён. Слышал, что такого рода эксперименты можно проводить не на 220 вольт, через трансформатор. Допустим 36 вольт. Наладишь, а потом можно и в сеть. Медленно, но у меня даже от 12 вольт двигатель от стиралки вращался. А то так транзисторов не накупишься.
Я уже вторую ардуинку спалил. Прут паразитные шумы, и двигатель дёргается. Бывает часто, аж свет в комнате проседает. Может и у тебя тоже самое? Не пробовал отслеживать показания тахогенератора Serial.print, что там происходит?
Не зная алгоритма работы твоего датчика, можно предположить, что одна пара полюсов дает передний фронт (допустим, HIGH), а второй задний (возвращение в LOW).
Вот и получается деление на два. Типа четкий меандр при скважности 2.
Ты осциллограмму выходную изобрази для ясности.
Цифровые датчики Холла так же разделены на: биполярные и униполярные.
Униполярные – срабатывают при наличии поля определённой полярности и отключаются при снижении индукции поля.
Биполярные – реагируют на смену полярности поля, то есть одна полярность – включает датчик, другая – выключает.
Аналоговые датчики Холла – преобразуют индукцию поля в напряжение, величина показанная датчиком зависит от полярности поля и его силы. Но опять же, нужно учитывать расстояние, на котором установлен датчик.
sany_sch, а, понял. Ну да, выводы 9 и 10 - это выходы сравнения таймера1, (oc1a/oc1b) поскольку сам таймер занят другим делом, то шим генерить он не может)
Любая переменная. какая-нибудь. Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1. А в процессе програмы я буду на неё опираться и обнулять когда нужно.
Просто сейчас программа уже работает. и давольно сносно. Но хочу попробовать другие алгоритмы работы. Например. Пока не получен сигнал с таходатчика - ШИМ не меняем. Можно, конечно, каждый раз сравнивать тик с педидущим, но думаю, лучше просто дожидаться пока прерывание не сработает.
Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1. А в процессе програмы я буду на неё опираться и обнулять когда нужно.
После срабатывания датчика выполняется содержание ISR (TIMER1_CAPT_vect), в любом месте можно вставить holl=1; Нужно только объявить её как volatile по аналогии с другими переменными.
Attach the Zero cross pin of the module to Arduino External Interrupt pin
08
Select the correct Interrupt # from the below table (the Pin numbers are digital pins, NOT physical pins: digital pin 2 [INT0]=physical pin 4 and digital pin 3 [INT1]= physical pin 5)
09
10
Pin | Interrrupt # | Arduino Platform
11
---------------------------------------
12
2 | 0 | All
13
3 | 1 | All
14
18 | 5 | Arduino Mega Only
15
19 | 4 | Arduino Mega Only
16
20 | 3 | Arduino Mega Only
17
21 | 2 | Arduino Mega Only
18
19
In the program pin 2 is chosen
20
*/
21
22
intAC_LOAD = 3; // Output to Opto Triac pin
23
intdimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
24
25
voidsetup()
26
{
27
pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
28
attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
29
}
30
// the interrupt function must take no parameters and return nothing
31
voidzero_crosss_int() // function to be fired at the zero crossing to dim the light
32
{
33
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
34
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms
Недавно сломалась кнопка регулятора оборотов дрели. Купил в магазине новую кнопку...родной найти не удалось, и расположение дырочек не поня, что куда подключать не разобрался. В целях изучения новую кнопку разобрал и собрать не смог, В общем остались запчасти...корпус, контакты и платка управления с симистором.
Решил разобрать родную кнопку..но осторожнее. Проблема оказалось не стоила выломанного яйца. Отвалилась пайка на ножке симистора. Запаял, и дрель снова плавно регулируется.
Дрель 710 ватт, служит уже много лет. Работаю всегда на регуляторе, на полную не включаю, т.к нет необходимости, да и на полной ток идет через доп.контакт, а не через регулятор.
Вывод - симистор хорошая штука для управления мощной нагрузкой.
на tda 1085 http://www.chipmaker.ru/uploads/monthly_07_2014/post/image/post-60830-089793900%201404570276.pngзащита так и устроена. Шунты R31 R33, Ток регулируется подстроечником R21, напряжения с шунта поступает на ножку 3. В общем эту часть можно взять и перенести на ардуино, подстроечника не надо, можно програмно настроить на нужное напряжение.
Можешь полностью схему нарисовать с номиналами и пояснениями? Для чайников, так сказать.
Походу кризис жанра. Вот схема защиты для "чайников"
Это для юзеров.
А для чайника нужны номеналы.
Если шунт 0.1 Ом, ток ограничения 5А - падение на шунте 0.5 В. Следовательно делитель на другом входе опера должен давать те же 0.5 В. Например нижний 510 Ом, верхний 4.7 кОм дадут 0.489 В, т.е. ток 4.89А. Номинал сопрота от шунта к оперу принципиального значения не имеет, например пусть будет 5-10 кОм.
Всё же решил делать на симистре. Судя по отзывам на этом сайте на постоянке с управлением на транзисторе выходит сложно. Нужен выпрямитель, сетевой фильтр, защита по току, всё это конечно можно приодолеть, я расчитывал на блок питания от копмпьютера, там всё это есть, но нашёл очень удачное решение вот здесь: http://www.cncmasterkit.ru/viewtopic.php?f=3&t=1565 Если меня это не устроит, буду делать на постоянке. Там решена проблема с delite благодаря таймерам: код самый последний в теме, правда нашёл я там две ошибки. Очень важно, что в коде есть PID регулеровка. Есть там и дисплей, у меня он как раз завалялся, думаю, что лишнем не будет если на нём будет отражаться частота вращения (стоит он не дорого). Сегодня проверил на осциллографе, ардуинка работает. Осталось наладить под свой двигатель и свой тахогенератор.
Код с исправлениями и я выбрассил из него, на мой взгляд, лишние:
001
// TRIAC
002
#define triac_control 12 // Triac control - pin
003
#define open_loop 13 //
004
//RPM control
005
#define sensorPin A1 // potentiometer or MACH3 - pin
006
007
//Power
008
#define powerOn 4 // manual motor switch - pin
009
010
//Zero Detect
011
#define zero_detect 2 //Zero detect - pin
012
// when using values in the main routine and IRQ routine must be volatile value
013
volatile
byte
zero_byte = LOW;
// declare IRQ flag
014
// HIGH = 1, LOW = 0
015
016
// HALL SENSOR
017
#define hallsensor 3 // hall or optical sensor pin
018
#define hallsensor2 A4 // to check signal on hall or optical sensor pin
019
unsigned
int
rpmcount;
020
unsigned
int
rpm;
021
unsigned
long
timeold;
022
unsigned
long
time1;
023
024
//LCD
025
//LiquidCrystal::LiquidCrystal(rs, enable, d0, d1, d2, d3)
026
#include <Wire.h>
027
#include <LiquidCrystal.h>
028
LiquidCrystal lcd(5, 6, 7, 8, 9, 10);
029
030
//INTERRUPT
031
#include <avr/io.h>
032
#include <avr/interrupt.h>
033
#define PULSE 24 // pulse length on triac control pin
034
//in timer cycles (1/64 prescalar=> 4us per cycle=>96us)
035
// PID
036
#include <PID_v1.h>
037
038
//Define Variables we'll be connecting to
039
double
Setpoint, Input, Output;
040
041
//Define the aggressive and conservative Tuning Parameters
042
//double consKp=4, consKi=0.2, consKd=1;
043
//double consKp=0.4, consKi=0.001, consKd=1;
044
//double consKp=4, consKi=0.2, consKd=1;
045
//double consKp=1, consKi=0.4, consKd=0.01; //100% work
046
//double consKp=0.4, consKi=0.001, consKd=1;
047
double
consKp=1, consKi=0.4, consKd=0.01;
048
049
//Specify the links and initial tuning parameters
050
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
051
int
sensorValue=0;
052
unsigned
int
analogValue=0;
053
unsigned
int
delayValue=8000;
054
unsigned
int
rpmmin = 6000;
// Minimum and max rpm for the motor
055
unsigned
int
rpmmax = 35000;
056
unsigned
int
analogmin = 2400;
// analogmin and analogmax are the range of delay
057
unsigned
int
analogmax = 6000;
// time and fot each motor must be determined empirically
058
059
void
setup
() {
060
061
//Triac control setup
062
pinMode(triac_control, OUTPUT);
063
digitalWrite(triac_control, 0);
// triac and LED off
064
pinMode(open_loop, INPUT);
065
digitalWrite(open_loop, 1);
066
//Power switch
067
pinMode(powerOn, INPUT);
068
digitalWrite(powerOn, 1);
// pull up on
069
//Zero detect
070
pinMode(zero_detect, INPUT);
071
digitalWrite(zero_detect, 1);
// pull up on
072
attachInterrupt(0, zero_fun, FALLING);
// interrupt 0 digital pin 2 connected ZC circuit
073
// Hall sensor
074
pinMode(hallsensor2, INPUT);
075
pinMode(hallsensor, INPUT);
076
digitalWrite(hallsensor, 1);
// pull up on
077
attachInterrupt(1, rpm_fun, FALLING);
// interrupt 1 digital pin 3 connected hall sensor
078
rpmcount = 0;
079
rpm = 0;
080
timeold = 0;
081
// LCD detect
082
lcd.begin(16,2);
// initialize the lcd
083
lcd.home ();
// go home
084
lcd.print(
" Hello "
);
085
lcd.setCursor ( 0, 1 );
// go to the next line
086
lcd.print (
" GOOD LUCK "
);
087
delay(1000);
088
lcd.clear();
089
090
// set up TIMER1
091
OCR1A = 100;
//initialize the comparator
092
TIMSK1 = 0x03;
//enable comparator A and overflow interrupts
093
TCCR1A = 0x00;
//timer control registers set for
094
TCCR1B = 0x00;
//normal operation, timer disabled
095
// Serial.begin(9600);
096
//PID
097
Input = rpm;
098
Setpoint = analogValue;
099
//turn the PID on
100
myPID.SetMode(AUTOMATIC);
101
myPID.SetOutputLimits(analogmin,analogmax);
//usage of this parameters instead of
102
// rpmmin and rpmmax lets use only one mapping
103
// in PID
104
}
105
void
loop
()
106
{
107
//motor switch and indicator = ON/OFF
108
if
(!digitalRead(powerOn))
// manual or by PC
109
{
110
// digitalWrite(powerIndicator, 1);
111
zero_byte=HIGH;
112
113
///////////////RPM counter ///////////////////
114
//////////////////////////////////////////////////////////////
115
if
((millis()-timeold) >= 250)
116
{
117
//Update RPM every 250 millis, increase this for better RPM resolution,
118
//decrease for faster update
119
//rpm = 60*1000/(millis() - timeold)*rpmcount;
120
unsigned
long
time = millis() - timeold;
121
float
time_in_sec = (
float
)time / 1000;
122
float
impuls_time = (
float
)rpmcount / time_in_sec;
123
rpm = (
int
)impuls_time*60;
124
rpmcount = 0;
//reset
125
timeold = millis();
//reset time
126
127
}
128
//#######################PID ###############################
129
//##########################################################
130
analogValue = analogRead(sensorPin);
131
int
analogLevel = map(analogValue,23,833, analogmin,analogmax);
132
//here we convert the voltage on pot to delay value
133
// 23-833 is the range of voltages that I got from my pot (in 0-1023 scale)
134
analogValue = analogLevel;
135
136
if
(digitalRead(open_loop)==1)
137
{ Input = map(rpm, rpmmin,rpmmax,analogmin,analogmax);
138
// Here we put correspondance between rpm and delay values)
139
Setpoint = analogValue;
140
myPID.Compute();
141
analogValue = Output;
142
}
143
analogValue = analogmax-analogValue+analogmin;
144
// this inverts the delay values- higher rpm corrsponds to shorter delay times.
145
if
(analogValue > analogmax)
146
{analogValue = analogmax;}
147
if
(analogValue < analogmin)
148
{analogValue = analogmin;}
149
delayValue=analogValue;
// we need this as during a cycle of PID
150
//calculations analogvalue changes several times
151
//??????????????????TRIAC delay control ???????????????????
152
153
OCR1A = delayValue/4;
154
155
//**************indicator ************************
156
157
if
(rpm < 10)
158
{
159
lcd.setCursor ( 0, 0 );
160
lcd.print(
" "
);
161
lcd.print (rpm);}
162
if
(10<= rpm && rpm < 100)
163
{
164
lcd.setCursor ( 0, 0 );
165
lcd.print(
" "
);
166
lcd.print (rpm);}
167
if
(100<= rpm &&rpm < 1000)
168
{
169
lcd.setCursor ( 0, 0 );
170
lcd.print(
" "
);
171
lcd.print (rpm); }
172
if
(1000<= rpm && rpm < 10000)
173
{
174
lcd.setCursor ( 0, 0 );
175
lcd.print(
" "
);
176
lcd.print (rpm);
177
}
178
if
(10000<= rpm)
179
{
180
lcd.setCursor ( 0, 0 );
181
lcd.print (rpm);}
182
lcd.setCursor ( 7, 0 );
183
lcd.print (
"RPM"
);
184
//////// output power indicator ///////////////////////////////
185
// max power 13 bars min power bars
186
lcd.setCursor ( 0, 1 );
187
lcd.print(
" "
);
188
lcd.setCursor ( 0, 1 );
189
int
Level = map(delayValue,analogmin,analogmax, 13, 0);
190
// if the array element's index is less than ledLevel,
191
// turn the pin for this element on:
192
for
(
int
bar = 0; bar < 13; bar++) {
193
if
(bar < Level) {lcd.print(0);}
194
}
195
}
196
else
197
// when motor is OFF, the display allows to check the input of Hall sensor
198
//(or optical level)
199
{
200
// digitalWrite(powerIndicator, 0);
201
zero_byte=LOW;
202
if
(millis()-time1 >=10)
203
{ sensorValue = analogRead(hallsensor2);
204
//lcd.setCursor ( 0, 1 );
205
//lcd.print(" ");
206
lcd.clear();
207
lcd.setCursor ( 0, 1 );
208
int
sensLevel = map(sensorValue,20,1000, 0, 13);
209
// values 20,1000 is the output voltage range of sensor in 0-1023 scale (0-5V),
210
// change them according to your sensor's output
211
for
(
int
sbar = 0; sbar < 13; sbar++) {
212
if
(sbar < sensLevel) { lcd.print(0);}
213
}
214
time1=millis();
215
}
216
}
217
}
// end of loop
218
//Interrupt Service Routines
219
220
ISR(TIMER1_COMPA_vect)
//comparator match
221
{ digitalWrite(triac_control, 1);
//triac on;
222
TCNT1 = 65536-PULSE;
//trigger pulse width = PULSE
223
}
224
ISR(TIMER1_OVF_vect)
//timer1 overflow
225
{
226
digitalWrite(triac_control, 0);
//turn off triac gate
227
TCCR1B = 0x00;
//disable timer stop unintended triggers
228
}
229
230
void
zero_fun()
//zero detect
231
{
if
(zero_byte)
232
{ TCCR1B=0x03;
//start timer with divide by 64 input
233
TCNT1 = 0;
//reset timer - count from zero
234
}
235
}
236
237
void
rpm_fun()
238
{
239
rpmcount++;
240
//Each rotation, this interrupt function is run
241
}
Правда до конца с кодом ещё не разобрался. Например не пойму куда подключён pin d13
А я продолжу мучить транзисторы. В силовую цепь, по совету Будимира, поставлено сопротивление 0,05 Ом 5 Ватт и поставлен датчик тока 20А который ограничит ШИМ при отсутствии нагрузки. И отключит транзистор при повышенной нагрузке.
В программе избавлюсь от
delay
. Сброс ШИМ сделаю без задержек, а нарастание по количеству циклов. Например за 20 циклов ШИМ +1. От количества циклов будет зависить плавность пуска.А я продолжу мучить транзисторы.
Пробуй, но я боюсь, что индукция двигателя при разных частотах будет выдавать сюрпризы. Тут и на 50 герцах, паразитные гармоники прут. Я так и не разобрался, - почему даже на симистрах двигатель иногда дёргается, хотя судя по осциллограмме сигнал чистый.
А я продолжу мучить транзисторы. В силовую цепь, по совету Будимира, поставлено сопротивление 0,05 Ом 5 Ватт
0,5 ома, если это как в схеме на tda 1085
Пробуй, но я боюсь, что индукция двигателя при разных частотах будет выдавать сюрпризы. Тут и на 50 герцах, паразитные гармоники прут. Я так и не разобрался, - почему даже на симистрах двигатель иногда дёргается, хотя судя по осциллограмме сигнал чистый.
Не знаю, ищите, у меня не дёргаются, работают чисто. На лобзиковом станке раньше дёргался, закрепил лучше таходатчик, он там самодельный, и уже год всё отлично. Пользуюсь очень часто.
0,5 ома, если это как в схеме на tda 1085
да, как на ТДА. Там 2 сопротивления параллельно по 0,1 Ом. В сумме дадут 0,05Ом. Или я чего-то не понял?
да, как на ТДА. Там 2 сопротивления параллельно по 0,1 Ом. В сумме дадут 0,05Ом. Или я чего-то не понял?
Правильно, это я, что-то просчитался!
Не знаю, ищите, у меня не дёргаются, работают чисто. На лобзиковом станке раньше дёргался, закрепил лучше таходатчик, он там самодельный, и уже год всё отлично. Пользуюсь очень часто.
На двигателе штатный таходатчик, разобрал, посмотрел, вроде ломаться нечему. Но проблема одна, что на тда, что на ардуино, иногда может набирать обороты, когда от него этого и не требуется. Возможно дело в двигателе, я грешу на индуктивность, может межвитковое замыкание, пока не пойму.
На двигателе штатный таходатчик, разобрал, посмотрел, вроде ломаться нечему. Но проблема одна, что на тда, что на ардуино, иногда может набирать обороты, когда от него этого и не требуется. Возможно дело в двигателе, я грешу на индуктивность, может межвитковое замыкание, пока не пойму.
Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее. Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.
Сгоревшие движки обычно продолжают вращатся. И данным платам, без разницы сгоревший двигатель или нет. Она продолжает поддерживать обороты, главное чтоб симистор выдержал нагрузку.
Основная причина набора оборотов неправильные показания таходатчика. У вас тахогенератор или датчик Холла? Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.
Сделал небольшое дополнение, на мой взгляд полезное. При достижении ШИМ максимального значения загорается светодиод и сигнализирует, что большего из двигателя не "выжать".
Теперь вопрос. При экстренной остановке остаются последние показания прерываний. Как сбросить значение при отсутствии прерываний?
Сейчас просто раз в секунду, после вывода значений на экран, делаю принудительный сброс. Но понимаю, что это не правильно.
Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее. Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.
Логично, обороты у меня скакали когда датчик был отключён. Но при маленьком показании потенциометра.
У вас тахогенератор или датчик Холла? Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.
Тахогенератор. такого типа
Логично, обороты у меня скакали когда датчик был отключён. Но при маленьком показании потенциометра.
ТДА без таходатчика просто не запускается. Или это у вас на контроллере так было?
ТДА без таходатчика просто не запускается. Или это у вас на контроллере так было?
Было и на ардуино и tda, но с tda разобрался после того, как поменял мотор, стал работать стабильно. С ардуино разбираюсь. Оказывается прёт, какаято наводка. С таходатчика сигнал идёт чистый, а ардуино плюсует к сигналу 50 герц. Сейчас ставлю нормальное питание и тыкаю конденсаторы, пока вроде помогает. Пытаюсь разобраться с pid регулятором плавает сильно частота вращения ротора. В общем процесс идёт. А у Вас как? Двигатель работает стабильно?
А у Вас как? Двигатель работает стабильно?
И да и нет. на холостых, без нагрузки, обороты очень плавают. А при нагрузе, средней, почти стабильно.
Думаю, проблема в том, что на постоянке у таких движков присутствует так называемый "разнос". Движок, на одном напряжении, всё время набирает обороты. Разбираюсь.
Ещё не получается с датчиком тока. Из-за ШИМа показания скачут. Наверное нужен кондёр для сглаживания и усреднения. Не знаю какой и куда поставить.
И да и нет. на холостых, без нагрузки, обороты очень плавают. А при нагрузе, средней, почти стабильно.
pid ставить надо. Здесь кратко о нём http://we.easyelectronics.ru/Theory/pid-regulyatory--dlya-chaynikov-prak...
Это не сложно. Зато можно настроить очень точно.
Спасибо, это уже читал, и ещё что-то про ПИД регулирование.
Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор. Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.
Спасибо, это уже читал, и ещё что-то про ПИД регулирование.
Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор. Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.
Мне сложно, что посоветовать в С++ я тоже не силён. Слышал, что такого рода эксперименты можно проводить не на 220 вольт, через трансформатор. Допустим 36 вольт. Наладишь, а потом можно и в сеть. Медленно, но у меня даже от 12 вольт двигатель от стиралки вращался. А то так транзисторов не накупишься.
Я уже вторую ардуинку спалил. Прут паразитные шумы, и двигатель дёргается. Бывает часто, аж свет в комнате проседает. Может и у тебя тоже самое? Не пробовал отслеживать показания тахогенератора Serial.print, что там происходит?
Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax тут и дальше.
Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng
Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng
Типа испытаний японской бензопилы на рельсе.
Симисторы у них с алиэкспресса виноваты.
Про это кино про подобный реверс двигателя ничего кроме слов Лаврова не подходит.
И что он сказал?
Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax тут и дальше.
Вот читал ветку давно, а оказывается, здесь уже есть ответы на все вопросы, и про помехи, и про прерывания, буду изучать.
Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng
Вот и пофиг им токи. Поэтому я на симистре и собираю. А проблемы с неустойчивой работой на ардуино, оказались помехи. Пока с ними не могу справиться.
И что он сказал?
http://www.youtube.com/watch?v=-iNp3oWWMf4
Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax тут и дальше.
Странно. После установки цифрового датчика холла вместо восьми импульсов на один оборот идёт только четыре.
магнит стоит от привода жесткого диска. имеет 8 пар полюсов. должно быть 8 импульсов. Что может быть?
Не зная алгоритма работы твоего датчика, можно предположить, что одна пара полюсов дает передний фронт (допустим, HIGH), а второй задний (возвращение в LOW).
Вот и получается деление на два. Типа четкий меандр при скважности 2.
Ты осциллограмму выходную изобрази для ясности.
Странно. После установки цифрового датчика холла вместо восьми импульсов на один оборот идёт только четыре.
имеет 8 пар полюсов. должно быть 8 импульсов. Что может быть?
http://tutknow.ru/tech_and_electronics/206-datchik-holla-chto-eto-takoe-...
Цифровые датчики Холла так же разделены на: биполярные и униполярные.
Аналоговые датчики Холла – преобразуют индукцию поля в напряжение, величина показанная датчиком зависит от полярности поля и его силы. Но опять же, нужно учитывать расстояние, на котором установлен датчик.
Спасибо. Все перепроверил, действительно 4 пары полюсов, а не 8 как я считал.
sany_sch, канэчна! Вот вам в микросекундах и медленно :)
1
void
loop
(){
2
Serial
.print (
"Period="
);
3
Serial
.print((
float
)tic * 0.0625 );
4
Serial
.println (
" uS"
);
5
delay(300);
6
}
dimax, скажите, а эта система на другие выходы ни как не влияет? 9 и 10 пин ШИМ не выдают. Другие пока не пробовал. Или это я в скетче накосячил?
sany_sch, таймер железно привязан к определённым портам. Перевести на другие пины никак невозможно.
странно. задал выходом 11 пин - всё пошло. на прерываниях работало на девятом.
странно. задал выходом 11 пин - всё пошло. на прерываниях работало на девятом.
Видимо мы про разные программы говорим. В моём скетче никаких выходов не было) Был вход на 5 пине, который привязан.
Вот этот ваш скетч:
01
volatile unsigned
int
int_tic;
02
volatile unsigned
long
tic;
03
void
setup
(){
04
Serial
.begin(9600);
05
pinMode (8,INPUT);
// вход сигнала ICP( №8 only для atmega328)
06
//настройка 16 бит таймера-счётчика 1
07
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
09
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
10
}
11
12
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
13
tic= ((uint32_t)int_tic<<16)|TCNT1 ;
//подсчёт тиков
14
ICR1=0; int_tic=0; TCNT1=0; }
15
16
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
17
int_tic++;
//считать переполнения через 65536 тактов
18
if
(int_tic > (F_CPU/65536)) {tic=0; int_tic=0;}
//если на входе пусто более секунды
19
}
//то обнулить счётчики
20
Из 26 сообщения. Вход датчика Холла на пин 8
Если я использую его в своей программе, то 9 и 10 пины перестают выдавать сигнал ШИМ. 11 пин работает нормально.
sany_sch, а, понял. Ну да, выводы 9 и 10 - это выходы сравнения таймера1, (oc1a/oc1b) поскольку сам таймер занят другим делом, то шим генерить он не может)
dimax, спасибо. А как изменить частоту ШИМ чтоб двигатель не пищал. 11пин - выход ШИМ
sany_sch, можно делитель таймера на 1 поставить, тогда частота ШИМ будет 16000000/256/2
TCCR2B = TCCR2B & 0b11111000 | 1;
Спасибо.
Ещё пара вопросов.
В этом вашем участке кода
01
pinMode (8,INPUT);
// вход сигнала ICP( №8 only для atmega328)
02
//настройка 16 бит таймера-счётчика 1
03
TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
04
TIMSK1 = (1<<ICIE1)|(1<<TOIE1);
//создавать прерывание от сигнала на пине ICP1
05
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);
//div 1
06
}
07
08
ISR (TIMER1_CAPT_vect) {
//прерывание захвата сигнала на входе ICP1
09
tic= ((uint32_t)int_tic<<16)|TCNT1 ;
//подсчёт тиков
10
ICR1=0; int_tic=0; TCNT1=0; }
11
12
ISR (TIMER1_OVF_vect) {
//прерывание для счёта по переполнению uint
13
int_tic++;
//считать переполнения через 65536 тактов
14
if
(int_tic > (F_CPU/65536)) {tic=0; int_tic=0;}
//если на входе пусто более секунды
15
}
//то обнулить счётчики
16
Что и где нужно изменить чтоб:
1. обнуление шло не каждую секунду, а допустим каждые пол секунды.( в последней строке 65536 /2 ?)
2. после каждого срабатывания датчика переменная holl = 1
(1) Да. Лучше вообще убрать деление из прерывания. Один попугай int_tic равен 4 миллисекунды. Если нужно полсекунды, стало быть 0,5c / 0,004с = 125
(2) я не в курсе что за переменная holl
(2) я не в курсе что за переменная holl
Любая переменная. какая-нибудь. Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1. А в процессе програмы я буду на неё опираться и обнулять когда нужно.
Просто сейчас программа уже работает. и давольно сносно. Но хочу попробовать другие алгоритмы работы. Например. Пока не получен сигнал с таходатчика - ШИМ не меняем. Можно, конечно, каждый раз сравнивать тик с педидущим, но думаю, лучше просто дожидаться пока прерывание не сработает.
Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1. А в процессе програмы я буду на неё опираться и обнулять когда нужно.
После срабатывания датчика выполняется содержание ISR (TIMER1_CAPT_vect), в любом месте можно вставить holl=1; Нужно только объявить её как volatile по аналогии с другими переменными.
Спасибо!
sany_sch, можно делитель таймера на 1 поставить, тогда частота ШИМ будет 16000000/256/2
TCCR2B = TCCR2B & 0b11111000 | 1;
Спасибо, помогло. двигатель не пищит, и по моему мосфет стал меньше греться.
Здравствуйте. Работа не заброшена, просто все мосфеты сгорели. заказал более мощные, жду.
Пока решил опробовать симистор.
По этой статье http://cxem.net/arduino/arduino71.php собрал диммер. схему слегка изменил:
Основу скетча оставил но void loop изменил под потенциометр. получилось так:
01
/*
02
AC Voltage dimmer with Zero cross detection
03
Author: Charith Fernanado <a href="http://www.inmojo.com" title="http://www.inmojo.com" rel="nofollow">http://www.inmojo.com</a>
04
Adapted by DIY_bloke
05
License: Creative Commons Attribution Share-Alike 3.0 License.
06
07
Attach the Zero cross pin of the module to Arduino External Interrupt pin
08
Select the correct Interrupt # from the below table (the Pin numbers are digital pins, NOT physical pins: digital pin 2 [INT0]=physical pin 4 and digital pin 3 [INT1]= physical pin 5)
09
10
Pin | Interrrupt # | Arduino Platform
11
---------------------------------------
12
2 | 0 | All
13
3 | 1 | All
14
18 | 5 | Arduino Mega Only
15
19 | 4 | Arduino Mega Only
16
20 | 3 | Arduino Mega Only
17
21 | 2 | Arduino Mega Only
18
19
In the program pin 2 is chosen
20
*/
21
22
int
AC_LOAD = 3;
// Output to Opto Triac pin
23
int
dimming = 128;
// Dimming level (0-128) 0 = ON, 128 = OFF
24
25
void
setup
()
26
{
27
pinMode(AC_LOAD, OUTPUT);
// Set AC Load pin as output
28
attachInterrupt(0, zero_crosss_int, RISING);
// Choose the zero cross interrupt # from the table above
29
}
30
// the interrupt function must take no parameters and return nothing
31
void
zero_crosss_int()
// function to be fired at the zero crossing to dim the light
32
{
33
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
34
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms
35
// 10ms=10000us
36
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
37
int
dimtime = (75*dimming);
// For 60Hz =>65
38
delayMicroseconds(dimtime);
// Off cycle
39
digitalWrite(AC_LOAD, HIGH);
// triac firing
40
delayMicroseconds(10);
// triac On propogation delay (for 60Hz use 8.33)
41
digitalWrite(AC_LOAD, LOW);
// triac Off
42
}
43
44
void
loop
() {
45
int
val = analogRead(A0);
46
int
i = map(val, 0, 1024, 0, 120);
47
48
dimming=i;
49
50
}
Вопрос такой. ятак понял, что скетч под 65 герц, а нужно для 50.
И ещё будет ли он работать в паре с таходатчиком и прерываниями по ПИН 9.
Здравствуйте. Работа не заброшена, просто все мосфеты сгорели. заказал более мощные, жду.
Пока решил опробовать симистор.
По этой статье http://cxem.net/arduino/arduino71.php собрал диммер. схему слегка изменил:
Симистор, наверное, неплохой выбор.
Недавно сломалась кнопка регулятора оборотов дрели. Купил в магазине новую кнопку...родной найти не удалось, и расположение дырочек не поня, что куда подключать не разобрался. В целях изучения новую кнопку разобрал и собрать не смог, В общем остались запчасти...корпус, контакты и платка управления с симистором.
Решил разобрать родную кнопку..но осторожнее. Проблема оказалось не стоила выломанного яйца. Отвалилась пайка на ножке симистора. Запаял, и дрель снова плавно регулируется.
Дрель 710 ватт, служит уже много лет. Работаю всегда на регуляторе, на полную не включаю, т.к нет необходимости, да и на полной ток идет через доп.контакт, а не через регулятор.
Вывод - симистор хорошая штука для управления мощной нагрузкой.
Вывод - симистор хорошая штука для управления мощной нагрузкой.
Согласен. Но есть небольшие нюансы. Схема сложнее из за отслеживания нуля. скетч сложнее по тойже причине. А на мосфете используем встроенный ШИМ.
И самое важное. На постоенке двигатель мощнее. А это хороший +.