• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Sterowanie grupowe - płynna regulacja mocy
#1
Witam.
Jestem początkującym użytkownikiem Arduino i jednocześnie początkującym "elektronikiem" i być może porwałem się na zbyt ambitny projekt. Ale trzeba sobie stawiać wysoko poprzeczkę Smile. Spędziłem już nad tym sporo czasu szukając rozwiązania przeczytałem wiele artykułów, i 2 książki o Arduino ale dalej nie mogę sobie poradzić z moim problemem. Niby teoria jest mi znana ale jak chcę ją użyć zaczynają się schody.
Przejdźmy do sedna sprawy. Postanowiłem stworzyć sterowanie mocą żarówki/grzałki/silnika w sposób płynny gdzie na wyświetlaczu 0 - wyłączone świecenie 100 max moc świecenia. Detekcja w "0".
Doszedłem do miejsca w którym mam sterowanie mocą do 70-80 kroków i uzyskuję max.
Może ktoś podpowie mi jak to ogarnąć, lub poda opis gdzie mógłbym o tym doczytać abym sobie z tym poradził.
Tworząc ten projekt korzystałem z następujących stron - i płytkę sterującą wykonałem
1) ściemniacz1 http://arduinotehniq.blogspot.com/2014/1...duino.html
2) ściemniacz2 https://arduinodiy.wordpress.com/2012/10...r-arduino/

Naciskając przyciski licznik na wyświetlaczu liczy po kolei od 0-100, ale płynne sterowanie jest od 0-80 (mierzę miernikiem)
Napięcie na poszczególnej jednostce licznika
0 - 0V
25 - 84V
50 - 176V
75 - 224V
80 - 227V - MAX MOC

Mój kod
Kod:
#include <SPI.h>
#include "U8glib.h"
#include <TimerOne.h> // Avaiable from http://www.arduino.cc/playground/Code/Timer1

U8GLIB_ST7920_128X64 u8g(8, 6, 7, U8G_PIN_NONE); // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

// ustawienia dotyczące sterowania zerem
volatile int i=0; // Variable to use as a counter
volatile boolean zero_cross=0; // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3; // Output to Opto Triac
int buton1 = 0; // first button at pin 4
int buton2 = 5; // second button at pin 5
int counter = 100; // step for count;
int counter_1 = 100;
int freqStep = 105; // This is the delay-per-brightness step in microseconds for 50Hz (change the value in 65 for 60Hz)

void setup() {



Serial.begin(9600);
pinMode(buton1, INPUT); // set buton1 pin as input
pinMode(buton2, INPUT); // set buton1 pin as input
pinMode(AC_pin, OUTPUT); // Set the Triac pin as output
attachInterrupt(0, zero_cross_detect, RISING); // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
Timer1.initialize(freqStep); // Initialize TimerOne library for the freq we need
Timer1.attachInterrupt(counter_check, freqStep);



// assign default color value
u8g.getMode() == U8G_MODE_BW;
u8g.setColorIndex(1);

/*
if ( u8g.getMode() == U8G_MODE_R3G3B2 )
u8g.setColorIndex(255); // white
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
u8g.setColorIndex(3); // max intensity
else if ( u8g.getMode() == U8G_MODE_BW )
u8g.setColorIndex(1); // pixel on */
// USTAWIENIE KROJU CZCIONKI (CZCIONKI DOSTĘPNE W STEROWNIKU DO WYŚWIETLACZA)
// u8g.setFont(u8g_font_8x13);
u8g.setFont(u8g_font_6x12);
// u8g.setFont(u8g_font_helvR08);
// u8g.setFont(u8g_font_profont11);
}
// ----------------------------------- sterowanie zerem----------------------
void zero_cross_detect() {
zero_cross = true; // set the boolean to true to tell our dimming function that a zero cross has occured
i=0;
digitalWrite(AC_pin, LOW);
}

// Turn on the TRIAC at the appropriate time
void counter_check() {
if(zero_cross == true) {
if(i>=counter) {
digitalWrite(AC_pin, HIGH); // turn on light
i=0; // reset time step counter
zero_cross=false; // reset zero cross detection
}
else {i++; // increment time step counter
}
}}


// --------------------------------------------------------------- wykonanie programu ---------------------------------
void loop() {
// --------------------------------------------------- moc ---------------------------------------------
digitalWrite(buton1, HIGH);
digitalWrite(buton2, HIGH);

if (digitalRead(buton1) == LOW)
{if(counter>0) {counter--;} else if (counter==1){counter--;}
else if (counter==1); }

if (digitalRead(buton2) == LOW)
{if (counter<100) {counter++;} else if (counter==0){counter++; }
else if (counter==100); }

// Drukowanie na wyświetlaczu
// Drukowanie na wyświetlaczu
u8g.firstPage();
do {

u8g.drawStr( 0, 57, "MOC GRZANIA ");
u8g.setPrintPos( 80, 57);
u8g.print((counter_1 - counter));

} while( u8g.nextPage() );


// --------------------------------------------------- moc na serial ---------------------------------------------
Serial.println(counter_1 - counter);


}

W książce, którą napisał Pan Mirosław Kardaś (niebieska) doczytałem w rozdziale o sterowaniu silnikiem, że problem może być w szerokości szpilki i zmieniłem rezystor 10K na 30K ale też to nic nie dało.

Może być to jakiś banał a może (a nawet na pewno) robię coś źle i nigdy powyższy kod nie zadziała tak jak chciałbym.
Jeśli ktoś jest doświadczony w tym temacie, proszę o nakierowanie mnie abym mógł ruszyć dalej.
Z góry dziękuję za odpowiedzi.
 
Odpowiedź
#2
Kolego zacznij od podstaw elektryczności . To co przedstawiłeś to typowy regulator PRĄDU a nie napięcia . Zrób pomiary prądu .
 
Odpowiedź
#3
(27-01-2017, 21:34)bob35 napisał(a): Kolego zacznij od podstaw elektryczności . To co przedstawiłeś to typowy regulator PRĄDU a nie napięcia . Zrób pomiary prądu .

Ok może i prąd(A) coś da, ale mierzę napięcie miernikiem z RMS przy podłączonej żarówce (czyli pod obciążeniem).
Przy pożyczonym urządzeniu (regulatorze) na pewno nie opartym na Arduino (nie wiem na czym jest zrobione bo jest zaplombowane) przy takiej samej konfiguracji (żarówka mierzenie równolegle) otrzymuję wartości:
 0- 0V
25 ~ 101,7V
50 ~ 174,5V
75 ~ 210V
90 ~ 213V
99 ~ 220V

Mogę zmierzyć PRĄD - ale wydaje mi się, że to nic nie wniesie do tego tematu. Problem jest w detekcji '0" i późniejszym wyjściu na sterowanie TRIAKIEM. Detekcja 0 działa jak ją odepnę żarówka nie świeci. Nie mam na razie dostępu do oscyloskopu żeby zmierzyć szerokość impulsu detekcji 0 - bo tu też może być problem.
Jeśli ktoś może przeanalizować kod - bo tu raczej jest problem (zrobiłem błąd ) będę bardzo wdzięczny.
 
Odpowiedź
#4
Photo 
Kolego jakby było idealnie to pełne napięcie otrzymasz w połowie czyli przy 50- 227V potem 60-227 aż 100- 227V.
Tylko na początku cyklu napięcie wzrasta potem tylko regulujesz prądem .
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości