Ha van kéznél Atmega32u4 MCU-s board (micro, leonardo), akkor arra lehet olyan firmware-t tölteni, hogy AVRISP mkII lesz belőle. LUFA-ban van a példák között. Próbáltam, működik.
Annyira azért nem független az MCU órajelétől, mint ahogy mondod. Ugyanazt kapják, csak leosztják, stb. Timer állítják elő a pwm-et, aminek az időalapja ugyanaz (legalábbis tudtommal, merthogy általában így szokott lenni, kivételt képez az a megoldás, amikor több forrásból használnak órajelet) az órajel mint amivel az MCU is megy.
Azért függ a frekije adott lábakon, mert más és más belső timer van van kivezetve az adott lábakra..
Hogyha ezeken az alap Arduinos beállításokon változtatni akarunk, mélyebben bele kell túrni a spec regiszterekbe, és ahhoz kicsit jobban kell ismerni magát a procit és ott kell játszani. Vannak akik ezt már megtették, van kész megoldás is az PWM frekijének változtatására akár Hz szintű felbontással beállíthatóan, több letölthető könyvtárt is kreáltak rá sokan. De ez nem az analogwrite utasításos megoldás.
Az a helyzet, hogy az Arduinohoz (is) meg kell tanulni programozni jól ebben a környezetben. Utána jó lesz.
Nyilván, ha erre nincs idő, akkor venni kell egy kész rendszert, PLC-t, stb.
Én csináltam termosztátot, fűtés átkapcsolót (amikor a vegyes tüzelésű kazán lehűlt, visszakapcsolta a cirkót), stb. és tapasztalataim szerint 100%-os megbízhatósággal ment. Nyilván ha a drótokat nem kötöm be rendesen és szétcsúszik és azért nem megy, az meg az én hibám.
Lefagyni nem fagy le, és még akkor is ott a watchdog, de én mondjuk watchdog nélkül használtam (felelőtlenség), ugyanakkor nálam voltak további biztonsági rendszerek (pl. fizikai szelep ami vész esetén elengedi a túlnyomást).
De nem ám. A PWM teljesen független az MCU órájától. Egyetlen "hátránya" számodra, hogy nem 20 Hz, hanem vagy kb. 1 kHz vagy kb. 500 Hz, attól függően, hogy melyik lábra rakod ki. Egy használható forrást találtam erre hirtelen (bár sokáig nem kerestem): https://arduino-info.wikispaces.com/Arduino-PWM-Frequency . Ezt nem teszteltem, úgyhogy tippem sincs, hogy az új IDE alatt mennyire működik (ha egy cikk Duemilanove-t vagy Diecimila-t emleget, akkor elég régi).
Ha egy PWM lábat bekapcsolsz PWM módban [analogWrite() ], akkor ez egészen addig fog villódzani, amíg ki nem kapcsolod, teljesen függetlenül attól, hogy egyébként mi történik a programban (delay() stb.), kivéve, ha valami oknál fogva vagy kiakad az MCU.
van a chipben hardware pwm asszem, az külön célhardver, nem nagyon függ semmitől. de az arduino maga is ad pwd támogatást, szerintem azt szokás használni.
Nem, a legkevésbé sem. Most is több millió autó futkároz az utakon, amelyeknek pl. a vezetőtájékoztató rendszerei részben vagy egészben Atmel alapúak (ez az alap Arduino alapja), és kiválóan működnek. Az Arduino viszont alapvetően tanulási és oktatási célra kifejlesztett fejlesztőkörnyezet szofverrel, hardverrel és tudásbázissal. A hardveres és szoftveres rész ezért -- mérnöki szemmel sok szempontból indokolatlanul egyszerűsített, illetve bonyolított -- változtatáson esett át, kapott olyasmiket, amiket nem feltétlen kellett volna és pár dolgot eldugtak, aminek nagy hasznát lehetne venni.
A rendszernek vannak korlátai nyilván, mint mindennek. Ezeket felismerve adott célra jó (ha épp nem tökéletes) megoldás.
A műszaki adatok alapján 0,17, 0,22 mp (vagyis 170 és 220 ms) között van a konverziós idő. Ebbe még pár dolgot bele kell számolni, így azt mondom, valahol 300 ms körüli várakozás lesz jó, illetve innen lehet felfelé mászni, ha szükséges.
Másrészt kvázi pwm-et nem delay()-jel az első 2-3 napon csinálunk, utána már nem. Egyrészt pontatlan lesz, másrészt két delay() nem futhat egy időben. Az Arduino IDE e tekintetben sajnos harmatgyenge (nincs, illetve még nem találtam szoftveres időalapú interrupt-ot). Marad az if() és a while().
#include <Wire.h> // Ez miért kell? #include <MAX6675.h> int CS = 10; // CS pin on MAX6675 int SO = 11; // SO pin of MAX6675 int SCLK = 9; // SCLK pin of MAX6675 int units = 1; // Units to readout temp (0 = raw, 1 = ˚C, 2 = ˚F)
float homers = 0.0; // Temperature output variable
// Initialize the MAX6675 Library for our chip
MAX6675 temp(CS,SO,SCLK,units);
void setup()
{ Serial.begin(9600);
}
void loop()
{ // Read the temp from the MAX6675 homers = temp.read_temp(); Serial.println(homers); delay(200);