PWM simítás

A meglévő hardware eszközök fejlesztési lehetőségei, módosítások, illetve új eszközök bevezetése
Válasz küldése
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

PWM simítás

Hozzászólás Szerző: spotlite »

Sziasztok!
Segítséget kérnék tőletek. Az elektronikát csak magamtól tanulgatom és a kondenzátorok terén még nincs nagyon tapasztalatom.
Arduinoval hajtok TLC 5940 IC-ket amik 16 pwm-szabályzott led kimenetet produkálnak darabonként.
Világítási téren semmi gond nem volt eddig, de amikor a hűtésre szolgáló számítógépes ventilátorokat kötöttem a kimeneteimre akkor szabályozáskor a pwm frekvenciája miatt "zenéltek" a motorok.
Gondoltam hogy megpróbálom kondenzátorral simítani a négyszögjel hirtelen váltásait, de azt értem csak el vele, hogy a szabályozási tartományom összement. A szabályozás sokkal hamarabb ért el magasabb feszültségszintet mint kondi nélkül. Persze először azt hittem megoldottam a rejtélyt, de miután a ventilátorok megszólalási feszültségén megint jött a sípoló hang ismét lelomboztam.
Az áramköröm elég egyszerű. Az IC közvetlenül TIL193 optocsatoló ledjét hajtja, és az optó kimenete egy npn tranzisztor bázisát vezérli. Az optó és bázis közötti ellenállást kiteszteltem, hogy mekkora legyen, és kapott egy lehúzó ellenállást is. Az utólag beiktatott kondenzátort először a fogyasztóval párhuzamosan a főkörbe raktam de ott a hatékony nagyobb kapacitásúak felfújódtak és tönkrementek, aztán rájöttem, hogy ha a bázislábra kötöm azzal ugyanazt érem és nem kell annyit melóznia a kondinak így nem melegszik. Ez így is volt, csak hogy már nem maradt 470 mikrós körüli kondenzátorom csak 50 mikrós. Ezekkel a fent leírt módon történt a probléma félig de inkább nemmegoldása.
Kérdésem, hogy tehetném-e a kondit optó másik bemeneti oldalára is, ez vajon más eredményt hozna.... illetve van olyan kondiérték ami a legkisebb szabályzott állapotnál is elsimítja a pwm négyszögjelét? De lehet, hogy az egész elméletem sántít valahol?
Az adatlapon elég sok minden van, hogy hány hz-en megy a kimeneti pwm azt nem tudom megállapítani, mert csak időket ír. Vannak kondis kapcsolások de ott jóval kisebbek vannak rákötve mint ami most is van, azoknak semmi hatásuk a PWM simításra. Az angollal sajna hadilábon állok, tehát csak ami egyértelmű azt értem meg belőle.
Az esetleges válaszokat előre is köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PWM simítás

Hozzászólás Szerző: Robert »

Kondis simítás helyett változtass. A PWM frekvenciát tedd feljebb, de csak akkor ha nem a Timer0-val van összekötve. Timer1 v. Timer2-re rakott PWM az amit állíthatsz.
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Köszönöm a tanácsot!
Azt hogy mely timer-re van kötve nem tudom, csak azt, hogy a tlc_config.h részben tudok ezt azt állítgatni, és itt van egy változó amit ha csökkentek akkor nő a frekvencia. Az alap értéke 8192 és 256-ig tudom levinni. 512-nél még halkan,de hallatszik valami, 256-nál már csak a denevérek bosszankodnak :-))))
Ez jó, viszont lett egy újabb probléma. A szabályozást 0-4095 között lehet végezni. Sípolós üzemben 700 körül kezdtek forogni a ventilátorok és folyamatosan gyorsultak ahogy nőtt az érték. Az új beállítással 1-nél már megmozdulnak a ventik, és 8-nél már maxon mennek, tehát a 12 bites szabályozásból 3 bites lett a jelenlegi felállásba.
A kérdésem az lenne, hogy miként alakítsam át a meglévő kapcsolást, vagyis hova érdemes ellenállást berakni, hogy szélesedjen a szabályozás spektruma.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PWM simítás

Hozzászólás Szerző: Robert »

rajz?
Programkód?
használt függvénykönyvtár?

