मैं अपने डेक को रोशन करने के लिए एक एटीटीनी का उपयोग कर रहा था। ADC पिन से जुड़े बर्तन का उपयोग करके चमक को नियंत्रित किया जाता है।
कोशिश की गई घातीय फ़ंक्शन और उस पर आधारित PWM आउटपुट कथित चमक में रैखिक वृद्धि दे रहा है।
मैं इस सूत्र का उपयोग कर रहा था:
out = pow(out_max, in/in_max)
उपरोक्त गणना करने के लिए Attiny85 @ 8MHz लगभग 210us ले रहा था। प्रदर्शन में सुधार करने के लिए, लुकअप टेबल बनाया। चूंकि इनपुट 10-बिट एडीसी से था और एटीटीनी मेमोरी सीमित है, इसलिए मैं एक छोटी तालिका भी बनाना चाहता था।
1024 प्रविष्टियों के साथ लुकअप टेबल बनाने के बजाय, प्रोग्राम मेमोरी (PGMEM) में 256 प्रविष्टियों (512 बाइट्स) के साथ एक रिवर्स लुकअप टेबल बनाया। उस टेबल पर बाइनरी सर्च करने के लिए एक फंक्शन लिखा गया था। प्रत्येक लुकअप के लिए यह विधि केवल 28uS लेती है। यदि मैं एक प्रत्यक्ष लुकअप तालिका का उपयोग करता हूं, तो इसे 2kb मेमोरी की आवश्यकता होगी, लेकिन लुकअप केवल 4uS या तो ले जाएगा।
लुकअप टेबल में परिकलित मान इनपुट रेंज 32-991 का ही उपयोग करता है, एडीसी की निचली / ऊपरी श्रेणी को छोड़ने के मामले में, सर्किट में समस्या है।
नीचे अब मेरे पास क्या है।
// anti_log परीक्षण कार्यक्रम
/ * PIN6 (PB1) से जुड़ा एलईडी * /
# डेफिन एलईडी 1
// एंटी-लॉग (रिवर्स) लुकअप टेबल
// y = 0-255 (pwm आउटपुट), y_range = 256
// x = 0-1023 (10-बिट एडीसी इनपुट);
// एडीसी आउट मानों के निचले / उच्च अंत का उपयोग नहीं किया जा सकता है
// पहले 32 और अंतिम 32 मानों को त्यागना।
// min_x = 32, max_x = 1023-min_x, x_range = 1024-2 * min_x
// ANTI_LOG [y] = राउंड (x_range * लॉग (y, आधार = y_range) + min_x)
// x का मान दिया गया, नीचे तालिका पर एक बाइनरी लुकअप करें
// Attiny85 @ 8MHz घड़ी के लिए लगभग 28uS लेता है
PROGMEM prog_uint16_t ANTI_LOG [] = {
0x0000, 0x0020, 0x0098, 0x00de, 0x0110, 0x0137, 0x0156, 0x0171, 0x0188, 0x019c, 0x01af, 0x01bf, 0x01ce, 0x01dc, 0x01e9, 0x01f5
0x0200, 0x020a, 0x0214, 0x021e, 0x0227, 0x022f, 0x0237, 0x023f, 0x0246, 0x024d, 0x0254, 0x025b, 0x0261, 0x0261, 0x0267, 0x0267, 0x0267
0x0278, 0x027d, 0x0282, 0x0288, 0x028c, 0x0291, 0x0296, 0x029a, 0x029f, 0x02a3, 0x02a7, 0x02ab, 0x02ab, 0x02af, 0x02af, 0x02af, 0x02af, 0x028af
0x02be, 0x02c2, 0x02c5, 0x02c9, 0x02cc, 0x02cf, 0x02d3, 0x02d6, 0x02d9, 0x02d9, 0x02dc, 0x02d2, 0x02d2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2, 0x02c2
0x02f0, 0x02f3, 0x02f5, 0x02f8, 0x02fa, 0x02fd, 0x0300, 0x0302, 0x0304, 0x0307, 0x0309, 0x030b, 0x030e, 0x030e, 0x0310
0x0317, 0x0319, 0x031b, 0x031d, 0x031f, 0x0321, 0x0323, 0x0325, 0x0327, 0x0329, 0x032b, 0x032d, 0x032f, 0x033f, 0x0331, 0x0331, 0x0331
0x0336, 0x0338, 0x033a, 0x033c, 0x033d, 0x033f, 0x0341, 0x0342, 0x0344, 0x0346, 0x0347, 0x0349, 0x034b, 0x034b, 0x034b, 0x034c, 0x034c
0x0351, 0x0352, 0x0354, 0x0355, 0x0357, 0x0358, 0x035a, 0x035b, 0x035d, 0x035e, 0x0360, 0x0361, 0x0363, 0x0363, 0x0364, 0x0364, 0x0364
0x0368, 0x0369, 0x036b, 0x036c, 0x036d, 0x036f, 0x0370, 0x0371, 0x0372, 0x0374, 0x0375, 0x0376, 0x0378, 0x0378, 0x0379, 0x0379।
0x037c, 0x037e, 0x037f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038a, 0x038a, 0x038b, 0x038a।
0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039b, 0x039b, 0x0390
0x039f, 0x03a1, 0x03a2, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a8, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a9, 0x03a2, 0x03a9
0x03ae, 0x03b0, 0x03b1, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b4, 0x03b5, 0x03b6, 0x03b6, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7, 0x03b7
0x03bc, 0x03bd, 0x03bf, 0x03bf, 0x03bf, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c3, 0x03c3, 0x03c4, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c4, 0x03c5, 0x03c5, 0x03cf, 0x03cf, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c5, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3, 0x03c3
0x03c9, 0x03ca, 0x03cb, 0x03cb, 0x03cc, 0x03cd, 0x03cd, 0x03ce, 0x03cf, 0x03d0, 0x03d0, 0x03d1, 0x03d2, 0x03d2, 0x03d2, 0x03d2, 0x03d2, 0x03d2
0x03d5, 0x03d6, 0x03d6, 0x03d7, 0x03d8, 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03db, 0x03dc, 0x03dd, 0x03dd, 0x03de, 0x03df, 0x03df
};
// बाइनरी लुकअप उपरोक्त तालिका का उपयोग करके।
बाइट एंटीलोग (इंट x)
{
बाइट y = 0x80;
int av;
for (int i = 0x40; मैं> 0; मैं >> = 1)
{
av = pgm_read_word_near (ANTI_LOG + y);
अगर (av> x)
{
y - = i;
}
और अगर (av <x)
{
y | = i;
}
अन्य
{
वापसी y;
}
}
अगर (pgm_read_word_near (ANTI_LOG + y)> x)
{
y - = 1;
}
वापसी y;
}
व्यर्थ व्यवस्था()
{
पिनमोड (LED, OUTPUT);
digitalWrite (LED, LOW);
}
#define MIN_X 0
# डेफिन MAX_X 1024
शून्य लूप ()
{
int i;
// antilog_drive
(i = MIN_X; मैं <MAX_X; i ++) के लिए
{
एनालॉगवर्इट (एलईडी, एंटीलोग (आई));
देरी (2);
}
(- I; i> = MIN_X; i--)
{
एनालॉगवर्इट (एलईडी, एंटीलोग (आई));
देरी (2);
}
देरी (1000);
// रैखिक ड्राइव
(i = MIN_X; मैं <MAX_X; i ++) के लिए
{
एनालॉगवर्इट (एलईडी, i >> 2);
देरी (2);
}
(- I; i> = MIN_X; i--)
{
एनालॉगवर्इट (एलईडी, i >> 2);
देरी (2);
}
देरी (2000);
}