{"id":1010,"date":"2017-06-30T11:38:13","date_gmt":"2017-06-30T03:38:13","guid":{"rendered":"http:\/\/www.luwl.net\/?p=1010"},"modified":"2017-06-30T11:38:13","modified_gmt":"2017-06-30T03:38:13","slug":"arduino-pid%e9%a3%8e%e6%89%87%e8%b0%83%e9%80%9f","status":"publish","type":"post","link":"http:\/\/www.luwl.net\/?p=1010","title":{"rendered":"arduino pid\u98ce\u6247\u8c03\u901f"},"content":{"rendered":"<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\n#define spd 2 \/\/\u5916\u90e8\u4e2d\u65ad0,\u901f\u5ea6\u4fe1\u53f7\uff0c\u5f15\u811a2\r\nint count = 0; \/\/\u8109\u51b2\u8ba1\u6570\u503c\r\nint rpm = 0;\n\nint error,integral,out;\r\nunsigned long timenew = 0, old_time = 0; \/\/ \u65f6\u95f4\u6807\u8bb0\r\nunsigned long time = 0; \/\/ \u65f6\u95f4\u6807\u8bb0\r\nvoid setup() {\r\nSerial.begin(9600); \/\/ \u542f\u52a8\u4e32\u53e3\u901a\u4fe1\uff0c\u6ce2\u7279\u7387\u4e3a9600b\/s\r\npinMode(spd,INPUT);\/\/cesuxinhao\r\npinMode( 9 , OUTPUT);\r\nsetPwmFrequency(9, 1);\r\nattachInterrupt(0, Code1, FALLING);\/\/\u8109\u51b2\u4e2d\u65ad\u51fd\u6570\r\n}\r\n\r\nvoid loop() {\r\ntimenew = millis();\/\/\u4ee5\u6beb\u79d2\u4e3a\u5355\u4f4d\uff0c\u8ba1\u7b97\u5f53\u524d\u65f6\u95f4\r\n\/\/\u8ba1\u7b97\u51fa\u6bcf\u4e00\u79d2\u949f\u7f16\u7801\u5668\u7801\u76d8\u8ba1\u5f97\u7684\u8109\u51b2\u6570\r\nif(abs(timenew - old_time) &gt;= 1000) \/\/ \u5982\u679c\u8ba1\u65f6\u65f6\u95f4\u5df2\u8fbe1\u79d2\r\n{\r\ndetachInterrupt(0); \/\/ \u5173\u95ed\u5916\u90e8\u4e2d\u65ad0\r\n\/\/\u628a\u6bcf\u4e00\u79d2\u949f\u7f16\u7801\u5668\u7801\u76d8\u8ba1\u5f97\u7684\u8109\u51b2\u6570\uff0c\u6362\u7b97\u4e3a\u5f53\u524d\u8f6c\u901f\u503c\r\n\/\/\u8f6c\u901f\u5355\u4f4d\u662f\u6bcf\u5206\u949f\u591a\u5c11\u8f6c\uff0c\u5373r\/min\u3002\r\nrpm =(float)count;\r\n\/\/\u8bbe\u5b9a\u503c\u4e3a50\r\nerror = 50-rpm;\/\/\u8bef\u5dee\r\nintegral += error;\/\/\u79ef\u5206\r\n\/\/P=0.5 I=0.05 PI\u7b97\u6cd5\r\nout = out + 0.5 * error + 0.05 * integral;\/\/\u8f93\u51fa\u503c\r\nif (out&gt;255)out=255;\r\nif (out&lt;0)out=0;\r\nSerial.print(out);\r\nSerial.print(&quot;,&quot;);\r\nanalogWrite(9 , out);\r\nSerial.println(rpm);\r\n\/\/\u6062\u590d\u6d4b\u901f\u7684\u521d\u59cb\u72b6\u6001\r\ncount = 0; \/\/\u628a\u8109\u51b2\u8ba1\u6570\u503c\u6e05\u96f6\uff0c\u4ee5\u4fbf\u8ba1\u7b97\u4e0b\u4e00\u79d2\u7684\u8109\u51b2\u8ba1\u6570\r\nold_time= millis(); \/\/ \u8bb0\u5f55\u6bcf\u79d2\u6d4b\u901f\u65f6\u7684\u65f6\u95f4\u8282\u70b9\r\nattachInterrupt(0, Code1,FALLING); \/\/ \u91cd\u65b0\u5f00\u653e\u5916\u90e8\u4e2d\u65ad0\r\n}\r\n}\r\n\/\/ \u5de6\u4fa7\u8f66\u8f6e\u7535\u673a\u7684\u7f16\u7801\u5668\u7801\u76d8\u8ba1\u6570\u4e2d\u65ad\u5b50\u7a0b\u5e8f\r\nvoid Code1()\r\n{\r\n\/\/\u4e3a\u4e86\u4e0d\u8ba1\u5165\u566a\u97f3\u5e72\u6270\u8109\u51b2\uff0c\r\n\/\/\u5f532\u6b21\u4e2d\u65ad\u4e4b\u95f4\u7684\u65f6\u95f4\u5927\u4e8e5ms\u65f6\uff0c\u8ba1\u4e00\u6b21\u6709\u6548\u8ba1\u6570\r\nif((millis()-time)&gt;5)\r\n\/\/\u5f53\u7f16\u7801\u5668\u7801\u76d8\u7684OUTA\u8109\u51b2\u4fe1\u53f7\u4e0b\u8df3\u6cbf\u6bcf\u4e2d\u65ad\u4e00\u6b21\uff0c\r\ncount += 1; \/\/ \u7f16\u7801\u5668\u7801\u76d8\u8ba1\u6570\u52a0\u4e00\r\ntime==millis();\r\n}\r\n\r\n\/\/ Note that the base frequency for pins 3, 9, 10, and 11 is 31250 Hz\r\n\/\/ Note that the base frequency for pins 5 and 6 is 62500 Hz\r\n\/\/ Set pin 9's PWM frequency to 3906 Hz (31250\/8 = 3906)\r\n\/\/ Set pin 6's PWM frequency to 62500 Hz (62500\/1 = 62500)\r\nvoid setPwmFrequency(int pin, int divisor) {\r\nbyte mode;\r\nif(pin == 5 || pin == 6 || pin == 9 || pin == 10) {\r\nswitch(divisor) {\r\ncase 1: mode = 0x01; break;\r\ncase 8: mode = 0x02; break;\r\ncase 64: mode = 0x03; break;\r\ncase 256: mode = 0x04; break;\r\ncase 1024: mode = 0x05; break;\r\ndefault: return;\r\n}\r\nif(pin == 5 || pin == 6) {\r\nTCCR0B = TCCR0B &amp; 0b11111000 | mode;\r\n} else {\r\nTCCR1B = TCCR1B &amp; 0b11111000 | mode;\r\n}\r\n} else if(pin == 3 || pin == 11) {\r\nswitch(divisor) {\r\ncase 1: mode = 0x01; break;\r\ncase 8: mode = 0x02; break;\r\ncase 32: mode = 0x03; break;\r\ncase 64: mode = 0x04; break;\r\ncase 128: mode = 0x05; break;\r\ncase 256: mode = 0x06; break;\r\ncase 1024: mode = 0x7; break;\r\ndefault: return;\r\n}\r\nTCCR2B = TCCR2B &amp; 0b11111000 | mode;\r\n}\r\n}\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#define spd 2 \/\/\u5916\u90e8\u4e2d\u65ad0,\u901f\u5ea6\u4fe1\u53f7\uff0c\u5f15\u811a2 int count &hellip; <a href=\"http:\/\/www.luwl.net\/?p=1010\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1010","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1010"}],"version-history":[{"count":1,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1010\/revisions"}],"predecessor-version":[{"id":1011,"href":"http:\/\/www.luwl.net\/index.php?rest_route=\/wp\/v2\/posts\/1010\/revisions\/1011"}],"wp:attachment":[{"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1010"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.luwl.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}