A kondikat igaz levetted az állításnál?
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

A kapcsolási rajz már némi igazításra vár, de a lényeget tartalmazza. Alkatrész értékek szándékosan nincsenek rajta, mert az már többször változott, és a felhasznált alkatrésznek megfelelően más és más.
pwm modul.png
DSC05604_átméretezve.JPG
DSC05605_átméretezve.JPG
A sok libary közül nekem ezt sikerült működésre bírnom a Megán az 1.0.6.-os arduinoval: https://code.google.com/p/tlc5940arduin ... r014_2.zip
Működnek a mintaprogramok is, tehát jól le lehet tesztelni.

A programkód sok minden mást is tartalmaz és lehet, hogy az elképzeléseim ismerete nélkül eléggé emészthetetlen. Jelenleg a netes kapcsolat van épp alkításon.

Kód: Egész kijelölése

//---------------------------------------------------------------------------

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Tlc5940.h"

//-----------74HCT165--------------

  #define NUMBER_OF_SHIFT_CHIPS   2  //How many shift register chips are daisy-chained.
  #define DATA_WIDTH   NUMBER_OF_SHIFT_CHIPS * 8  //Width of data (how many ext lines).
  #define PULSE_WIDTH_USEC   5  //Width of pulse to trigger the shift register to read and latch.
  #define POLL_DELAY_MSEC   1  //Optional delay between shift register reads.
  #define BYTES_VAL_T unsigned int  //You will need to change the "unsigned int" to "unsigned long" If the NUMBER_OF_SHIFT_CHIPS is higher than 2.

//------------Ethernet és változói------------------------------

  byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };   //mac azonosító
  IPAddress ip (192,168,0,77);                          //ip cím, ha nincs dhcp
  char server[] = "192.168.1.100";                      //szerver címe  WEB: **spotlite.dyndns-server.com**
  char dir[] = "Myweb/admin/NET/arduino/online.php";    //kapcsolattartó php címe
  char kar;                                             //pufferekből beolvasott aktuális érték
  String netdata;                                       //webes pufferből beolvasott értékek összerakva szöveggé
  String netsend="ping_";
  unsigned long i=1;
  int ser;                                              //serial létezését mutató változó
  int seri;
  int web_answer_wait=10;
  //int web_wait_value=100;
  //int web_wait_conn_value=300;
  String wread_data;
  String wsend_data;
  String sread_data;
  int err;
  EthernetClient client;

//-----------74HCT165--------------

  int ploadPin        = 22;  // Connects to Parallel load pin the 165: 1 pin
  int clockEnablePin  = 24;  // Connects to Clock Enable pin the 165: 15 pin
  int dataPin         = 25; // Connects to the Q7 pin the 165: 8 pin (7)
  int clockPin        = 23; // Connects to the Clock pin the 165: 2 pin

  BYTES_VAL_T pinValues;
  BYTES_VAL_T oldPinValues;
  
//----------Multitasking------------  
  
  int system_state;
  unsigned long input_ping = 100; unsigned long input_ping_time;
  unsigned long serial_read = 100; unsigned long serial_read_time;
  unsigned long eth_ping = 100; unsigned long eth_ping_time; int webstep;
  int start_step;
  
//----------LCD Display------------

  LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 20 chars and 4 line display
  //LiquidCrystal_I2C lcd(0x27, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE); // set the LCD address to 0x27 for a 16 chars and 2 line display
 
//-------------------------74HCT165---------------------------------------
/* This function is essentially a "shift-in" routine reading the
 * serial Data from the shift register chips and representing
 * the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs()
  {
    long bitVal;
    BYTES_VAL_T bytesVal = 0;

    /* Trigger a parallel Load to latch the state of the data lines,
    */
    digitalWrite(clockEnablePin, HIGH);
    digitalWrite(ploadPin, LOW);
    delayMicroseconds(PULSE_WIDTH_USEC);
    digitalWrite(ploadPin, HIGH);
    digitalWrite(clockEnablePin, LOW);

    /* Loop to read each bit value from the serial out line
     * of the SN74HC165N.
    */
    for(int i = 0; i < DATA_WIDTH; i++)
    {
        bitVal = digitalRead(dataPin);

        /* Set the corresponding bit in bytesVal.
        */
        bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));

        /* Pulse the Clock (rising edge shifts the next bit).
        */
        digitalWrite(clockPin, HIGH);
        delayMicroseconds(PULSE_WIDTH_USEC);
        digitalWrite(clockPin, LOW);
    }

    return(bytesVal);
  }

