Пост на удаление
Вид для печати
Пост на удаление
вот только что минутку подождал... начало с 0, тогда резко на 950, затем резко на 1097, и вот с этого числа поднялось значение до 1104 и вот здесь сыпится с интервалос +-2, т.э. в промежутке 1102 - 1106
Руку подводил.. вроде как ничего не меняется.. всеравно в промежутке +-2 меняются числа
Кстати Chip, я давно заметил этот прикол.
При одинаковом импульсе 1500 мкс.
Timer1.initialize(1) - работает от фанаря и выдает значение 220
Timer1.initialize(10) - работает четко и соответствует 150
В чем тут загвоздка?
Не успевает
Точно! что то я забыл про него
А то непонятно что за частота в сети, если положительный импульс 11мкс , то сколько будет отрицательный?
да, без проблем... значит соединяю 2 пин с А0. Что дальше делать?
цифрового не делал, но для такой частоты 50гц и аналогового много
:)
Осциллограф
Вот:
До подачи 220В:
http://bulkin.lootsk.com/2010/do_220v.jpg
После подачи переменки:
http://bulkin.lootsk.com/2010/220v.jpg
Как это? Без напряжения?
Базу оптрона садил на корпус?
Это и есть наводки
базу не садил на корпус. сейчас схема с поста №24
Сади на массу, должно без подключения к сети быть +5 вольт постоянных.
Или ищи ошибку в монтаже.
грею паяльник ..
ошибки нет так как проверял немколько раз.
садить прямо на массу или через какоето сопротивление?
а почему должнобыть +5в?
Вот полный скетч:
Код:#include <TimerOne.h>
#define BTNPIN 2
volatile uint16_t lengthImpuls, timerCount;
//oscilloscope
//http://compcar.ru
byte head[3]={170,204,195};
byte MyBuff[800];
unsigned int i=0;
void setup()
{
Serial.begin(115200);
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void loop()
{
for (i=0; i < 800; i++)
{
MyBuff[i] = analogRead(0)/4;
}
Serial.write(head,3);
Serial.write(MyBuff,800);
}
void callback()
{
timerCount++;
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, RISING);
}
Не подключая к сети !!! Подсоедини катод светодиода оптрона на минус, а анод через один 1 кОм подключи к +5 Вольт, должно на осциллографе измениться на ноль.
Нужно только один осциллограф в ардуине.Цитата:
Вот полный скетч:
Не подключая к сети !!!PHP код:
//oscilloscope
//http://compcar.ru
byte head[3]={170,204,195};
byte MyBuff[800];
unsigned int i=0;
void setup()
{
Serial.begin(115200);
}
void loop()
{
for (i=0; i < 800; i++)
{
MyBuff[i] = analogRead(0)/4;
}
Serial.write(head,3);
Serial.write(MyBuff,800);
}
не пробовал прямо на массу, но 1 кОм самый раз.Цитата:
садить прямо на массу или через какоето сопротивление?
так.. стоп.. мальок запутался...
1. Нужен только скетч осцилографа в ардуине - это понял.
2. Нужно я так понимаю подать напряжение на светодиод оптрона (естественно к 220В не подключать) или на массу посадить транзистор?
Можно сначала подавать через сопротивление 5 вольт на светодиод оптрона, если будет четко изменяться с +5 на 0 при подаче, то это результат.
А если будут импульсы, то и базу тоже через сопротивление на массу.
p.s. Без питания на светодиоде, осциллограф должен показать постоянное +5, при подаче резко в ноль.
Результат одинаковый, что просто при подачи +5В (через сопротивление 510 Ом), что после подключения базы на землю через такое же сопротивление и подачи +5В:
http://bulkin.lootsk.com/2010/5v.jpg
Без подачи напряжение 5В, сигнал на 5В
Значит есть проблема с монтажем или деталями. Оптрон работает как? Знаете?
Фототранзистор оптрона имеет бесконечное сопротивление в покое(значит будет +5 вольт ровный сигнал), а при подаче напряжения на светодиод, сопротивление фототранзистора стремится к нулю(значит будет 0 тоже ровный сигнал).
да я ума не приложу что там может быть не так...
так же что-то не совсем пойму.. как этот осцилограф меряет.. так как второй же вывод я поцепил на аналоговый той же ардуины...
а к этой плате подсоединен только 10 пин, который в скетче никак не используется...
т.э. фактически этот осцилограф меряет/ловит какието левые шумы?
Если эмиттер оптрона сидит на массе, а коллектор через сопротивление(допускается до 100 ом) к +5, то в режиме покоя будет осциллограф показывать +5 вольт постоянки. При подаче на светодиод напряжения, на осциллографе изменится на нулевое и никаких синусоид или импульсов.
ясно.. ну 5В он показывает в режиме покоя.. а вот почему при подачи на светодиод напряжения не переходит в полный 0 не знаю...
напряжение на светодиоде при сопротивлении 510 Ом - 1.15В, ток - не более 10мА
Цокольовка:
1 - анод
2 - катод
4 - емитер
5 - кол.
6 - база
Если бы не предыдущее сообщение я бы сказал что у оптрон мертвый.
А резисторы ты так же как на схеме 4шт. соединил?
Что было ? С резисторами что то не так ?
Теперь длительность замеряй по новой
Вот теперь заливай скетчь для регулировки, от А0 можно не отключать.
т.э. залить тот скэтч который в 105 посте?
а0 на колектор?
а 2-ой пин куда?
нет, не к а2, а было так
а0 подключен на д2
Подправил длительности импульсов
PHP код:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile byte dim = 128; // уровень димирования (0-128) 0 = on, 128 = 0ff
void setup()
{
pinMode(AC_pin, OUTPUT);
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
}
// Функция обработки прерывания на подъем
void FrontUp()
{
detachInterrupt(0);
_delay_us(83*dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
_delay_us(69*dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(20); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
void loop()
{
if(dim > 0) {dim--; } else { dim=128; } // пример уменьшения яркости лампы
}
Коллектор, А0 и 2 пин все три вместе, вернее еще и сопротивление на +5.
Скетчь осциллографа должен при таком соединении показывать то же самое. Потом проверь скетчем длительность положиельного и отрицательного импульса.
потомPHP код:
#include <TimerOne.h>
#define BTNPIN 2
volatile uint16_t lengthImpuls, timerCount;
void setup()
{
Serial.begin(115200);
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void loop()
{
Serial.println(lengthImpuls);
}
void callback()
{
timerCount++;
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, RISING);
}
У нас в сети нет 50 Гц, поэтому суммарная длительность будет больше 20 мс.PHP код:
#include <TimerOne.h>
#define BTNPIN 2
volatile uint16_t lengthImpuls, timerCount;
void setup()
{
Serial.begin(115200);
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void loop()
{
Serial.println(lengthImpuls);
}
void callback()
{
timerCount++;
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, RISING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, FALLING);
}
при первом скетче из 124 поста при подаче 220В:
также, начинает с 1089 и до 1099, а там1097 +-3
при втором:
892 +-1, даже может 891 +-1
пробовал... ничего не меняется... уменьшал до 73-59.. и дим поставил на 64.. без результатно.. скорее всего нужна другая логика...
вот скэтч с 44 поста какбы работает... лампа в полнакала горит.. с небольшим ели заметным мерцанием..
но вот как там яркость менять...
Я понял почему так происходит.
так как у нас соотношение 11:9 то в первом полупериоде в начале и в конце мы захватываем соседний полупериод по 500мкс с каждой стороны , а длительность отсечки рассчитываем с учетом этих хвостов.
Вот рабочий код.
PHP код:
#include <avr/delay.h>
int AC_pin = 10; // выход для симистора
volatile byte dim = 128; // уровень димирования (0-128) 0 = on, 128 = 0ff
void setup()
{
pinMode(AC_pin, OUTPUT);
attachInterrupt(0, FrontUp, RISING); //прерывание по изменению уровня с низкого на высокий
}
// Функция обработки прерывания на подъем
void FrontUp()
{
detachInterrupt(0);
_delay_us(1000+(65*dim)); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(100); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится когда полупериод достигнет нуля)
attachInterrupt(0, FrontDown, FALLING);
}
// Функция обработки прерывания на спад
void FrontDown()
{
detachInterrupt(0);
_delay_us(65*dim); // отсекаем лишнее
digitalWrite(AC_pin, HIGH); // включить симистор
_delay_us(100); // короткая пауза, чтобы обеспечить включение симистора
digitalWrite(AC_pin, LOW); // выключение симистора(он выключится
attachInterrupt(0, FrontUp, RISING);
}
void loop()
{
dim=64;
// if(dim > 0) {dim--; _delay_ms(50);} else dim=128; // пример уменьшения яркости лампы
}
Ок, спасибо, попробую уже вечером, после работы...
А я думаю, нужно еще добавить задержку (2000+) перед первым открытием семистора. Т.к. мы управляем лампочкой накаливания, то подача почти 15-20% мощности только будет потреблять электроэнергию, но еще не светить. Так же 90-100% вообще не видно разницы. Кроме задержки коэффициент порядка 60 поставить.
Тогда во втором с ноля совпадаем и задержки вообще не нужно, но коэффициент тоже 60.
В таком случае мы никогда не промажем, а уже потом подберем точно значения. Установить при запуске 50% и проверять.