{"id":3614,"date":"2025-06-07T13:40:46","date_gmt":"2025-06-07T05:40:46","guid":{"rendered":"https:\/\/saludpcb.com\/zh\/?p=3614"},"modified":"2025-09-26T06:15:39","modified_gmt":"2025-09-25T22:15:39","slug":"pid-control-with-esp32","status":"publish","type":"post","link":"https:\/\/saludpcb.com\/zh\/pid-control-with-esp32\/","title":{"rendered":"\u7528 ESP32 \u5be6\u4f5c PID Control | \u6253\u9020\u4f60\u7684\u667a\u6167\u63a7\u5236\u7cfb\u7d71"},"content":{"rendered":"\n<hr class=\"wp-block-separator alignwide has-text-color has-palette-color-1-color has-alpha-channel-opacity has-palette-color-1-background-color has-background is-style-wide\"\/>\n\n\n\n<p><strong>PID Control \u63a7\u5236<\/strong>\u662f\u73fe\u4ee3\u63a7\u5236\u7cfb\u7d71\u4e2d\u6700\u5e38\u898b\u4e5f\u6700\u5be6\u7528\u7684\u65b9\u6cd5\u4e4b\u4e00\uff0c\u5f9e\u5de5\u696d\u81ea\u52d5\u5316\u5230 DIY \u6a5f\u5668\u4eba\uff0c\u90fd\u80fd\u898b\u5230\u5b83\u7684\u8eab\u5f71\u3002PID \u662f&nbsp;<strong>\u6bd4\u4f8b\uff08Proportional\uff09\u3001\u7a4d\u5206\uff08Integral\uff09\u3001\u5fae\u5206\uff08Derivative\uff09<\/strong>&nbsp;\u7684\u7e2e\u5beb\uff0c\u9019\u7a2e\u63a7\u5236\u65b9\u5f0f\u80fd\u8b93\u7cfb\u7d71\u5373\u6642\u53cd\u61c9\u74b0\u5883\u8b8a\u5316\uff0c\u50cf\u662f\u8abf\u7bc0\u99ac\u9054\u8f49\u901f\u3001\u7a69\u5b9a\u6eab\u5ea6\u3001\u751a\u81f3\u8b93\u6a5f\u5668\u4eba\u5728\u5169\u8f2a\u4e0a\u5e73\u8861\u3002<\/p>\n\n\n\n<p>\u900f\u904e&nbsp;<strong>ESP-IDF \u958b\u767c\u6846\u67b6<\/strong>\uff0c\u958b\u767c\u8005\u73fe\u5728\u53ef\u4ee5\u76f4\u63a5\u5728 ESP32 \u4e0a\u5efa\u69cb\u5177\u6709\u7cbe\u6e96\u56de\u61c9\u8207\u7a69\u5b9a\u6027\u7684\u667a\u6167\u63a7\u5236\u7cfb\u7d71\u3002\u5728\u9019\u7bc7\u6587\u7ae0\u4e2d\uff0c\u5c07\u4e00\u6b65\u6b65\u5e36\u4f60\u4e86\u89e3\u5982\u4f55\u5728 ESP32 \u4e0a&nbsp;<strong>\u8a2d\u8a08\u3001\u5be6\u4f5c\u4e26\u8abf\u6574\u4e00\u500b PID \u63a7\u5236\u5668<\/strong>\uff0c\u4f7f\u7528 C \u8a9e\u8a00\u8207 FreeRTOS\uff0c\u6253\u9020\u51fa\u5c6c\u65bc\u4f60\u7684\u667a\u6167\u61c9\u7528\u3002\u4e0d\u8ad6\u4f60\u60f3\u63a7\u5236\u98a8\u6247\u3001\u99ac\u9054\u9084\u662f\u6eab\u5ea6\u7cfb\u7d71\uff0c\u900f\u904e PID \u63a7\u5236\uff0c\u4f60\u5c07\u64c1\u6709\u7a69\u5b9a\u4e14\u9748\u6d3b\u7684\u6838\u5fc3\u6280\u8853\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2025\/06\/Mastering-PID-Control-with-ESP32-Build-Your-Own-Powerful-Smart-Control-System.jpg\" alt=\"PID Control\" class=\"wp-image-3619\" title=\"\" srcset=\"https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2025\/06\/Mastering-PID-Control-with-ESP32-Build-Your-Own-Powerful-Smart-Control-System.jpg 1024w, https:\/\/saludpcb.com\/zh\/wp-content\/uploads\/2025\/06\/Mastering-PID-Control-with-ESP32-Build-Your-Own-Powerful-Smart-Control-System-768x768.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>\u5167\u5bb9<\/h2><nav><ul><li class=\"\"><a href=\"#\u4ec0\u9ebc\u662f-lvgl-render\uff1f\">\u4ec0\u9ebc\u662f PID Control \u63a7\u5236\u5668\uff1f<\/a><\/li><li class=\"\"><a href=\"#esp-32-\u7684-spi-dma-\u539f\u7406\u7c21\u4ecb\">ESP32 \u4e2d\u7684\u89d2\u8272\u8207\u5be6\u4f5c\u65b9\u5f0f<\/a><\/li><li class=\"\"><a href=\"#\u74b0\">\u958b\u767c\u74b0\u5883<\/a><\/li><li class=\"\"><a href=\"#\u5c08\u6848\u7d50\u69cb\">\u5c08\u6848\u7d50\u69cb<\/a><\/li><li class=\"\"><a href=\"#e\">PID Control \u4efb\u52d9\u8207\u63a7\u5236\u7a0b\u5f0f\u78bc<\/a><\/li><li class=\"\"><a href=\"#\u5b8c\u6574-code\">\u5b8c\u6574 Code<\/a><\/li><li class=\"\"><a href=\"#\u9019\u6bb5\u7a0b\u5f0f\u78bc\u5c55\u793a\u4e86\u5982\u4f55\u5728-esp-32-\u4e0a\u4f7f\u7528-spi-dma-\u50b3\u8f38\u4f86\u63d0\u5347-tft-lcd\uff08\u4f7f\u7528-st-7789-\u63a7\u5236\u5668\uff09\u986f\u793a\u6548\u7387\uff0c\u4e26\u642d\u914d-lvgl-\u7684-render-\u6982\u5ff5\u5960\u5b9a\u5e95\u5c64\u9ad8\u901f\u5237\u65b0\u80fd\u529b\">\u8aaa\u660e<\/a><\/li><li class=\"\"><a href=\"#\u7de8\u8b6f\u548c\u71d2\u9304-1\">\u7de8\u8b6f\u548c\u71d2\u9304<\/a><\/li><li class=\"\"><a href=\"#\u7d50\u8ad6\">\u7d50\u8ad6<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u4ec0\u9ebc\u662f-lvgl-render\uff1f\">\u4ec0\u9ebc\u662f PID Control \u63a7\u5236\u5668\uff1f<\/h2>\n\n\n\n<p>PID \u63a7\u5236\u5668\u662f\u4e00\u7a2e\u4ee5\u300c\u8aa4\u5dee\u300d\u70ba\u6838\u5fc3\u7684\u56de\u6388\u63a7\u5236\u7cfb\u7d71\u3002\u7c21\u55ae\u4f86\u8aaa\uff0c\u5b83\u6839\u64da\u76ee\u6a19\u503c\uff08Setpoint\uff09\u8207\u5be6\u969b\u8f38\u51fa\u503c\uff08Measurement\uff09\u4e4b\u9593\u7684\u8aa4\u5dee\uff08Error\uff09\uff0c\u52d5\u614b\u8abf\u6574\u8f38\u51fa\uff0c\u4f7f\u7cfb\u7d71\u7a69\u5b9a\u5728\u671f\u671b\u72c0\u614b\u3002<\/p>\n\n\n\n<p>PID \u63a7\u5236\u7684\u57fa\u672c\u516c\u5f0f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">u(t) = Kp * e(t) + Ki * \u222be(t)dt + Kd * de(t)\/dt<\/code><\/pre>\n\n\n\n<p>\u5176\u4e2d\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5176\u4e2d\u5404\u9805\u4ee3\u8868\u7684\u610f\u7fa9\u5982\u4e0b\uff1a<\/li>\n\n\n\n<li><strong>u(t)<\/strong>\uff1a\u63a7\u5236\u5668\u7684\u8f38\u51fa\uff08\u4f8b\u5982 PWM\u3001DAC \u7b49\u63a7\u5236\u8a0a\u865f\uff09<\/li>\n\n\n\n<li><strong>e(t)<\/strong>\uff1a\u76ee\u6a19\u503c\u8207\u5be6\u969b\u503c\u4e4b\u9593\u7684\u8aa4\u5dee\uff08Setpoint &#8211; Measurement\uff09<\/li>\n\n\n\n<li><strong>Kp<\/strong>\uff1a\u6bd4\u4f8b\u4fc2\u6578\uff08Proportional Gain\uff09\uff0c\u5c0d\u7576\u524d\u8aa4\u5dee\u7acb\u5373\u53cd\u61c9<\/li>\n\n\n\n<li><strong>Ki<\/strong>\uff1a\u7a4d\u5206\u4fc2\u6578\uff08Integral Gain\uff09\uff0c\u7d2f\u7a4d\u904e\u53bb\u8aa4\u5dee\uff0c\u7528\u65bc\u6d88\u9664\u7a69\u614b\u8aa4\u5dee<\/li>\n\n\n\n<li><strong>Kd<\/strong>\uff1a\u5fae\u5206\u4fc2\u6578\uff08Derivative Gain\uff09\uff0c\u9810\u6e2c\u8aa4\u5dee\u8b8a\u5316\uff0c\u7528\u4f86\u6291\u5236\u9707\u76ea\u8207\u904e\u885d<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"esp-32-\u7684-spi-dma-\u539f\u7406\u7c21\u4ecb\">ESP32 \u4e2d\u7684\u89d2\u8272\u8207\u5be6\u4f5c\u65b9\u5f0f<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5efa\u7acb PID \u4efb\u52d9\uff08\u4f7f\u7528 FreeRTOS Task\uff09<\/li>\n\n\n\n<li>\u8b80\u53d6\u5be6\u969b\u8f38\u5165\u503c\uff08\u5982\uff1a\u6eab\u5ea6\u3001\u901f\u5ea6\uff09<\/li>\n\n\n\n<li>\u8f38\u51fa\u63a7\u5236\u8a0a\u865f\uff08PWM \u63a7\u5236\u99ac\u9054\u3001\u98a8\u6247\u6216\u52a0\u71b1\u5668\uff09<\/li>\n\n\n\n<li>\u63a7\u5236\u56de\u5708\u9031\u671f\uff08\u53ef\u7528 Timer \u6216 vTaskDelayUntil() \u7cbe\u6e96\u63a7\u5236\uff09<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u74b0\">\u958b\u767c\u74b0\u5883<\/h2>\n\n\n\n<p>\u5728\u958b\u59cb\u7de8\u7a0b\u4e4b\u524d\uff0c\u8acb\u78ba\u4fdd\u5df2\u5b8c\u6210\u4ee5\u4e0b\u6e96\u5099\u5de5\u4f5c\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/saludpcb.com\/zh\/esp32-tutorial-how-to-create-an-esp32-project-with-vscode\/\">\u5b89\u88dd ESP-IDF \u958b\u767c\u74b0\u5883<\/a> (\u81f3\u5c11\u7248\u672c v5.x \u6216\u66f4\u9ad8)\u3002<\/li>\n\n\n\n<li><a href=\"https:\/\/saludpcb.com\/zh\/esp32-devkit-module-pinout\/\">ESP32 \u958b\u767c\u677f<\/a>\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u5c08\u6848\u7d50\u69cb\"><strong>\u5c08\u6848\u7d50\u69cb<\/strong><\/h2>\n\n\n\n<p>\u5efa\u7acb\u4e00\u500b\u4e7e\u6de8\u7684 ESP-IDF PID Control \u5c08\u6848\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">esp32_pid_control\/\n\u251c\u2500\u2500 main\/\n\u2502   \u251c\u2500\u2500 main.c                   # Application entry (PWM\/ADC init, PID task launcher)\n\u2502   \u251c\u2500\u2500 pid_controller.c         # PID core algorithm implementation\n\u2502   \u251c\u2500\u2500 pid_controller.h         # PID API header (structs\/macros)\n\u2502   \u2514\u2500\u2500 CMakeLists.txt           # Main component build rules\n\u2502\n\u251c\u2500\u2500 components\/                  # (Optional) Shared modules\n\u2502   \u2514\u2500\u2500 sensor_drivers\/          # Sensor abstraction layer\n\u2502       \u251c\u2500\u2500 temperature.c        # Temp sensor interface \n\u2502       \u251c\u2500\u2500 temperature.h        # Sensor calibration macros\n\u2502       \u2514\u2500\u2500 CMakeLists.txt       # Component-specific linking\n\u2502\n\u251c\u2500\u2500 sdkconfig                    # ESP-IDF config (auto-generated)\n\u2514\u2500\u2500 CMakeLists.txt               # Top-level project config<\/code><\/pre>\n\n\n\n<p>\u70ba\u4e86\u8b93\u8b80\u8005\u66f4\u5bb9\u6613\u4e0a\u624b\uff0c\u672c\u7bc7\u7bc4\u4f8b\u7a0b\u5f0f\u78bc\u63a1\u7528\u55ae\u4e00\u6a94\u6848\uff08main.c\uff09\u65b9\u5f0f\u64b0\u5beb\uff0c\u5c07 PID \u6f14\u7b97\u6cd5\u3001ADC \u8b80\u53d6\u8207 PWM \u63a7\u5236\u6574\u5408\u5728\u540c\u4e00\u6a94\u6848\u4e2d\u3002\u9019\u6a23\u7684\u5beb\u6cd5\u66f4\u76f4\u89c0\uff0c\u4e5f\u5229\u65bc\u5feb\u901f\u4e0a\u624b\u8207\u5c55\u793a\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"e\">PID Control \u4efb\u52d9\u8207\u63a7\u5236\u7a0b\u5f0f\u78bc<\/h2>\n\n\n\n<p><code><strong>pid_controller.h<\/strong><\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">typedef struct {\n    float Kp;\n    float Ki;\n    float Kd;\n\n    float setpoint;\n    float integral;\n    float prev_error;\n\n    float output_min;\n    float output_max;\n} PIDController;\n\nvoid pid_init(PIDController* pid, float Kp, float Ki, float Kd, float min_out, float max_out);\nfloat pid_compute(PIDController* pid, float input, float dt);<\/code><\/pre>\n\n\n\n<p><strong>pid_controller.c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include \"pid_controller.h\"\n\nvoid pid_init(PIDController* pid, float Kp, float Ki, float Kd, float min_out, float max_out) {\n    pid-&gt;Kp = Kp;\n    pid-&gt;Ki = Ki;\n    pid-&gt;Kd = Kd;\n    pid-&gt;integral = 0;\n    pid-&gt;prev_error = 0;\n    pid-&gt;output_min = min_out;\n    pid-&gt;output_max = max_out;\n}\n\nfloat pid_compute(PIDController* pid, float input, float dt) {\n    float error = pid-&gt;setpoint - input;\n    pid-&gt;integral += error * dt;\n    float derivative = (error - pid-&gt;prev_error) \/ dt;\n\n    float output = pid-&gt;Kp * error + pid-&gt;Ki * pid-&gt;integral + pid-&gt;Kd * derivative;\n\n    if (output &gt; pid-&gt;output_max) output = pid-&gt;output_max;\n    if (output &lt; pid-&gt;output_min) output = pid-&gt;output_min;\n\n    pid-&gt;prev_error = error;\n    return output;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u5b8c\u6574-code\">\u5b8c\u6574 Code <\/h2>\n\n\n\n<p><strong>main.c<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include \"pid_controller.h\"\n#include \"driver\/ledc.h\"         \/\/ ESP32 LED PWM controller\n#include \"driver\/adc.h\"          \/\/ ESP32 ADC driver\n#include \"freertos\/FreeRTOS.h\"   \/\/ FreeRTOS core\n#include \"freertos\/task.h\"       \/\/ FreeRTOS task control\n\n\/* PWM Configuration *\/\n#define FAN_PWM_CHANNEL LEDC_CHANNEL_0  \/\/ Use PWM channel 0\n#define FAN_PWM_FREQ    25000           \/\/ 25kHz PWM frequency (inaudible for fans)\n#define FAN_PWM_RES     LEDC_TIMER_10_BIT \/\/ 10-bit resolution (0-1023)\n#define FAN_GPIO        18               \/\/ GPIO pin for fan control\n\nPIDController fan_pid;  \/\/ PID controller instance\n\nfloat read_temperature() {\n    int raw = adc1_get_raw(ADC1_CHANNEL_0);  \/\/ 12-bit ADC read\n    \/\/ Simplified conversion - replace with actual sensor calibration\n    return (float)raw * 0.1f;  \/\/ 0.1\u00b0C per LSB\n}\n\nvoid set_fan_speed(float speed_percent) {\n    \/\/ Convert percentage to duty cycle value\n    int duty = (int)((speed_percent \/ 100.0f) * ((1 &lt;&lt; FAN_PWM_RES) - 1));\n    ledc_set_duty(LEDC_HIGH_SPEED_MODE, FAN_PWM_CHANNEL, duty);\n    ledc_update_duty(LEDC_HIGH_SPEED_MODE, FAN_PWM_CHANNEL);  \/\/ Apply new duty\n}\n\nvoid pid_task(void* arg) {\n    const TickType_t xInterval = pdMS_TO_TICKS(100); \/\/ 100ms control loop\n    TickType_t xLastWakeTime = xTaskGetTickCount();\n\n    \/\/ Initialize PID with Kp=2.0, Ki=0.5, Kd=1.0\n    \/\/ Output limits: 0-100% (fan speed range)\n    pid_init(&amp;fan_pid, 2.0, 0.5, 1.0, 0.0, 100.0);\n    fan_pid.setpoint = 30.0f;  \/\/ Target temperature: 30\u00b0C\n\n    while (1) {\n        vTaskDelayUntil(&amp;xLastWakeTime, xInterval);  \/\/ Precise timing\n\n        float temp = read_temperature();\n        \/\/ Compute PID output with 0.1s time delta (matches 100ms loop)\n        float output = pid_compute(&amp;fan_pid, temp, 0.1f);  \n\n        set_fan_speed(output);  \/\/ Apply control signal\n    }\n}\n\nvoid app_main(void) {\n    \/* ADC Configuration *\/\n    adc1_config_width(ADC_WIDTH_BIT_12);  \/\/ 12-bit resolution\n    adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);  \/\/ 0-3.1V range\n\n    \/* PWM Timer Setup *\/\n    ledc_timer_config_t ledc_timer = {\n        .speed_mode = LEDC_HIGH_SPEED_MODE,\n        .timer_num = LEDC_TIMER_0,\n        .duty_resolution = FAN_PWM_RES,  \/\/ 10-bit resolution\n        .freq_hz = FAN_PWM_FREQ,         \/\/ 25kHz\n        .clk_cfg = LEDC_AUTO_CLK         \/\/ Automatic clock source\n    };\n    ledc_timer_config(&amp;ledc_timer);\n\n    \/* PWM Channel Setup *\/\n    ledc_channel_config_t ledc_channel = {\n        .channel = FAN_PWM_CHANNEL,\n        .duty = 0,  \/\/ Initial duty cycle (fan off)\n        .gpio_num = FAN_GPIO,\n        .speed_mode = LEDC_HIGH_SPEED_MODE,\n        .hpoint = 0,  \/\/ Phase offset (not used)\n        .timer_sel = LEDC_TIMER_0\n    };\n    ledc_channel_config(&amp;ledc_channel);\n\n    \/* Create PID Control Task *\/\n    xTaskCreate(pid_task,       \/\/ Task function\n                \"pid_task\",     \/\/ Task name\n                4096,          \/\/ Stack size (bytes)\n                NULL,           \/\/ Parameters\n                5,             \/\/ Priority (higher = more urgent)\n                NULL);         \/\/ Task handle (not used)\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u9019\u6bb5\u7a0b\u5f0f\u78bc\u5c55\u793a\u4e86\u5982\u4f55\u5728-esp-32-\u4e0a\u4f7f\u7528-spi-dma-\u50b3\u8f38\u4f86\u63d0\u5347-tft-lcd\uff08\u4f7f\u7528-st-7789-\u63a7\u5236\u5668\uff09\u986f\u793a\u6548\u7387\uff0c\u4e26\u642d\u914d-lvgl-\u7684-render-\u6982\u5ff5\u5960\u5b9a\u5e95\u5c64\u9ad8\u901f\u5237\u65b0\u80fd\u529b\">\u8aaa\u660e<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pid_compute()<\/code> \u662f\u6838\u5fc3\u6f14\u7b97\u6cd5\uff0c\u6bcf\u6b21\u8a08\u7b97\u65b0\u7684\u63a7\u5236\u91cf\u3002<\/li>\n\n\n\n<li>\u4f7f\u7528 <code>adc1_get_raw()<\/code> \u7c21\u5316\u6a21\u64ec\u6eab\u5ea6\u8b80\u503c\uff08\u4f60\u53ef\u4ee5\u66ff\u63db\u6210 NTC \u6216 DS18B20 \u7684\u89e3\u6790\u65b9\u5f0f\uff09\u3002<\/li>\n\n\n\n<li><code>set_fan_speed()<\/code> \u5c07 PID \u8f38\u51fa\uff080~100\uff09\u5c0d\u61c9\u70ba PWM duty\u3002<\/li>\n\n\n\n<li><code>vTaskDelayUntil()<\/code> \u78ba\u4fdd loop \u9593\u9694\u7a69\u5b9a\uff0c\u5c0d PID \u6f14\u7b97\u6cd5\u7684 <code>dt<\/code> \u7cbe\u5ea6\u5f88\u91cd\u8981\u3002<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7de8\u8b6f\u548c\u71d2\u9304-1\">\u7de8\u8b6f\u548c\u71d2\u9304<\/h2>\n\n\n\n<p>\u5b8c\u6210\u7a0b\u5f0f\u78bc\u5f8c\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 <a href=\"https:\/\/www.espressif.com\/en\/products\/sdks\/esp-idf\" target=\"_blank\" rel=\"noopener\">ESP-IDF<\/a> \u63d0\u4f9b\u7684\u547d\u4ee4\u9032\u884c\u7de8\u8b6f\u3001\u71d2\u9304\u548c\u76e3\u63a7\u3002<\/p>\n\n\n\n<p>\u5728 VS Code \u7684\u5de6\u4e0b\u89d2 ESP-IDF \u5de5\u5177\u5217\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ede\u9078 <strong>Build project<\/strong><\/li>\n\n\n\n<li>\u9ede\u9078 <strong>Flash device<\/strong><\/li>\n\n\n\n<li>\u9ede\u9078 <strong>Monitor device<\/strong><\/li>\n<\/ul>\n\n\n\n<p>\u7576\u7a0b\u5f0f\u958b\u59cb\u57f7\u884c\u5f8c\uff0c\u60a8\u61c9\u8a72\u80fd\u5728\u5e8f\u5217\u76e3\u63a7\u8996\u7a97\u4e2d\u770b\u5230\u5982\u4e0b\u8cc7\u8a0a\uff08\u8996\u60a8\u7a0b\u5f0f\u5982\u4f55\u5370\u51fa\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Current Temp: 28.7 \u00b0C\nSetpoint: 30.0 \u00b0C\nPID Output: 52.3 % (Fan speed)<\/code><\/pre>\n\n\n\n<p><br>\u9019\u8868\u793a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u611f\u6e2c\u5668\u6301\u7e8c\u56de\u5831\u76ee\u524d\u7684\u6eab\u5ea6<\/li>\n\n\n\n<li>PID \u63a7\u5236\u5668\u6839\u64da\u8a2d\u5b9a\u76ee\u6a19\u503c\uff08Setpoint\uff09\u8207\u5be6\u969b\u503c\uff08Measurement\uff09\u7684\u5dee\u7570\uff0c\u8a08\u7b97\u63a7\u5236\u8f38\u51fa<\/li>\n\n\n\n<li>\u63a7\u5236\u8f38\u51fa\uff08\u4f8b\u5982\u98a8\u6247\u8f49\u901f\uff09\u6703\u81ea\u52d5\u8abf\u6574\uff0c\u4ee5\u8da8\u8fd1\u76ee\u6a19\u6eab\u5ea6<\/li>\n<\/ul>\n\n\n\n<p>\u7576\u6eab\u5ea6\u9010\u6f38\u63a5\u8fd1\u76ee\u6a19\uff0c\u8f38\u51fa\u4e5f\u6703\u81ea\u52d5\u8da8\u7de9\uff0c\u5448\u73fe\u5e73\u7a69\u63a7\u5236\u7684\u6548\u679c\uff0c\u9019\u5c31\u662f PID \u63a7\u5236\u5668\u7684\u5be6\u969b\u61c9\u7528\u6210\u679c\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u7d50\u8ad6\">\u7d50\u8ad6<\/h2>\n\n\n\n<p>\u900f\u904e\u672c\u7bc7\u5be6\u4f5c\uff0c\u6211\u5011\u4e00\u6b65\u6b65\u5b8c\u6210\u4e86 PID \u63a7\u5236\u5668\u7684\u5efa\u69cb\uff0c\u4e26\u642d\u914d ESP32 \u7684\u786c\u9ad4\u8cc7\u6e90\uff08PWM\u3001ADC\u3001FreeRTOS\uff09\u6210\u529f\u9a45\u52d5\u51fa\u4e00\u500b\u53ef\u8abf\u63a7\u8f38\u51fa\u7684\u667a\u6167\u7cfb\u7d71\u3002\u7121\u8ad6\u4f60\u662f\u7528\u4f86\u63a7\u6eab\u3001\u63a7\u901f\uff0c\u6216\u672a\u4f86\u6574\u5408\u66f4\u8907\u96dc\u7684\u611f\u6e2c\u8207\u7db2\u8def\u6a21\u7d44\uff0c\u9019\u6a23\u7684\u57fa\u790e\u67b6\u69cb\u90fd\u80fd\u70ba\u4f60\u7684 IoT \u6216\u5d4c\u5165\u5f0f\u61c9\u7528\u6253\u4e0b\u5805\u5be6\u57fa\u790e\u3002<\/p>\n\n\n\n<p>PID \u96d6\u7136\u662f\u4e00\u500b\u7d93\u5178\u7684\u63a7\u5236\u6f14\u7b97\u6cd5\uff0c\u4f46\u642d\u914d\u73fe\u4ee3 MCU \u7684\u5f48\u6027\u8cc7\u6e90\uff0c\u4ecd\u7136\u53ef\u4ee5\u5be6\u73fe\u51fa\u8a31\u591a\u5f37\u5927\u53c8\u5be6\u7528\u7684\u529f\u80fd\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator alignwide has-text-color has-palette-color-1-color has-alpha-channel-opacity has-palette-color-1-background-color has-background is-style-wide\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PID Control \u63a7\u5236\u662f\u73fe\u4ee3\u63a7\u5236\u7cfb\u7d71\u4e2d\u6700\u5e38\u898b\u4e5f\u6700\u5be6\u7528\u7684\u65b9\u6cd5\u4e4b\u4e00\uff0c\u5f9e\u5de5\u696d\u81ea\u52d5\u5316\u5230 DIY \u6a5f\u5668\u4eba\uff0c\u90fd\u80fd\u898b\u5230 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3619,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,53,83],"tags":[27,21,44,9,11],"class_list":["post-3614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-module","category-esp32","category-featured","tag-c","tag-ide","tag-programming-language","tag-python","tag-tutorial"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/3614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/comments?post=3614"}],"version-history":[{"count":8,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/3614\/revisions"}],"predecessor-version":[{"id":3648,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/posts\/3614\/revisions\/3648"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/media\/3619"}],"wp:attachment":[{"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/media?parent=3614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/categories?post=3614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/saludpcb.com\/zh\/wp-json\/wp\/v2\/tags?post=3614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}