//---------------------------74HCT165----------------------------------------
/* Serial porton elküldi a bemeneti 74HTC165 bővítők állapotát tartalmazó változó értékeit.
*/
void display_pin_values()
  {
    Serial.print("Pin allapot:\r\n");

    for(int i = 0; i < DATA_WIDTH; i++)
    {
        Serial.print("  Pin-");
        Serial.print(i);
        Serial.print(": ");

        if((pinValues >> i) & 1)
            Serial.print("Be");
        else
            Serial.print("Ki");

        Serial.print("\r\n");
    }

    Serial.print("\r\n");
  }

/* input alap progi
*/
void input_basic()
  {
   // Read the state of all zones.   
    pinValues = read_shift_regs();

    // If there was a chage in state, display which ones changed.    
    if(pinValues != oldPinValues)
    {
        Serial.print("Valtozott a bemenetek allapota:\r\n");
        display_pin_values();
        oldPinValues = pinValues;
    } 
    input_ping_time = millis() + input_ping;
  }
//--------------------------------------------------------------------------------
/* Ez az eljárás beállítja a kimenetek alap értékét. Ez egy ideiglenes eljárás
   amíg az online és memóriás kiolvasás meg nem valósul
*/
void defout()
  {
  Tlc.set(0, 0);  //fióksor RGB ledszallag ZÖLD
  Tlc.set(1, 0);  //fióksor RGB ledszallag KÉK
  Tlc.set(2, 0);  //fióksor RGB ledszallag PIROS
  Tlc.set(3, 0);  //nagy gép előtti RGB ledszallag ZÖLD 
  Tlc.set(4, 0);  //nagy gép előtti RGB ledszallag KÉK
  Tlc.set(5, 0);  //nagy gép előtti RGB ledszallag PIROS
  Tlc.set(6, 0);  //nagy gép előtti fehér ledszallag
  Tlc.set(7, 0);  //
  Tlc.set(8, 0);  //
  Tlc.set(9, 1);  //arduino-router közti ventillátor
  Tlc.set(10, 1);  //szerver külső ventillátor
  Tlc.set(11, 2);  //szerver belső ventillátor
  Tlc.set(12, 2);  //router ventillátor
  Tlc.set(13, 0);  //kis fiók alatti fehér ledszallag
  Tlc.set(14, 0);  //jobb szélső fehér ledszallag
  Tlc.set(15, 2);  //kis fiók ventillátor
  Tlc.set(16, 2);  //switch ventillátor
  Tlc.set(17, 4095);  //szervíz világítás arduino  
  Tlc.set(18, 0);  //fioksor fehér ledszallag
  Tlc.set(19, 0);  //kis fiók világítás
  Tlc.set(20, 0);  //jobb szélső RGB ledszallag KÉK
  Tlc.set(21, 0);  //jobb szélső RGB ledszallag ZÖLD
  Tlc.set(22, 0);  //jobb szélső RGB ledszallag PIROS
  Tlc.set(23, 0);  //kis fiók alatti RGB ledszallag KÉK
  Tlc.set(24, 0);  //kis fiók alatti RGB ledszallag ZÖLD
  Tlc.set(25, 0);  //kis fiók alatti RGB ledszallag PIROS
  Tlc.set(26, 0);  //szervíz világítás riasztó és belső része
  Tlc.set(27, 0);  //szervíz router switch ledszallag
  Tlc.set(28, 0);  //???? alsó világítás nem műxik
  Tlc.set(29, 0);  //szervíz konektorok ledszallag
  Tlc.set(30, 0);  //szervíz számítógép, szerver hátsó világítás
  Tlc.set(31, 0);  //szervíz számítógép, szerver első világítás
  delay (1);
  Tlc.update(); 
  }

//--------------------------------------------------------------------------------
/* Ez az eljárás beállítja LCD kijelző definiálható karaktereit, és egyéb értékeit.
*/

