Регулятор оборотов двигателя с обратной связью

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

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

sany_sch пишет:
Как организовать аппаратную  защиту мосфета?
При превышении некоторого значения тока, транзистор нужно закрывать до следующего импульса, причем сделать это на логике, а не программно.

sany_sch пишет:
Почему нельзя програмно? если поставить датчик тока, и показания равны 0, тоесть двигатель стоит, то ШИМ не более 5 или 10. (найти эксперементально) . и дальше добавдляем по 1. Тогда будут исключены резкие запуски двигателя.
Потому что нет гарантии, отсутствия ошибок в программе, невозможности сбоев и что ардуина работает быстрее, чем нарастает ток.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

на tda 1085 http://www.chipmaker.ru/uploads/monthly_07_2014/post/image/post-60830-089793900%201404570276.pngзащита так и устроена. Шунты R31 R33, Ток регулируется подстроечником R21, напряжения с шунта поступает на ножку 3. В общем эту часть можно взять и перенести на ардуино, подстроечника не надо, можно програмно настроить на нужное напряжение.

Можешь полностью схему нарисовать с номиналами и пояснениями? Для чайников, так сказать.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Походу кризис жанра. Вот схема защиты для "чайников"

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Это для юзеров.

А для чайника нужны номеналы.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

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

Если шунт 0.1 Ом, ток ограничения 5А - падение на шунте 0.5 В. Следовательно делитель на другом входе опера должен давать те же 0.5 В. Например нижний 510 Ом, верхний 4.7 кОм дадут 0.489 В, т.е. ток 4.89А. Номинал сопрота от шунта к оперу принципиального значения не имеет, например пусть будет 5-10 кОм.

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

