{"id":4965,"date":"2016-11-01T23:43:23","date_gmt":"2016-11-01T14:43:23","guid":{"rendered":"https:\/\/blog.eldhrimnir.com?p=4965"},"modified":"2016-11-01T23:43:23","modified_gmt":"2016-11-01T14:43:23","slug":"attiny10%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9fesc","status":"publish","type":"post","link":"https:\/\/blog.eldhrimnir.com\/?p=4965","title":{"rendered":"ATtiny10\u3092\u4f7f\u3063\u305fESC"},"content":{"rendered":"<p class=\"r\"><a href=\"http:\/\/www.atmel.com\/devices\/ATTINY10.aspx\">ATtiny10<\/a>\u3092\u4f7f\u3063\u305fESC\u3092\u306a\u3093\u3060\u304b\u3093\u3060\u3067\u4f5c\u3063\u3066\u3057\u307e\u3063\u305f\u306e\u3067\u30e1\u30e2\u3092\u304b\u306d\u3066\u516c\u958b\u3057\u3066\u304a\u3053\u3046\u3068\u601d\u3044\u307e\u3059\u3002\u57fa\u672c\u7684\u306b\u306f\u3001\u30b5\u30fc\u30dc\u4fe1\u53f7(PPM)\u3092\u53d7\u4fe1\u3057\u3066PWM\u306b\u5909\u63db\u3057\u3066\u3044\u307e\u3059\u3002PPM\u306e\u4fe1\u53f7\u306f\u57fa\u672c\u306f1000us\u301c2000us\u307e\u3067\u306e\u9593\u3067\u53ef\u5909\u3059\u308b\u4fe1\u53f7\u3067\u3001\u5927\u304d\u304f\u306a\u308b\u307b\u3069PWM\u51fa\u529b\u3092\u5f37\u304f\u3057\u3066\u3042\u3052\u308b\u611f\u3058\u3067\u3059\u3002<\/p>\n<p class=\"r\"><a href=\"https:\/\/blog.eldhrimnir.com?attachment_id=4972\" rel=\"attachment wp-att-4972\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4972\" src=\"https:\/\/blog.eldhrimnir.comwp-content\/uploads\/2016\/10\/servo_01-300x185.jpg\" alt=\"servo_01\" width=\"300\" height=\"185\" srcset=\"https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/servo_01-300x185.jpg 300w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/servo_01-768x474.jpg 768w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/servo_01.jpg 910w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u306f\u3001\u300c<a href=\"http:\/\/www.atmel.com\/Microsite\/atmel-studio\/\">Atmel\u00ae Studio 7<\/a>\u300d\u3068\u300c<a href=\"https:\/\/www.google.com\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;sqi=2&amp;ved=0ahUKEwjqs8nivYDQAhVKx7wKHfctC0oQFggfMAA&amp;url=http%3A%2F%2Fwww.atmel.com%2Ftools%2Fatatmel-ice.aspx&amp;usg=AFQjCNGumA3dgEf0qdoAS0hyznFAt9MjOg&amp;sig2=RFybMmdkNrrRsfGBv2PeyA&amp;bvm=bv.136811127,d.dGc&amp;cad=rja\">Atmel-ICE<\/a>\u300d\u3092\u4f7f\u3044\u307e\u3057\u305f\u3002\u63a5\u7d9a\u65b9\u6cd5\u306fTPI\u3068\u8a00\u3046\u65b9\u5f0f\u3067\u63a5\u7d9a\u3057\u3066\u66f8\u304d\u8fbc\u307f\u3092\u884c\u3044\u307e\u3059\u3001\u8272\u3005\u30b5\u30a4\u30c8\u304c\u3042\u308b\u306e\u3067\u305d\u3053\u3044\u3089\u8fba\u3092\u53c2\u7167\u3057\u3066\u4e0b\u3055\u3044\u3002<\/p>\n<p><a href=\"https:\/\/blog.eldhrimnir.com?attachment_id=4967\" rel=\"attachment wp-att-4967\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4967\" src=\"https:\/\/blog.eldhrimnir.comwp-content\/uploads\/2016\/10\/IMG_1857-300x225.jpg\" alt=\"img_1857\" width=\"300\" height=\"225\" srcset=\"https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/IMG_1857-300x225.jpg 300w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/IMG_1857-768x576.jpg 768w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/IMG_1857-1024x768.jpg 1024w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/IMG_1857.jpg 1280w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>PB2\u304b\u3089\u30b5\u30fc\u30dc\u4fe1\u53f7\u3092\u5165\u529b\u3057\u3066PB0\u3088\u308aPWM\u51fa\u529b\u3092\u3057\u307e\u3059\u3002\u51fa\u529b\u306fPB1\u306b\u5909\u66f4\u3059\u308b\u3053\u3068\u3082\u51fa\u6765\u307e\u3059\u306e\u3067\u8f09\u305b\u308b\u30c7\u30d0\u30a4\u30b9\u3068\u3044\u3046\u304b\u57fa\u677f\u306e\u56de\u8def\u914d\u7f6e\u306b\u3088\u3063\u3066\u306f\u5165\u308c\u66ff\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<p class=\"r\">\u25a0\u56de\u8def\u56f3<\/p>\n<p class=\"r\"><a href=\"https:\/\/blog.eldhrimnir.com?attachment_id=4966\" rel=\"attachment wp-att-4966\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4966\" src=\"https:\/\/blog.eldhrimnir.comwp-content\/uploads\/2016\/10\/PPM_PWM-300x213.png\" alt=\"ppm_pwm\" width=\"300\" height=\"213\" srcset=\"https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/PPM_PWM-300x213.png 300w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/PPM_PWM-768x545.png 768w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/PPM_PWM-1024x727.png 1024w, https:\/\/blog.eldhrimnir.com\/wp-content\/uploads\/2016\/10\/PPM_PWM.png 1245w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p class=\"r\"><!--more--><\/p>\n<pre class=\"lang:c decode:true\">#include &lt;avr\/io.h&gt;\n#include &lt;util\/delay.h&gt;\n\n#define F_CPU 8000000UL  \/\/ internal clock @ 8MHz\n#define PWM_MODE_BIT 10\n#define PPM_MIN 1008\/\/1520-512=&gt;1008\n#define PPM_CENTER 1520\/\/CE\/CCW\n#define PPM_MAX 2032\/\/1520+512=&gt;2032\n\n#define PPM_LEN 1\n#define PWM_MAX 1024\n#define PWM_CUT_OFF 975\n\n\/\/#define PPM_LEN ((PPM_MAX - PPM_MIN) \/ 2^PWM_MODE_BIT)\n\/\/#define PWM_CUT_OFF PPM_MIN \/ ((PPM_MAX - PPM_MIN) \/ 2^PWM_MODE_BIT)\n\/\/#define PWM_MAX PPM_MAX \/ ((PPM_MAX - PPM_MIN) \/ 2^PWM_MODE_BIT)\n\nvoid PWM_setup(void)\n{\n    TCCR0A  |= ((1 &lt;&lt; COM0A1) | (0 &lt;&lt; COM0A0)   \/\/ COM0A1 - COM0A0 (Clear OC0A on Compare Match when up-counting. Set OC0A on Compare Match when down-counting.)\n    \/\/| (1&lt;&lt;COM0B1) | (0&lt;&lt;COM0B0)                   \/\/ COM0B1 - COM0B0 (Clear OC0B on Compare Match when up-counting. Set OC0B on Compare Match when down-counting.)\n    | (1 &lt;&lt; WGM01) | (1 &lt;&lt; WGM00));             \/\/ WGM01 - WGM00 (set Phase Correct PWM Mode-10Bit_1023step)\n    \/\/TCCR0A = (1&lt;&lt;COM0A1) | (0&lt;&lt;COM0A0) | (0&lt;&lt;COM0B1) | (0&lt;&lt;COM0B0) | (0&lt;&lt;WGM01) | (1&lt;&lt;WGM00);\n\n    TCCR0B  |= (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00); \/\/clk\/8 prescaler\n    \/\/TCCR0B = (0&lt;&lt;ICNC0) | (0&lt;&lt;ICES0) | (0&lt;&lt;WGM03) | (0&lt;&lt;WGM02) | (0&lt;&lt;CS02) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00);\n    \n    OCR0A = 0x0000;\n    \/\/OCR0B = 0x0000;\n}\n\nvoid PWM_write(int val)\n{\n    OCR0A = val; \/\/This value sets the duty cycle 0 to 255 (8-bit timer)\n}\n\nint main(void)\n{\n    \/\/ Function: Bit3=In Bit2=Out Bit1=In Bit0=Out\n    DDRB |= (0&lt;&lt;DDB3) | (0&lt;&lt;DDB2) | (0&lt;&lt;DDB1) | (1&lt;&lt;DDB0);\/\/PortB0 = output(PWM-OCR0A)\n    \/\/DDRB |= (0&lt;&lt;DDB3) | (0&lt;&lt;DDB2) | (1&lt;&lt;DDB1) | (1&lt;&lt;DDB0);\/\/PortB0\/B1 = output(PWM-OCR0A\/OCR0B)\n    PUEB |= (0&lt;&lt;PUEB) | (1&lt;&lt;PUEB) | (0&lt;&lt;PUEB) | (0&lt;&lt;PUEB);\/\/PortB2 = input(Servo_In)\n    \n    \/\/ Main Clock source: Internal Clock(8Mhz)\n    CCP=0xd8;\n    CLKMSR=(0&lt;&lt;CLKMS1) | (0&lt;&lt;CLKMS0);\n    \n    \/\/ Clock Prescaler division factor: 1\n    CCP=0xd8;\n    CLKPSR=(0&lt;&lt;CLKPS3) | (0&lt;&lt;CLKPS2) | (0&lt;&lt;CLKPS1) | (0&lt;&lt;CLKPS0);\n    \n    PWM_setup();\n    \n    uint16_t Pulslen = 0;\n    uint16_t TimeOut = 0;\n    \/\/const int PWM_CUT_OFF = PPM_MIN\/PPM_LEN;\n    \/\/const uint8_t PPM_LEN = ((PPM_MAX - PPM_MIN) \/ pow(2,PWM_MODE_BIT))-.5;\n    \n    while(1)\n    {\n        while((PINB&amp;_BV(PB2)))  \/\/ while the servoPWM input is high\n        {\n            Pulslen++; \/\/ increment\n            _delay_us(PPM_LEN); \/\/resolution setting, may require further adjustment\n        }\n        if(Pulslen &gt; PWM_CUT_OFF) \/\/throttle must be low initially\n        {\n            \n            while(1)\n            {\n                \n                while((PINB&amp;_BV(PB2)))  \/\/ while the servoPWM input is high\n                {\n                    Pulslen++; \/\/ increment\n                    _delay_us(PPM_LEN); \/\/resolution setting, may require further adjustment\n                }\n                \n                if (TimeOut &gt; 20000) \/\/this will shut off the motor if the RX signal is lost\n                {\n                    Pulslen = PWM_CUT_OFF;\n                }\n                \n                if (Pulslen &gt; PWM_CUT_OFF-1)  \/\/ ignore false triggers and only set the PWM when a pulse is received\n                {\n                    Pulslen = (Pulslen - PWM_CUT_OFF);\n                    \n                    \/\/if(Pulslen&lt;0){Pulslen=0;} \/\/just in case there is a negative\n                    \n                    if (Pulslen &lt; 8) \/\/lower threshold, produces a dead-band\n                    {Pulslen = 0;}\n                    \n                    if (Pulslen &gt;= PWM_MAX-8) \/\/Full power after crossing a threshold determined by trial and error\n                    {Pulslen = PWM_MAX-1;}\n                    \n                    PWM_write(Pulslen);\n\n                    TimeOut = 0;  \/\/resets the timeout counter\n                }\n                \n                if (Pulslen == 0) \/\/counts every time the loop completes and a pulse is not registered\n                {TimeOut++;}\n                \n                Pulslen = 0; \/\/ resets the variable for the next pulse measurement and starts the timeout counter\n            }\n        }\n        else\n        {Pulslen = 0;}\n    }\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ATtiny10\u3092\u4f7f\u3063\u305fESC\u3092\u306a\u3093\u3060\u304b\u3093\u3060\u3067\u4f5c\u3063\u3066\u3057\u307e\u3063\u305f\u306e\u3067\u30e1\u30e2\u3092\u304b\u306d\u3066\u516c\u958b\u3057\u3066\u304a\u3053\u3046\u3068\u601d\u3044\u307e\u3059\u3002\u57fa\u672c\u7684\u306b\u306f\u3001\u30b5\u30fc\u30dc\u4fe1\u53f7(PPM)\u3092\u53d7\u4fe1\u3057\u3066PWM\u306b\u5909\u63db\u3057\u3066\u3044\u307e\u3059\u3002PPM\u306e\u4fe1\u53f7\u306f\u57fa\u672c\u306f1000us\u301c2000us\u307e\u3067\u306e [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=\/wp\/v2\/posts\/4965"}],"collection":[{"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4965"}],"version-history":[{"count":0,"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=\/wp\/v2\/posts\/4965\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4965"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4965"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.eldhrimnir.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4965"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}