Пытаюсь сделать диммер с обратной связью по напряжению. Нужно получить стабилизацию напряжения при скачках напряжения сети. Если например выставлено на выходе 110 вольт при сетевом 220 и если сетевое упало до 200 то на выходе должно остаться 110.
Измерение напряжения идёт через аналоговый вход А1
Скетч вроде работает напряжение на вольтметре стабильно. Но при подключении амперметра видно что ток потребления падает. Есть подозрение что не верно измеряется выходное напряжения. Схема измерения напряжения, диммера и скетч ниже. Скетч крайне убогий, не силён я в этом деле.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define NUM_READINGS 500
int average; // измерение напряжения для фильтра
int volt; // вывод напряжения на дисплей
int dimming1;
int dimming ; // Dimming level (0-128) 0 = ON, 128 = OFF
unsigned long timme; //для дисплея
unsigned long sec=0;//для дисплея
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
int AC_LOAD = 4; // Output to Opto Triac pin
void setup()
{
analogReference(INTERNAL);
dimming = map(analogRead(0), 0, 1023, 10, 240) ;
lcd.init(); // initialize the lcd
Serial.begin(9600);
lcd.backlight();
lcd.setCursor(3, 0);
pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
}
// the interrupt function must take no parameters and return nothing
void zero_crosss_int() // function to be fired at the zero crossing to dim the light
{
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms
// 10ms=10000us
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
int dimtime = (40 * dimming); // For 60Hz =>65
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
delayMicroseconds(50 ); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_LOAD, LOW); // triac Off
}
void loop() {
timme=millis();
// фильтр
long sum = 0; // локальная переменная sum
for (int i = 0; i < NUM_READINGS; i++) { // согласно количеству усреднений
sum += analogRead(1); // суммируем значения с любого датчика в переменную sum
}
average = sum / NUM_READINGS; // находим среднее арифметическое, разделив сумму на число измерений
//фильтр
lcd.setCursor(1, 0);
dimming1 = map(analogRead(0), 0, 1023, 240, 10);
//int dimming1 = map(dimming, 10, 240, 240, 10);
lcd.print(dimming1); lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(dimming); lcd.print(" ");
volt = map(average , 0, 1023, 0, 240);
if (dimming1 > volt ){dimming=dimming-(dimming1-volt);}
if (dimming1 < volt ){dimming=dimming + (volt-dimming1);}
if (dimming < 10){dimming = 10;}
if (dimming > 240){dimming = 240;}
Serial.print("volt ");Serial.println(volt);
if (timme -sec >500){lcd.setCursor(0, 1);lcd.print(volt); lcd.print(" ");sec=timme;}
}
Измерение напряжения идёт через аналоговый вход А1
Скетч вроде работает напряжение на вольтметре стабильно. Но при подключении амперметра видно что ток потребления падает. Есть подозрение что не верно измеряется выходное напряжения. Схема измерения напряжения, диммера и скетч ниже. Скетч крайне убогий, не силён я в этом деле.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define NUM_READINGS 500
int average; // измерение напряжения для фильтра
int volt; // вывод напряжения на дисплей
int dimming1;
int dimming ; // Dimming level (0-128) 0 = ON, 128 = OFF
unsigned long timme; //для дисплея
unsigned long sec=0;//для дисплея
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
int AC_LOAD = 4; // Output to Opto Triac pin
void setup()
{
analogReference(INTERNAL);
dimming = map(analogRead(0), 0, 1023, 10, 240) ;
lcd.init(); // initialize the lcd
Serial.begin(9600);
lcd.backlight();
lcd.setCursor(3, 0);
pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
}
// the interrupt function must take no parameters and return nothing
void zero_crosss_int() // function to be fired at the zero crossing to dim the light
{
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms
// 10ms=10000us
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
int dimtime = (40 * dimming); // For 60Hz =>65
delayMicroseconds(dimtime); // Off cycle
digitalWrite(AC_LOAD, HIGH); // triac firing
delayMicroseconds(50 ); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_LOAD, LOW); // triac Off
}
void loop() {
timme=millis();
// фильтр
long sum = 0; // локальная переменная sum
for (int i = 0; i < NUM_READINGS; i++) { // согласно количеству усреднений
sum += analogRead(1); // суммируем значения с любого датчика в переменную sum
}
average = sum / NUM_READINGS; // находим среднее арифметическое, разделив сумму на число измерений
//фильтр
lcd.setCursor(1, 0);
dimming1 = map(analogRead(0), 0, 1023, 240, 10);
//int dimming1 = map(dimming, 10, 240, 240, 10);
lcd.print(dimming1); lcd.print(" ");
lcd.setCursor(6, 0);
lcd.print(dimming); lcd.print(" ");
volt = map(average , 0, 1023, 0, 240);
if (dimming1 > volt ){dimming=dimming-(dimming1-volt);}
if (dimming1 < volt ){dimming=dimming + (volt-dimming1);}
if (dimming < 10){dimming = 10;}
if (dimming > 240){dimming = 240;}
Serial.print("volt ");Serial.println(volt);
if (timme -sec >500){lcd.setCursor(0, 1);lcd.print(volt); lcd.print(" ");sec=timme;}
}
Вложения
-
10.8 KB Просмотры: 16
-
288.9 KB Просмотры: 17