Всё же решил делать на симистре. Судя по отзывам на этом сайте на постоянке с управлением на транзисторе выходит сложно. Нужен выпрямитель, сетевой фильтр, защита по току, всё это конечно можно приодолеть, я расчитывал на блок питания от копмпьютера, там всё это есть, но нашёл очень удачное решение вот здесь: 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
013volatile 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
019unsigned int rpmcount;
020unsigned int rpm;
021unsigned long timeold;
022unsigned long time1;
023 
024//LCD
025//LiquidCrystal::LiquidCrystal(rs, enable, d0, d1, d2, d3)
026#include <Wire.h>
027#include <LiquidCrystal.h>
028LiquidCrystal 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
039double 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;
047double consKp=1, consKi=0.4, consKd=0.01;
048 
049//Specify the links and initial tuning parameters
050PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
051int sensorValue=0;
052unsigned int analogValue=0;
053unsigned int delayValue=8000;
054unsigned int rpmmin = 6000; // Minimum and max rpm for the motor
055unsigned int rpmmax = 35000;
056unsigned int analogmin = 2400; // analogmin and analogmax are the range of delay
057unsigned int analogmax = 6000;// time and fot each motor must be determined empirically
058 
059void setup() {
060 
061//Triac control setup
062pinMode(triac_control, OUTPUT);
063digitalWrite(triac_control, 0); // triac and LED off
064pinMode(open_loop, INPUT);
065digitalWrite(open_loop, 1);
066//Power switch
067pinMode(powerOn, INPUT);
068digitalWrite(powerOn, 1); // pull up on
069//Zero detect
070pinMode(zero_detect, INPUT);
071digitalWrite(zero_detect, 1); // pull up on
072attachInterrupt(0, zero_fun, FALLING); // interrupt 0 digital pin 2 connected ZC circuit
073// Hall sensor
074pinMode(hallsensor2, INPUT);
075pinMode(hallsensor, INPUT);
076digitalWrite(hallsensor, 1); // pull up on
077attachInterrupt(1, rpm_fun, FALLING); // interrupt 1 digital pin 3 connected hall sensor
078rpmcount = 0;
079rpm = 0;
080timeold = 0;
081// LCD detect
082lcd.begin(16,2); // initialize the lcd
083lcd.home (); // go home
084lcd.print(" Hello ");
085lcd.setCursor ( 0, 1 ); // go to the next line
086lcd.print (" GOOD LUCK ");
087delay(1000);
088lcd.clear();
089 
090// set up TIMER1
091OCR1A = 100; //initialize the comparator
092TIMSK1 = 0x03; //enable comparator A and overflow interrupts
093TCCR1A = 0x00; //timer control registers set for
094TCCR1B = 0x00; //normal operation, timer disabled
095// Serial.begin(9600);
096//PID
097Input = rpm;
098Setpoint = analogValue;
099//turn the PID on
100myPID.SetMode(AUTOMATIC);
101myPID.SetOutputLimits(analogmin,analogmax); //usage of this parameters instead of
102// rpmmin and rpmmax lets use only one mapping
103// in PID
104}
105void loop()
106{
107//motor switch and indicator = ON/OFF
108if (!digitalRead(powerOn)) // manual or by PC
109{
110// digitalWrite(powerIndicator, 1);
111zero_byte=HIGH;
112 
113///////////////RPM counter ///////////////////
114//////////////////////////////////////////////////////////////
115if ((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;
120unsigned long time = millis() - timeold;
121float time_in_sec = (float)time / 1000;
122float impuls_time = (float)rpmcount / time_in_sec;
123rpm = (int)impuls_time*60;
124rpmcount = 0; //reset
125timeold = millis(); //reset time
126 
127}
128//#######################PID ###############################
129//##########################################################
130analogValue = analogRead(sensorPin);
131int 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)
134analogValue = analogLevel;
135 
136if (digitalRead(open_loop)==1)
137{ Input = map(rpm, rpmmin,rpmmax,analogmin,analogmax);
138// Here we put correspondance between rpm and delay values)
139Setpoint = analogValue;
140myPID.Compute();
141analogValue = Output;
142}
143analogValue = analogmax-analogValue+analogmin;
144// this inverts the delay values- higher rpm corrsponds to shorter delay times.
145if (analogValue > analogmax)
146{analogValue = analogmax;}
147if (analogValue < analogmin)
148{analogValue = analogmin;}
149delayValue=analogValue; // we need this as during a cycle of PID
150//calculations analogvalue changes several times
151//??????????????????TRIAC delay control ???????????????????
152 
153OCR1A = delayValue/4;
154 
155//**************indicator ************************
156 
157if (rpm < 10)
158{
159lcd.setCursor ( 0, 0 );
160lcd.print(" ");
161lcd.print (rpm);}
162if (10<= rpm && rpm < 100)
163{
164lcd.setCursor ( 0, 0 );
165lcd.print(" ");
166lcd.print (rpm);}
167if (100<= rpm &&rpm < 1000)
168{
169lcd.setCursor ( 0, 0 );
170lcd.print(" ");
171lcd.print (rpm); }
172if (1000<= rpm && rpm < 10000)
173{
174lcd.setCursor ( 0, 0 );
175lcd.print(" ");
176lcd.print (rpm);
177}
178if (10000<= rpm)
179{
180lcd.setCursor ( 0, 0 );
181lcd.print (rpm);}
182lcd.setCursor ( 7, 0 );
183lcd.print ("RPM");
184//////// output power indicator ///////////////////////////////
185// max power 13 bars min power bars
186lcd.setCursor ( 0, 1 );
187lcd.print(" ");
188lcd.setCursor ( 0, 1 );
189int 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:
192for (int bar = 0; bar < 13; bar++)  {
193if (bar < Level)  {lcd.print(0);}
194 }
195}
196else
197// when motor is OFF, the display allows to check the input of Hall sensor
198//(or optical level)
199{
200// digitalWrite(powerIndicator, 0);
201zero_byte=LOW;
202if (millis()-time1 >=10)
203{ sensorValue = analogRead(hallsensor2);
204//lcd.setCursor ( 0, 1 );
205//lcd.print(" ");
206lcd.clear();
207lcd.setCursor ( 0, 1 );
208int 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
211for (int sbar = 0; sbar < 13; sbar++)  {
212if (sbar < sensLevel)  { lcd.print(0);}
213}
214time1=millis();
215}
216}
217} // end of loop
218//Interrupt Service Routines
219 
220ISR(TIMER1_COMPA_vect) //comparator match
221{ digitalWrite(triac_control, 1); //triac on;
222TCNT1 = 65536-PULSE; //trigger pulse width = PULSE
223}
224ISR(TIMER1_OVF_vect) //timer1 overflow
225{
226digitalWrite(triac_control, 0); //turn off triac gate
227TCCR1B = 0x00; //disable timer stop unintended triggers
228}
229 
230void zero_fun() //zero detect
231{if (zero_byte)
232{ TCCR1B=0x03; //start timer with divide by 64 input
233TCNT1 = 0; //reset timer - count from zero
234}
235}
236 
237void rpm_fun()
238{
239rpmcount++;
240//Each rotation, this interrupt function is run
241}

Правда до конца с кодом ещё не разобрался. Например не пойму куда подключён pin d13

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

А я продолжу мучить транзисторы. В силовую цепь, по совету Будимира, поставлено сопротивление 0,05 Ом  5 Ватт и поставлен датчик тока 20А который ограничит ШИМ при отсутствии нагрузки. И отключит транзистор при повышенной нагрузке.