void i2c_lcd_setup()
  { 
  byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111};         // 'á' 225
  byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};    // 'é' 233
  byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110};            // 'í' 237
  byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110};       // 'ó' 243
  byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110};    // ''
  byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110};     // ''
  byte u1[8] = {B10,B100,B10001,B10001,B10001,B10011,B1101};   // ''
  byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101};       // ''
  byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101};    // ''
 
  lcd.createChar(0, a1);
  lcd.createChar(1, e1);
  lcd.createChar(2, i1);
  lcd.createChar(3, o1);
  lcd.createChar(4, o3);
  lcd.createChar(5, u1);
  lcd.createChar(6, u2);	//karakterdefinialas
  lcd.createChar(7, u3);	//o:-nek nincs hely!
  
  lcd.init();
  
  lcd.noBacklight();
  
  /* Print a message to the LCD.
  lcd.setCursor(4,0); lcd.print("Szia Hazlako");
  lcd.setCursor(2,1); lcd.print("Indul a rendszer");
  lcd.setCursor(2,2); lcd.print("Love Dori & Beni");
  lcd.setCursor(1,3); lcd.print("Message from Dino");*/
  }

//--------------Webes eljárások----------------------------------------

void web_basic()
  {
   /*if (client.available()) {webread();} 
   else {eth_ping_oldtime = millis();} 
   if (web==2) {webwait();}
   if (web==3) {client.connect(server, 80); web=4;}  
   if (web==4) {websend();}*/
   
   if (webstep == 0) { websend(); }
   if (webstep == 1) { webread(); } 
   
  } 
    
//***********************************************************    
    
void web_connect()
  {
  //-------DHCP vagy fixIP-------
  if   (Ethernet.begin(mac) == 0) 
  {
    lcd.setCursor(0,0); lcd.print("DHCP hiba!");
    Ethernet.begin(mac, ip); 
    lcd.setCursor(0,1); lcd.print ("Kapcsolodas");
    lcd.setCursor(0,2); lcd.print ("fix IP-vel:");
    lcd.setCursor(0,3); lcd.print (ip);
    delay (5000); lcd.clear();
  }
  //------Kapcsolódás a megadott szerverhez-----

    client.connect(server, 80);
    while (!client.connected()){}   
    lcd.setCursor(0,3); lcd.print ("IP: ");
    lcd.print (Ethernet.localIP()); 
    
    
    
  }
  
//***********************************************************

void websend()
{
  
       /*web_wait++; lcd.setCursor(13,0); lcd.print (web_wait-1);
       if (web_wait == web_wait_conn_value) 
          {
           web_wait=0; 
           web=3;
           err++;
           Serial.print ("Hiba: "); Serial.println (err);
           lcd.setCursor(13,1); lcd.print (err);
          }*/
          client.connect(server, 80);
       if (client.connected()) 
          { 
          client.print("POST /");         
          client.print (dir);             
          client.print("?adat=");       
          client.print (netsend);  client.println(i++);     
          client.print("Host: ");        
          client.println (server);
          webstep=1; eth_ping_time = millis() + web_answer_wait;
          }
          
        else  
          {
            
          }
         
           
}

//*******************************************************************

void webread()
{
          if (client.connected()) 
          { 
           if (client.available()) 
           {                                                                              
            netdata=client.readStringUntil('\n').substring(6); 
            client.stop();            
            lcd.setCursor(0,0); lcd.print (netdata); 
            if (ser==1) {Serial.println (netdata);}
            webstep=0; 
            eth_ping_time = millis() + eth_ping;
           }
          }
  
}

//--------------------------------------------------------------------------------

void serial_basic()
{
  if (Serial.available()) 
  {
   sread_data = Serial.readStringUntil('\n');
   serial_select();
  }
  serial_read_time = millis() + serial_read;
}

//--------------------------------------------------------------------------------


void serial_select()
{
 
  if (sread_data == "on") {ser=1;  Serial.println ("service mode"); lcd.setCursor(0,1); lcd.print ("service mode");}
  if (sread_data == "off") {ser=0;  Serial.println ("normal mode, serial off"); lcd.setCursor(0,1); lcd.print ("normal mode ");}
  if (sread_data == "be") {Tlc.set(3, 4095); Tlc.update(); }
  if (sread_data == "ki") {Tlc.set(3, 0); Tlc.update(); }
  if (sread_data == "koz") {Tlc.set(3, 500); Tlc.update(); }
  if (sread_data == "lcd.reset") {i2c_lcd_setup(); lcd.setCursor(0,1); lcd.print ("normal mode"); lcd.setCursor(13,1); lcd.print (err);}
     
}

//--------------------------------------------------------------------------------

void start_setup()
{
  //----Serial setup----
  Serial.begin (115200);
  
  //----i2c LCD setup---- 
  i2c_lcd_setup();
  lcd.backlight ();
  lcd.clear();
  
   //-----TLC setup------
  Tlc.init();
  defout();
  
  //----Ethernet setup----
  web_connect();
  lcd.setCursor(0,1); lcd.print ("normal mode");
  
  //-----74HTC165 setup------
  // Initialize our digital pins...
    pinMode(ploadPin, OUTPUT);
    pinMode(clockEnablePin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, INPUT);

    digitalWrite(clockPin, LOW);
    digitalWrite(ploadPin, HIGH);  
    // Read in and display the pin states at startup.   
    pinValues = read_shift_regs();
    display_pin_values();
    oldPinValues = pinValues;
    
    start_step = 1;   
}
  
//--------------------------------------------------------------------------------

void start()
{
  if (start_step == 0)  { start_setup(); }
  
 
  
  system_state = 1;
}
    
//--------------------------------------------------------------------------------

void setup() {}

//-------------------------------------------------------------------------------


void loop()
{
  
//-----------------------------------------  
 if (system_state == 0) { start();}                        //indulás
//-----------------------------------------
 if (system_state == 1)                                    // normál üzem
  {
   if (input_ping_time <= millis()) { input_basic(); }     //bemenetek ellenőrzése
   if (serial_read_time <= millis()) { web_basic(); }      //serial port bejövő adat ellenörzése
   if (eth_ping_time <= millis()) { serial_basic(); }      //ethernet bejövő adat ellenörzése
  }
//-----------------------------------------
 if (system_state == 2){}
//-----------------------------------------
}

Az Általad javasolt PWM frekvenciát a libaryban lévő 'tlc_config.h' programban lévő '#define TLC_PWM_PERIOD 256' állítással értem el.
Természetesen a tudatlanságom gőzében próbáltam minden mást is állítani, de csak ez vezetett sikerhez.
A kondikat már az első pillanattól kiiktattam.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PWM simítás

Hozzászólás Szerző: Robert »

A TLC chipen van a motor?
Ez nem derült (eddig) ki.
Amúgy ezt LEDre szokták rakni...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: PWM simítás

Hozzászólás Szerző: kapu48 »

Adatlap: http://www.ti.com/lit/ds/symlink/tlc5940.pdf

Szerintem a GSCLK bemenetre adott óra jelel, állítod a frekvenciát.

Amit Te alítottál az szerintem a PWM kitöltési tényező.
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Robert írta:A TLC chipen van a motor?
Ez nem derült (eddig) ki.
Amúgy ezt LEDre szokták rakni...
Az első hozzászólásban volt:
Az áramköröm elég egyszerű. Az IC közvetlenül TIL193 optocsatoló ledjét hajtja, és az optó kimenete egy npn tranzisztor bázisát vezérli. Az optó és bázis közötti ellenállást kiteszteltem, hogy mekkora legyen, és kapott egy lehúzó ellenállást is.
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

kapu48 írta:Adatlap: http://www.ti.com/lit/ds/symlink/tlc5940.pdf

Szerintem a GSCLK bemenetre adott óra jelel, állítod a frekvenciát.

Amit Te alítottál az szerintem a PWM kitöltési tényező.
Itt van a 'tlc_config.h' fájl tartalma az egyszerűség kedvéért. Közben nekiállok megint állítgatni és próbálgatni a változókat.... Ja és köszönöm, hogy foglalkoztok a nyűgömmel. :D

Kód: Egész kijelölése

/*  Copyright (c) 2009 by Alex Leone <acleone ~AT~ gmail.com>

    This file is part of the Arduino TLC5940 Library.

    The Arduino TLC5940 Library is free software: you can redistribute it
    and/or modify it under the terms of the GNU General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    The Arduino TLC5940 Library is distributed in the hope that it will be
    useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with The Arduino TLC5940 Library.  If not, see
    <http://www.gnu.org/licenses/>. */

