Последний раз редактировалось Mastar; 22.11.2011 в 02:13.
Мои проекты - Катер для рыбалки
т.э. залить тот скэтч который в 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; } // пример уменьшения яркости лампы
}
Последний раз редактировалось Chip; 22.11.2011 в 03:35.
Коллектор, А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);
}
Последний раз редактировалось Mastar; 22.11.2011 в 02:24.
Мои проекты - Катер для рыбалки
при первом скетче из 124 поста при подаче 220В:
также, начинает с 1089 и до 1099, а там1097 +-3
при втором:
892 +-1, даже может 891 +-1
Последний раз редактировалось knyaz2020; 22.11.2011 в 02:31.
Последний раз редактировалось Mastar; 22.11.2011 в 02:35.
Мои проекты - Катер для рыбалки
пробовал... ничего не меняется... уменьшал до 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; // пример уменьшения яркости лампы
}
Последний раз редактировалось Chip; 22.11.2011 в 23:16.
Ок, спасибо, попробую уже вечером, после работы...
А я думаю, нужно еще добавить задержку (2000+) перед первым открытием семистора. Т.к. мы управляем лампочкой накаливания, то подача почти 15-20% мощности только будет потреблять электроэнергию, но еще не светить. Так же 90-100% вообще не видно разницы. Кроме задержки коэффициент порядка 60 поставить.
Тогда во втором с ноля совпадаем и задержки вообще не нужно, но коэффициент тоже 60.
В таком случае мы никогда не промажем, а уже потом подберем точно значения. Установить при запуске 50% и проверять.
Последний раз редактировалось Mastar; 22.11.2011 в 15:18.
Мои проекты - Катер для рыбалки
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)