В программе избавлюсь от delay .  Сброс ШИМ сделаю без задержек, а нарастание по количеству циклов. Например за 20 циклов ШИМ +1. От количества циклов будет зависить плавность пуска.

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

А я продолжу мучить транзисторы.

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

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

А я продолжу мучить транзисторы. В силовую цепь, по совету Будимира, поставлено сопротивление 0,05 Ом  5 Ватт

0,5 ома, если это как в схеме на tda 1085

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

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

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

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

0,5 ома, если это как в схеме на tda 1085

да, как на ТДА. Там 2 сопротивления параллельно по 0,1 Ом. В сумме  дадут 0,05Ом.   Или я чего-то не понял?

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

да, как на ТДА. Там 2 сопротивления параллельно по 0,1 Ом. В сумме  дадут 0,05Ом.   Или я чего-то не понял?

Правильно, это я, что-то просчитался!

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

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

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

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

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

Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее.  Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.

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

Основная причина набора оборотов неправильные показания таходатчика. У вас тахогенератор или датчик Холла?  Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

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

Теперь вопрос. При экстренной остановке остаются последние показания прерываний.  Как сбросить значение при отсутствии прерываний?

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

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

Давайте думать. Допустим, по каким -то причинам двигатель начал при той-же нагрузке и при том -же напряжении начал вращаться быстрее.  Таходатчик сразу отработает это и подаст сигнал И плата, без разницы какая, сбросит питание. Обороты упадут.

Логично, обороты у меня скакали когда датчик был отключён. Но при маленьком показании потенциометра.

sany_sch пишет:

У вас тахогенератор или датчик Холла?  Попробуйте посадить магнит помимо винта ещё на силикон. И поставить датчик Холла.

Тахогенератор. такого типа

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

Логично, обороты у меня скакали когда датчик был отключён. Но при маленьком показании потенциометра.

ТДА без таходатчика просто не запускается. Или это у вас на контроллере так было?

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

ТДА без таходатчика просто не запускается. Или это у вас на контроллере так было?

Было и на ардуино и tda, но с tda разобрался после того, как поменял мотор, стал работать стабильно. С ардуино разбираюсь. Оказывается прёт, какаято наводка. С таходатчика сигнал идёт чистый, а ардуино плюсует к сигналу 50 герц. Сейчас ставлю нормальное питание и тыкаю конденсаторы, пока вроде помогает. Пытаюсь разобраться с pid регулятором плавает сильно частота вращения ротора. В общем процесс идёт. А у Вас как? Двигатель работает стабильно?

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир пишет:

А у Вас как? Двигатель работает стабильно?

И да и нет. на холостых, без нагрузки, обороты очень плавают. А при нагрузе, средней, почти стабильно.

Думаю, проблема в том, что на постоянке у таких движков присутствует так называемый "разнос". Движок, на одном напряжении, всё время набирает обороты. Разбираюсь.

Ещё не получается с датчиком тока.  Из-за ШИМа показания скачут. Наверное нужен кондёр для сглаживания и усреднения. Не знаю какой и куда поставить.

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

И да и нет. на холостых, без нагрузки, обороты очень плавают. А при нагрузе, средней, почти стабильно.

pid ставить надо. Здесь кратко о нём http://we.easyelectronics.ru/Theory/pid-regulyatory--dlya-chaynikov-prak...

Это не сложно. Зато можно настроить очень точно.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Спасибо, это уже читал, и ещё что-то про ПИД регулирование.

Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор.  Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

Спасибо, это уже читал, и ещё что-то про ПИД регулирование.

Тут вот что получается, Если я увеличиваю значение ШИМ быстрее чем на 1 за 20 циклов программы то мосфет "вылетает. На это знание у меня ушел пятый транзистор.  Тут что-то другое. Если бы двигатель вёл себя хуже под нагрузкой, то да, нужен ПИД. Здесь же наоборот, под нагрузкой лучше чем в холостую.

Мне сложно, что посоветовать в С++ я тоже не силён. Слышал, что такого рода эксперименты можно проводить не на 220 вольт, через трансформатор. Допустим 36 вольт. Наладишь, а потом можно и в сеть. Медленно, но у меня даже от 12 вольт двигатель от стиралки вращался. А то так транзисторов не накупишься.

Я уже вторую ардуинку спалил. Прут паразитные шумы, и двигатель дёргается. Бывает часто, аж свет в комнате проседает. Может и у тебя тоже самое? Не пробовал отслеживать показания тахогенератора Serial.print, что там происходит?

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax   тут   и дальше.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

sany_sch пишет:

Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng

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