#ifndef TLC_CONFIG_H
#define TLC_CONFIG_H

#include <stdint.h>

/** \file
    Configuration for the Arduino Tlc5940 library.  After making changes to
    this file, delete Tlc5940.o in this folder so the changes are applied.

    A summary of all the options:
    - Number of TLCs daisy-chained: NUM_TLCS (default 1)
    - Enable/Disable VPRG functionality: VPRG_ENABLED (default 0)
    - Enable/Disable XERR functionality: XERR_ENABLED (default 0)
    - Should the library use bit-banging (any pins) or hardware SPI (faster):
        DATA_TRANSFER_MODE (default TLC_SPI)
    - Which pins to use for bit-banging: SIN_PIN, SIN_PORT, SIN_DDR and
        SCLK_PIN, SCLK_PORT, SCLK_DDR
    - The PWM period: TLC_PWM_PERIOD (be sure to change TLC_GSCLK_PERIOD
        accordingly!)

    How to change the pin mapping:
    - Arduino digital pin 0-7  = PORTD, PD0-7
    - Arduino digital pin 8-13 = PORTB, PB0-5
    - Arduino analog pin  0-5  = PORTC, PC0-5 */

/** Bit-bang using any two i/o pins */
#define TLC_BITBANG        1
/** Use the much faster hardware SPI module */
#define TLC_SPI            2

/* ------------------------ START EDITING HERE ----------------------------- */

/** Number of TLCs daisy-chained.  To daisy-chain, attach the SOUT (TLC pin 17)
    of the first TLC to the SIN (TLC pin 26) of the next.  The rest of the pins
    are attached normally.
    \note Each TLC needs it's own IREF resistor */
#define NUM_TLCS    2

/** Determines how data should be transfered to the TLCs.  Bit-banging can use
    any two i/o pins, but the hardware SPI is faster.
    - Bit-Bang = TLC_BITBANG
    - Hardware SPI = TLC_SPI (default) */
#define DATA_TRANSFER_MODE    TLC_SPI

/* This include is down here because the files it includes needs the data
   transfer mode */
#include "pinouts/chip_includes.h"

/* Set DATA_TRANSFER_MODE to TLC_BITBANG and change the pins below if you need
   to use different pins for sin and sclk.  The defaults are defined in
   pinouts/ATmega_xx8.h for most Arduino's. */

#if DATA_TRANSFER_MODE == TLC_BITBANG
/** SIN (TLC pin 26) */
#define SIN_PIN        DEFAULT_BB_SIN_PIN
#define SIN_PORT       DEFAULT_BB_SIN_PORT
#define SIN_DDR        DEFAULT_BB_SIN_DDR
/** SCLK (TLC pin 25) */
#define SCLK_PIN       DEFAULT_BB_SCLK_PIN
#define SCLK_PORT      DEFAULT_BB_SCLK_PORT
#define SCLK_DDR       DEFAULT_BB_SCLK_DDR
#endif


/** If more than 16 TLCs are daisy-chained, the channel type has to be uint16_t.
    Default is uint8_t, which supports up to 16 TLCs. */
#define TLC_CHANNEL_TYPE    uint16_t

/** Determines how long each PWM period should be, in clocks.
    \f$\displaystyle f_{PWM} = \frac{f_{osc}}{2 * TLC\_PWM\_PERIOD} Hz \f$
    \f$\displaystyle TLC\_PWM\_PERIOD = \frac{f_{osc}}{2 * f_{PWM}} \f$
    This is related to TLC_GSCLK_PERIOD:
    \f$\displaystyle TLC\_PWM\_PERIOD =
       \frac{(TLC\_GSCLK\_PERIOD + 1) * 4096}{2} \f$
    \note The default of 8192 means the PWM frequency is 976.5625Hz */
#define TLC_PWM_PERIOD    256

/** Determines how long each period GSCLK is.
    This is related to TLC_PWM_PERIOD:
    \f$\displaystyle TLC\_GSCLK\_PERIOD =
       \frac{2 * TLC\_PWM\_PERIOD}{4096} - 1 \f$
    \note Default is 3 */
#define TLC_GSCLK_PERIOD    3

