PWM simítás
PWM simítás
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.
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.
Re: PWM simítás
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.
Re: PWM simítás
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.
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.
Re: PWM simítás
rajz?
Programkód?
használt függvénykönyvtár?
A kondikat igaz levetted az állításnál?
Programkód?
használt függvénykönyvtár?
A kondikat igaz levetted az állításnál?
Re: PWM simítás
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.
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.
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.
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: 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){}
//-----------------------------------------
}
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.
Re: PWM simítás
A TLC chipen van a motor?
Ez nem derült (eddig) ki.
Amúgy ezt LEDre szokták rakni...
Ez nem derült (eddig) ki.
Amúgy ezt LEDre szokták rakni...
Re: PWM simítás
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ő.
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ő.
Re: PWM simítás
Az első hozzászólásban volt:Robert írta:A TLC chipen van a motor?
Ez nem derült (eddig) ki.
Amúgy ezt LEDre szokták rakni...
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.
Re: PWM simítás
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.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ő.
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
Re: PWM simítás
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.
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.
Re: PWM simítás
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
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
Re: PWM simítás
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).
RC szűrő építhető, de a terheléséhez műveleti erősítő kell (leválasztás miatt).
Re: PWM simítás
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
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
Re: PWM simítás
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
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
Re: PWM simítás
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
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