Про это кино про подобный реверс двигателя ничего кроме слов Лаврова не подходит.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

И что он сказал?

 

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax   тут   и дальше.

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

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

Будимир, посмотри, как ребята симисторы на ТДА испытывают: http://www.youtube.com/watch?v=MZe0jqVa2ng

Вот и пофиг им токи. Поэтому я на симистре и собираю. А проблемы с неустойчивой работой на ардуино, оказались помехи. Пока с ними не могу справиться.

Будимир
Будимир аватар
Offline
Зарегистрирован: 04.02.2016

sany_sch пишет:

И что он сказал?

 

http://www.youtube.com/watch?v=-iNp3oWWMf4

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

sany_sch пишет:

Купил цифровой датчик Холла. хочу пробовать не через прерывания а так как советовал dimax   тут   и дальше.

Странно. После установки цифрового датчика холла вместо восьми импульсов на один оборот идёт только четыре.

магнит стоит от привода жесткого диска. имеет 8 пар полюсов. должно быть 8 импульсов. Что может быть?

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Не зная алгоритма работы твоего датчика, можно предположить, что одна пара  полюсов дает передний фронт (допустим, HIGH), а второй задний (возвращение в LOW).

Вот и получается деление на два. Типа четкий меандр при скважности 2.
Ты осциллограмму выходную изобрази для ясности.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

sany_sch пишет:

Странно. После установки цифрового датчика холла вместо восьми импульсов на один оборот идёт только четыре.

 имеет 8 пар полюсов. должно быть 8 импульсов. Что может быть?

http://tutknow.ru/tech_and_electronics/206-datchik-holla-chto-eto-takoe-...

Цифровые датчики Холла так же разделены на: биполярные и униполярные.

  • Униполярные – срабатывают при наличии поля определённой полярности и отключаются при снижении индукции поля.
  • Биполярные – реагируют на смену полярности поля, то есть одна полярность – включает датчик, другая – выключает.

Аналоговые датчики Холла – преобразуют индукцию поля в напряжение, величина показанная датчиком зависит от полярности поля и его силы. Но опять же, нужно учитывать расстояние, на котором установлен датчик.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Спасибо. Все перепроверил, действительно 4 пары полюсов, а не 8 как я считал.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, канэчна! Вот вам в микросекундах и медленно :)

1void loop(){
2Serial.print ("Period=");
3Serial.print((float)tic * 0.0625 );
4Serial.println (" uS");
5delay(300);
6}

 

dimax, скажите, а эта система на другие выходы ни как не влияет?  9 и 10 пин ШИМ не выдают. Другие пока не пробовал. Или это я в скетче накосячил?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, таймер железно привязан к определённым портам. Перевести на другие пины никак невозможно.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

странно. задал выходом 11 пин - всё пошло. на прерываниях работало на девятом.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch пишет:

странно. задал выходом 11 пин - всё пошло. на прерываниях работало на девятом.

Видимо мы про разные программы говорим. В моём скетче никаких выходов не было) Был вход на 5 пине, который привязан.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Вот этот ваш скетч:

01volatile unsigned int int_tic;
02volatile unsigned long tic;
03void setup(){
04Serial.begin(9600);
05pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
06//настройка 16 бит таймера-счётчика 1
07TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
08TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
09TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
10}
11 
12ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
13tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
14ICR1=0; int_tic=0; TCNT1=0;  }
15 
16ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
17int_tic++; //считать переполнения через 65536 тактов
18if (int_tic > (F_CPU/65536)) {tic=0; int_tic=0;} //если на входе пусто более секунды
19}                                                 //то обнулить счётчики
20  

Из 26 сообщения. Вход датчика Холла на пин 8

Если я использую его в своей программе, то 9 и 10 пины перестают выдавать сигнал ШИМ. 11 пин работает нормально.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, а, понял. Ну да, выводы 9 и 10 - это выходы сравнения таймера1, (oc1a/oc1b) поскольку сам таймер занят другим делом, то шим генерить он не может)

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax, спасибо.   А как изменить частоту ШИМ чтоб двигатель не пищал.    11пин - выход ШИМ

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch, можно делитель таймера на 1 поставить, тогда частота ШИМ будет 16000000/256/2

TCCR2B = TCCR2B & 0b11111000 | 1;

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Спасибо.

Ещё пара вопросов.

В этом вашем участке кода