/** Enables/disables VPRG (TLC pin 27) functionality.  If you need to set dot
    correction data, this needs to be enabled.
    - 0 VPRG is not connected.  <em>TLC pin 27 must be grounded!</em> (default)
    - 1 VPRG is connected
    \note VPRG to GND inputs grayscale data, VPRG to Vcc inputs dot-correction
          data */
#define VPRG_ENABLED    0

/** Enables/disables XERR (TLC pin 16) functionality to check for shorted/broken
    LEDs
    - 0 XERR is not connected (default)
    - 1 XERR is connected
    \note XERR is active low */
#define XERR_ENABLED    0

/*  You can change the VPRG and XERR pins freely.  The defaults are defined in
    the chip-specific pinouts:  see pinouts/ATmega_xx8.h for most Arduino's. */

#if     VPRG_ENABLED
/** VPRG (TLC pin 27) */
#define VPRG_PIN        DEFAULT_VPRG_PIN
#define VPRG_PORT       DEFAULT_VPRG_PORT
#define VPRG_DDR        DEFAULT_VPRG_DDR
#endif

#if     XERR_ENABLED
/** XERR (TLC pin 16) */
#define XERR_PIN        DEFAULT_XERR_PIN
#define XERR_PORT       DEFAULT_XERR_PORT
#define XERR_DDR        DEFAULT_XERR_DDR
#define XERR_PINS       DEFAULT_XERR_PINS
#endif

/* ------------------------- STOP EDITING HERE ----------------------------- */

#if DATA_TRANSFER_MODE == TLC_SPI
/** SIN (TLC pin 26) */
#define SIN_PIN        TLC_MOSI_PIN
#define SIN_PORT       TLC_MOSI_PORT
#define SIN_DDR        TLC_MOSI_DDR
/** SCLK (TLC pin 25) */
#define SCLK_PIN       TLC_SCK_PIN
#define SCLK_PORT      TLC_SCK_PORT
#define SCLK_DDR       TLC_SCK_DDR
#endif



#if !(DATA_TRANSFER_MODE == TLC_BITBANG \
 || DATA_TRANSFER_MODE == TLC_SPI)
#error "Invalid DATA_TRANSFER_MODE specified, see DATA_TRANSFER_MODE"
#endif

/* Various Macros */

/** Arranges 2 grayscale values (0 - 4095) in the packed array format (3 bytes).
    This is for array initializers only: the output is three comma seperated
    8-bit values. */
#define GS_DUO(a, b)    ((a) >> 4), ((a) << 4) | ((b) >> 8), (b)


#if VPRG_ENABLED
/** Arranges 4 dot correction values (0 - 63) in the packed array format.
    \see setDCtoProgmemArray */
#define DC_QUARTET(a, b, c, d)   ((a) << 2) | ((b) >> 4), \
                                 ((b) << 4) | ((c) >> 2), \
                                 ((c) << 6) | (d)
#endif

#endif
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Találtam egy ilyet:
http://www.oxgadgets.com/2011/10/adjust ... alues.html

Itt 3,9khz et tudok elérni a gyári 1 khz helyett. Mindjárt tesztelem is.
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Azt hiszem a fenti linkben leírtak és egy onnan továbbmutató oldal leírása alapján úgy tűnik, hogy az ő elképzelésük szerint nem lehet eléggé felhúzni a frekit.
A leírás és a config fájl alapján is 2 változó a döntő a működésben.

Az egyik a már említett: TLC_PWM_PERIOD
Ez határozza meg az órajelet 16.000.000 / (2 x TLC_PWM_PERIOD)
Én a TLC_PWM_PERIOD-ot 256-ra állítottam, ekkor már nem volt hang. A képlet alapján 16.000.000 / 512 = 31.250 Hz ez már ultrahang.
Ez ténylegesen ennyi mert végigmentem és 512-nél ami 16,5 khz körül van, még hallható volt vajmi nyüszítés.

A probléma ott van, hogy a helyes működéshez a TLC_GSCLK_PERIOD-nak is megfelelő értékűnek kell lennie.
Ennek a képlete: ((2 x TLC_PWM_PERIOD) / 4096) -1
Ebből látszik, hogy 2048-as TLC_PWM_PERIOD-nál nulla jön ki ami nálam nem is produkál működést a leírással ellentétben.
A 256-hoz mínusz előjelű tört szám jönne ki ami nem túl ehető az arduinonak.

Próbáltam lefelé vinni a frekvenciát, hisz csak nem fog mélynyomóként viselkedni a venti, de a következő 16384 értéken már nem csinált semmit a rendszer a leírtakkal szemben.
Úgy tűnik, hogy ezt a ketyerét ugye ledekre tervezték, és nem gondolták, hogy majd valaki másra szeretné használni.
Nem lehet, hogy mégis csak kondiba kéne gondolkozni ebben az esetben? A hétvégi pakolásnál találtam több száz 470 mikrós 10 voltos kondit papírszallagon :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: PWM simítás

Hozzászólás Szerző: Robert »

Nem. Így kondival nem megy.
RC szűrő építhető, de a terheléséhez műveleti erősítő kell (leválasztás miatt).
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Az RC szűrő az amikor egy ellenálláson keresztül lassítva töltődik fel egy kondenzátor, majd ugyanúgy lassan is sül ki?
Bármit is alkalmazok azt nem a terhelésnél érdemes, hanem az optó ledjénél kell elérni.
Ez egy állandó értékű terhelés, csak egyszer kell rá egy jó "receptet" kidolgozni, és az mindig jó lesz, ha egy kis izzót szabályozok, vagy ha a paksi erőművet.
Szóval RC szűrő......nyomozok...... na meg mitől műveleti az az erősítő..... ez a második lecke 8O
bittoi
Újonc
Újonc
Hozzászólások: 7
Csatlakozott: 2015. március 11. szerda, 1:23

Re: PWM simítás

Hozzászólás Szerző: bittoi »

megkésett levél....
csak most olvastam ezt a témát, de hátha segítek kicsit...
a pc ventillátorokat nem lehet egyen feszültség állítással szabájozni, mert ezek nem hagyományos motorok.
érdemes egyet szétszedni..
belül egy IC található amely kivezetésein kis elektromágnesek ülnek, külön-külön bekötve.
az ic fix tempóban változtatja a mágneses tér mozgatását, ill külön bemenettel állítható..
ha lejjebb vesszük a tápfeszt, akkor a mágneses tér változási sebessége nem változik, csak csökken a mábneses terek ereje, ami a terhelés függvényében lassuláshoz vezethet, vagy pl el sem indul..
mivel a beépített ic tápfeszültség szükséglete a mérvadó, így ha elégséges akkor elektromosan üzemel, legfeljebb nem tud forogni..
ill. a terheléses alsó teljesítmény határ felett, a tekercsek munkavégzése változtatja némileg a fordulatot, aktuális energiájuktól függően..
Tehát a beépített Ic minimum tápfesze alatt el sem indulnak, de felette is terhelésfüggően változik a fordulat, és nem is túl sokat..
Tehát Robinak igaza volt. Ez itt nem megoldás, de csak a motor jellege miatt. PWM-mel csak az ic tápfeszét kapcsolgatjuk ki-be....
még szép hogy zenél....
erre a célra vagy hagyományos pl szénkefés modellmotort kell használni, vagy változtatható fordulatszámú ventillátort másik szabályozással..
Remélem hogy nem sértettem meg senkit, és sajnálom hogy ilyen későn tudtam csak reagálni..
de remélem aki nem látott még ilyen ventillátort belülről, az most átgondolja a lehetőségek tárházát...
a poén az, hogy szerintem normál motorral már az első kondis simításnak is múködnie kellett volna, még ha nem is nagyon hatékonyan....
Mindenkinek üdv
bittoi
Avatar
spotlite
DrótVégénSzéndarab
Hozzászólások: 19
Csatlakozott: 2011. február 23. szerda, 7:00

Re: PWM simítás

Hozzászólás Szerző: spotlite »

Húúú köszi a kimerítő választ...
Igazából a ventik szabályozása csak "teszt" jelleggel volt próbálgatva, mert gondoltam ez olyan kézenfekvő egyszerű motor(nak tűnt). Hát most már ezt is tudom, hogy ez valami léptető motorhoz hasonló valami.
Majd keresek, valami hagyományosabb motort :-)
spoti
Válasz küldése