01pinMode (8,INPUT); // вход сигнала ICP( №8 only для atmega328)
02//настройка 16 бит таймера-счётчика 1
03TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
04TIMSK1 = (1<<ICIE1)|(1<<TOIE1);//создавать прерывание от сигнала на пине ICP1
05TCCR1B = (1<<ICNC1)|(1<<ICES1)|(1<<CS10);//div 1
06}
07 
08ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
09tic= ((uint32_t)int_tic<<16)|TCNT1 ; //подсчёт тиков
10ICR1=0; int_tic=0; TCNT1=0;  }
11 
12ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
13int_tic++; //считать переполнения через 65536 тактов
14if (int_tic > (F_CPU/65536)) {tic=0; int_tic=0;} //если на входе пусто более секунды
15}                                                 //то обнулить счётчики
16  

Что и где нужно изменить чтоб:

1. обнуление шло не каждую секунду, а допустим каждые пол секунды.( в последней строке  65536 /2   ?)

2. после каждого срабатывания датчика  переменная holl = 1

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

(1) Да.  Лучше вообще убрать деление из прерывания. Один попугай int_tic равен 4 миллисекунды. Если нужно полсекунды, стало быть 0,5c / 0,004с = 125

(2) я не в курсе что за переменная holl

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

 

(2) я не в курсе что за переменная holl

Любая переменная. какая-нибудь.  Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1.    А в процессе програмы я буду на неё опираться и обнулять когда нужно.

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sany_sch пишет:

Когда произошло прерывание, помимо всех нужных расчётов связаных с tic, ещё и какой нибудь переменной присваиваем значение 1.    А в процессе програмы я буду на неё опираться и обнулять когда нужно.

После срабатывания датчика выполняется содержание ISR (TIMER1_CAPT_vect), в любом месте можно вставить holl=1;  Нужно только объявить её как volatile по аналогии с другими переменными.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Спасибо!

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

dimax пишет:

sany_sch, можно делитель таймера на 1 поставить, тогда частота ШИМ будет 16000000/256/2

TCCR2B = TCCR2B & 0b11111000 | 1;

Спасибо, помогло. двигатель не пищит, и по моему мосфет стал меньше греться.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Здравствуйте. Работа не заброшена, просто все мосфеты сгорели. заказал более мощные, жду.

Пока решил опробовать симистор.

По этой статье http://cxem.net/arduino/arduino71.php собрал диммер.  схему слегка изменил:

Основу скетча оставил но void loop изменил под потенциометр. получилось так:

01/*
02AC Voltage dimmer with Zero cross detection
03Author: Charith Fernanado <a href="http://www.inmojo.com" title="http://www.inmojo.com" rel="nofollow">http://www.inmojo.com</a>
04Adapted by DIY_bloke
05License: Creative Commons Attribution Share-Alike 3.0 License.
06 
07Attach the Zero cross pin of the module to Arduino External Interrupt pin
08Select 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 
10Pin    |  Interrrupt # | Arduino Platform
11---------------------------------------
122      |  0            |  All
133      |  1            |  All
1418     |  5            |  Arduino Mega Only
1519     |  4            |  Arduino Mega Only
1620     |  3            |  Arduino Mega Only
1721     |  2            |  Arduino Mega Only
18 
19In the program pin 2 is chosen
20*/
21 
22int AC_LOAD = 3;    // Output to Opto Triac pin
23int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF
24 
25void 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
31void 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 
44void loop()  {
45 int val = analogRead(A0);
46 int i = map(val, 0, 1024, 0, 120);
47   
48    dimming=i;
49       
50}

Вопрос такой.  ятак понял, что скетч под 65 герц, а нужно для 50.

И ещё  будет ли он работать в паре с таходатчиком и прерываниями по ПИН 9.

Joiner
Offline
Зарегистрирован: 04.09.2014

sany_sch пишет:

Здравствуйте. Работа не заброшена, просто все мосфеты сгорели. заказал более мощные, жду.

Пока решил опробовать симистор.

По этой статье http://cxem.net/arduino/arduino71.php собрал диммер.  схему слегка изменил:

Симистор, наверное, неплохой выбор.

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

Решил разобрать родную кнопку..но осторожнее. Проблема оказалось не стоила выломанного яйца. Отвалилась пайка на ножке симистора. Запаял, и дрель снова плавно регулируется.

Дрель 710 ватт, служит уже много лет. Работаю всегда на регуляторе, на полную не включаю, т.к нет необходимости, да и на полной ток идет через доп.контакт, а не через регулятор.

Вывод - симистор хорошая штука для управления мощной нагрузкой.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Joiner пишет:

Вывод - симистор хорошая штука для управления мощной нагрузкой.

Согласен. Но есть небольшие нюансы. Схема сложнее из за отслеживания нуля. скетч сложнее по тойже причине. А на мосфете используем встроенный ШИМ.

И самое важное. На постоенке двигатель мощнее.  А это хороший +.