{"id":228,"date":"2025-05-23T12:23:53","date_gmt":"2025-05-23T04:23:53","guid":{"rendered":"http:\/\/47.111.133.139\/?p=228"},"modified":"2025-05-26T13:08:29","modified_gmt":"2025-05-26T05:08:29","slug":"%e9%80%90%e9%a3%9e%e7%a7%91%e6%8a%80-tc264-pid","status":"publish","type":"post","link":"https:\/\/yin.nnneri.me\/?p=228","title":{"rendered":"\u9010\u98de\u79d1\u6280 TC264 PID"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u7a0b\u5e8f<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">c<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6\">C<\/span><span role=\"button\" tabindex=\"0\" data-code=\"#include &quot;zf_common_headfile.h&quot;\n#include &quot;isr_config.h&quot;\n\n\n\/* \u4f7f\u7528\u7c7b\u578bA\u7684\u7535\u673a\u63a7\u5236\u5668\u8bf7\u6ce8\u91ca\u6389\u4e0b\u8ff0\u4ee3\u7801 *\/\n#define MOTOR_CONTROLLER_TYPE_B\n\n\/* \u672a\u5b9e\u73b0 *\/\n#define MOTOR_L_ROTATION 1\n#define MOTOR_R_ROTATION -1\n\n#define SERVO_MOTOR          (ATOM1_CH1_P33_9)    \/\/\u8235\u673aPWM\u901a\u9053\n#define SERVO_MOTOR_FREQ     (100)                \/\/\u8235\u673aPWM\u9891\u7387\n#define SERVO_MOTOR_MAX      (110)                \/\/\u8235\u673a\u6700\u5927\u7edd\u5bf9\u504f\u8f6c\u89d2\n#define SERVO_MOTOR_MIN      (80)                 \/\/\u8235\u673a\u6700\u5c0f\u7edd\u5bf9\u504f\u8f6c\u89d2\n#define SERVO_MOTOR_MID      (95)                 \/\/\u8235\u673a\u4e2d\u5fc3\u7edd\u5bf9\u504f\u8f6c\u89d2\n#define SERVO_MOTOR_DUTY(x)  ((double)PWM_DUTY_MAX\/(1000.0\/(double)SERVO_MOTOR_FREQ)*(0.5+(double)(x)\/90.0))\n\n#define PIT0                 (CCU60_CH0)          \/\/\u4e2d\u65ad\u6e90\n#define GEAR_RATIO           (2320)               \/\/\u8f6e\u901f\u7f16\u7801\u5668\u6bd4\n#define PID_MS               (1)                  \/\/\u4e24\u8f6e\u8fd0\u7b97\u65f6\u95f4\u5dee\n#define MAX_RPM              (100)\n\n#define WHEEL_CIRCUMFERENCE  (6.7 * 3.14 * 0.01)  \/\/ \u8f6e\u5b50\u5468\u957f\n#define FRONT_WHEEL_DISTANCE (0.152)              \/\/ \u524d\u8f6e\u8f74\u8ddd\n#define BACK_WHEEL_DISTANCE  (0.152)              \/\/ \u540e\u8f6e\u8f74\u8ddd\n#define WHEELBASE            (0.20)               \/\/ \u524d\u540e\u8f6e\u8ddd\u79bb\n#define MOTOR_MAX            (60)                 \/\/ \u6700\u5927PWM\n\/* \u63a5\u53e3\u4e0e\u901a\u9053\u5b9a\u4e49 *\/\n#define MOTORL_1             (ATOM0_CH4_P02_4)\n#define MOTORL_2             (ATOM0_CH5_P02_5)\n#define MOTORR_2             (ATOM1_CH6_P02_6)\n#define MOTORR_1             (ATOM1_CH7_P02_7)\n#define MOTOR_L              (ATOM1_CH7_P02_7)\n#define MOTOR_R              (ATOM0_CH5_P02_5)\n#define MOTOR_L_DIRECTION    (P02_6)\n#define MOTOR_R_DIRECTION    (P02_4)\n\n#define ENCODER1_DIR         (TIM5_ENCODER)\n#define ENCODER1_DIR_PULSE   (TIM5_ENCODER_CH1_P10_3)\n#define ENCODER1_DIR_DIR     (TIM5_ENCODER_CH2_P10_1)\n\n#define ENCODER2_DIR         (TIM6_ENCODER)\n#define ENCODER2_DIR_PULSE   (TIM6_ENCODER_CH1_P20_3)\n#define ENCODER2_DIR_DIR     (TIM6_ENCODER_CH2_P20_0)\n\nint32 Encoder1Count = 0;\nint32 Encoder2Count = 0;\n\ndouble Encoder1RPM = 0;\ndouble Encoder2RPM = 0;\n\ntypedef struct {\n        double SetSpeed;\n        double ActualSpeed;\n        double CurrSpeed;\n        double Kp;\n        double Ki;\n        double Kd;\n        double Err;\n        double ErrLast;\n        double ErrPrev;\n}pid_config_t;\n\npid_config_t MotorPid1 = {\n        .Kp = 0.8,\n        .Ki = 0,\n        .Kd = 2.5,\n};\n\npid_config_t MotorPid2 = {\n        .Kp = 0.8,\n        .Ki = 0.0,\n        .Kd = 2.5,\n};\n\ndouble speed_test = 0.3;\ndouble distance_test= 0.45;\ndouble offset_test = 0;\n\ndouble L = 0;\ndouble R = 0;\nvoid movControl(double speed, double distance, double offset);\nvoid motorPwmExpect (double LPwm,double RPwm);\nvoid motorPwmSet(double LPwm,double RPwm);\nvoid servoAngleSet(double angle);\nvoid motorPwmInit() {\n    pwm_init(SERVO_MOTOR, SERVO_MOTOR_FREQ, 0);\n\n#ifdef MOTOR_CONTROLLER_TYPE_B\n    pwm_init(MOTOR_L, 17000, 0);\n    pwm_init(MOTOR_R, 17000, 0);\n    gpio_init(MOTOR_R_DIRECTION, GPO, GPIO_LOW, GPO_PUSH_PULL);\n    gpio_init(MOTOR_L_DIRECTION, GPO, GPIO_LOW, GPO_PUSH_PULL);\n#else\n    pwm_init(MOTORL_1, 17000, 0);\n    pwm_init(MOTORL_2, 17000, 0);\n    pwm_init(MOTORR_1, 17000, 0);\n    pwm_init(MOTORR_2, 17000, 0);\n#endif\n    encoder_dir_init(ENCODER1_DIR, ENCODER1_DIR_PULSE, ENCODER1_DIR_DIR);\n    encoder_dir_init(ENCODER2_DIR, ENCODER2_DIR_PULSE, ENCODER2_DIR_DIR);\n    motorPwmExpect(0,8);\n    pit_ms_init(PIT0, PID_MS);\n    while (TRUE) {\n        printf(&quot;1:%f\\n&quot;,Encoder1RPM);\n        printf(&quot;2:%f\\n&quot;,Encoder2RPM);\n        \/\/ motorPwmSet(L,R);\n        movControl(speed_test, distance_test, offset_test);\n        system_delay_ms(100);\n    }\n\n}\n\n\/* \u7b97\u6cd5\u5b58\u5728\u6f5c\u5728\u95ee\u9898\uff0c\u5df2\u5e9f\u5f03 *\/\n\/\/void movControl(double speed, double distance, double offset) {\n\/\/    if (offset == 0) {\n\/\/        servoAngleSet (0);\n\/\/        motorPwmExpect (speed \/ WHEEL_CIRCUMFERENCE,1.0 \/ WHEEL_CIRCUMFERENCE * speed);\n\/\/        return;\n\/\/    }\n\/\/    double Radius = sqrt(distance * distance + offset * offset) \/ 2 * 1.0 \/ cos (atan (distance \/ offset));\n\/\/    double Delta = (atan (WHEELBASE \/ Radius)) * ((offset &gt; 0) ? -1.0 : 1.0);\n\/\/    Delta *= 180;\n\/\/    Delta \/= 3.1415926;\n\/\/    servoAngleSet (Delta);\n\/\/    double DeltaVPrime = speed * BACK_WHEEL_DISTANCE \/ Radius;\n\/\/    DeltaVPrime \/= 2;\n\/\/    double LeftWheelRPM = (speed + ((offset &gt; 0) ? DeltaVPrime : -DeltaVPrime)) \/ WHEEL_CIRCUMFERENCE;\n\/\/    double RightWheelRPM = 1.0 \/ WHEEL_CIRCUMFERENCE * (speed + ((offset &lt; 0) ? DeltaVPrime : -DeltaVPrime));\n\/\/    motorPwmExpect (LeftWheelRPM,RightWheelRPM);\n\/\/}\n\nvoid movControl(double speed, double distance, double offset)\n{\n    if (offset == 0) {\n        servoAngleSet (0);\n        motorPwmExpect (speed \/ WHEEL_CIRCUMFERENCE,1.0 \/ WHEEL_CIRCUMFERENCE * speed);\n        return;\n    }\n    double Radius = (distance * distance + offset * offset) \/ (2 * offset);\n    double Delta = atan(WHEELBASE \/ Radius);\n    servoAngleSet (Delta * -180.0 \/ 3.1415926);\n    double DeltaSpeed = speed * BACK_WHEEL_DISTANCE \/ Radius \/ 2.0;\n    double LeftWheelRPM = (speed + DeltaSpeed) \/ WHEEL_CIRCUMFERENCE;\n    double RightWheelRPM = 1.0 \/ WHEEL_CIRCUMFERENCE * (speed - DeltaSpeed);\n    motorPwmExpect (LeftWheelRPM,RightWheelRPM);\n}\n\nvoid servoAngleSet(double angle) {\n    angle \/= 3;\n    angle += SERVO_MOTOR_MID;\n    double angle1 = angle;\n    if (angle1 &gt; SERVO_MOTOR_MAX) angle1 = SERVO_MOTOR_MAX;\n    if (angle1 &lt; SERVO_MOTOR_MIN) angle1 = SERVO_MOTOR_MIN;\n    pwm_set_duty(SERVO_MOTOR, SERVO_MOTOR_DUTY(angle1));\n}\n\nvoid motorPwmExpect (double LPwm,double RPwm) {\n    MotorPid1.SetSpeed = LPwm;\n    MotorPid2.SetSpeed = RPwm;\n}\n\nvoid motorPwmSet(double LPwm,double RPwm) {\n    LPwm = (LPwm &gt; MOTOR_MAX) ? MOTOR_MAX : LPwm ;\n    LPwm = (LPwm &lt; -MOTOR_MAX) ? -MOTOR_MAX : LPwm ;\n    RPwm = (RPwm &gt; MOTOR_MAX) ? MOTOR_MAX : RPwm ;\n    RPwm = (RPwm &lt; -MOTOR_MAX) ? -MOTOR_MAX : RPwm ;\n\n#ifdef MOTOR_CONTROLLER_TYPE_B\n    pwm_set_duty(MOTOR_L, ((LPwm &gt;= 0) ? LPwm : -LPwm) * 100);\n    pwm_set_duty(MOTOR_R, ((RPwm &gt;= 0) ? RPwm : -RPwm) * 100);\n    gpio_set_level(MOTOR_L_DIRECTION, (LPwm &gt;= 0) ? 0 : 1);\n    gpio_set_level(MOTOR_R_DIRECTION, (RPwm &gt;= 0) ? 1 : 0);\n#else\n    if (LPwm &gt;= 0) {\n            pwm_set_duty(MOTORL_1, LPwm * 100);\n            pwm_set_duty(MOTORL_2, 0);\n        } else {\n            pwm_set_duty(MOTORL_1, 0);\n            pwm_set_duty(MOTORL_2, -LPwm * 100);\n        }\n        if (RPwm &gt;= 0) {\n            pwm_set_duty(MOTORR_1, RPwm * 100);\n            pwm_set_duty(MOTORR_2, 0);\n        } else {\n            pwm_set_duty(MOTORR_1, 0);\n            pwm_set_duty(MOTORR_2, -RPwm * 100);\n        }\n#endif\n}\n\n\nvoid pidCalc(pid_config_t* Pid) {\n    Pid-&gt;ErrPrev = Pid-&gt;ErrLast;\n    Pid-&gt;ErrLast = Pid-&gt;Err;\n    Pid-&gt;Err = Pid-&gt;SetSpeed - Pid-&gt;CurrSpeed;\n    double Delta = Pid-&gt;Kd * (Pid-&gt;Err - Pid-&gt;ErrLast)\n                   + Pid-&gt;Kp * Pid-&gt;Err\n                   + Pid-&gt;Ki * (Pid-&gt;Err - 2 * Pid-&gt;ErrLast + Pid-&gt;ErrPrev);\n    Pid-&gt;ActualSpeed += Delta;\n    if (Pid-&gt;ActualSpeed &gt; MAX_RPM)\n        Pid-&gt;ActualSpeed = MAX_RPM;\n    if (Pid-&gt;ActualSpeed &lt; -MAX_RPM)\n        Pid-&gt;ActualSpeed = -MAX_RPM;\n}\n\nIFX_INTERRUPT(cc60_pit_ch0_isr, 0, CCU6_0_CH0_ISR_PRIORITY) {\n    interrupt_global_enable(0);\n    pit_clear_flag(CCU60_CH0);\n\n    Encoder1Count = encoder_get_count(ENCODER1_DIR);\n    Encoder2Count = encoder_get_count(ENCODER2_DIR);\n\n    encoder_clear_count(ENCODER1_DIR);\n    encoder_clear_count(ENCODER2_DIR);\n\n    Encoder1RPM = 1.0 * Encoder1Count \/ GEAR_RATIO * (1000\/PID_MS);\n    Encoder2RPM = 1.0 * Encoder2Count \/ GEAR_RATIO * (1000\/PID_MS);\n\n    MotorPid1.CurrSpeed = Encoder1RPM;\n    MotorPid2.CurrSpeed = -Encoder2RPM;\n\n    pidCalc(&amp;MotorPid1);\n    pidCalc(&amp;MotorPid2);\n\n    motorPwmSet(MotorPid1.ActualSpeed,MotorPid2.ActualSpeed);\n}\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"\u590d\u5236\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">#include<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">zf_common_headfile.h<\/span><span style=\"color: #DEE492\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#include<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">isr_config.h<\/span><span style=\"color: #DEE492\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/* \u4f7f\u7528\u7c7b\u578bA\u7684\u7535\u673a\u63a7\u5236\u5668\u8bf7\u6ce8\u91ca\u6389\u4e0b\u8ff0\u4ee3\u7801 *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_CONTROLLER_TYPE_B<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/* \u672a\u5b9e\u73b0 *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_L_ROTATION<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_R_ROTATION<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #BF9EEE\">1<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR<\/span><span style=\"color: #F6F6F4\">          (ATOM1_CH1_P33_9)<\/span><span style=\"color: #7B7F8B\">    \/\/\u8235\u673aPWM\u901a\u9053<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR_FREQ<\/span><span style=\"color: #F6F6F4\">     (<\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                \/\/\u8235\u673aPWM\u9891\u7387<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR_MAX<\/span><span style=\"color: #F6F6F4\">      (<\/span><span style=\"color: #BF9EEE\">110<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                \/\/\u8235\u673a\u6700\u5927\u7edd\u5bf9\u504f\u8f6c\u89d2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR_MIN<\/span><span style=\"color: #F6F6F4\">      (<\/span><span style=\"color: #BF9EEE\">80<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                 \/\/\u8235\u673a\u6700\u5c0f\u7edd\u5bf9\u504f\u8f6c\u89d2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR_MID<\/span><span style=\"color: #F6F6F4\">      (<\/span><span style=\"color: #BF9EEE\">95<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                 \/\/\u8235\u673a\u4e2d\u5fc3\u7edd\u5bf9\u504f\u8f6c\u89d2<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">SERVO_MOTOR_DUTY<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #FFB86C; font-style: italic\">x<\/span><span style=\"color: #F6F6F4\">)  ((<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\">)PWM_DUTY_MAX<\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">1000.0<\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\">)SERVO_MOTOR_FREQ)<\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">0.5<\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\">)(x)<\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #BF9EEE\">90.0<\/span><span style=\"color: #F6F6F4\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">PIT0<\/span><span style=\"color: #F6F6F4\">                 (CCU60_CH0)<\/span><span style=\"color: #7B7F8B\">          \/\/\u4e2d\u65ad\u6e90<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">GEAR_RATIO<\/span><span style=\"color: #F6F6F4\">           (<\/span><span style=\"color: #BF9EEE\">2320<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">               \/\/\u8f6e\u901f\u7f16\u7801\u5668\u6bd4<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">PID_MS<\/span><span style=\"color: #F6F6F4\">               (<\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                  \/\/\u4e24\u8f6e\u8fd0\u7b97\u65f6\u95f4\u5dee<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MAX_RPM<\/span><span style=\"color: #F6F6F4\">              (<\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">WHEEL_CIRCUMFERENCE<\/span><span style=\"color: #F6F6F4\">  (<\/span><span style=\"color: #BF9EEE\">6.7<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">3.14<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.01<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">  \/\/ \u8f6e\u5b50\u5468\u957f<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">FRONT_WHEEL_DISTANCE<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">0.152<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">              \/\/ \u524d\u8f6e\u8f74\u8ddd<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">BACK_WHEEL_DISTANCE<\/span><span style=\"color: #F6F6F4\">  (<\/span><span style=\"color: #BF9EEE\">0.152<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">              \/\/ \u540e\u8f6e\u8f74\u8ddd<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">WHEELBASE<\/span><span style=\"color: #F6F6F4\">            (<\/span><span style=\"color: #BF9EEE\">0.20<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">               \/\/ \u524d\u540e\u8f6e\u8ddd\u79bb<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_MAX<\/span><span style=\"color: #F6F6F4\">            (<\/span><span style=\"color: #BF9EEE\">60<\/span><span style=\"color: #F6F6F4\">)<\/span><span style=\"color: #7B7F8B\">                 \/\/ \u6700\u5927PWM<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/* \u63a5\u53e3\u4e0e\u901a\u9053\u5b9a\u4e49 *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTORL_1<\/span><span style=\"color: #F6F6F4\">             (ATOM0_CH4_P02_4)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTORL_2<\/span><span style=\"color: #F6F6F4\">             (ATOM0_CH5_P02_5)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTORR_2<\/span><span style=\"color: #F6F6F4\">             (ATOM1_CH6_P02_6)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTORR_1<\/span><span style=\"color: #F6F6F4\">             (ATOM1_CH7_P02_7)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_L<\/span><span style=\"color: #F6F6F4\">              (ATOM1_CH7_P02_7)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_R<\/span><span style=\"color: #F6F6F4\">              (ATOM0_CH5_P02_5)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_L_DIRECTION<\/span><span style=\"color: #F6F6F4\">    (P02_6)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_R_DIRECTION<\/span><span style=\"color: #F6F6F4\">    (P02_4)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER1_DIR<\/span><span style=\"color: #F6F6F4\">         (TIM5_ENCODER)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER1_DIR_PULSE<\/span><span style=\"color: #F6F6F4\">   (TIM5_ENCODER_CH1_P10_3)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER1_DIR_DIR<\/span><span style=\"color: #F6F6F4\">     (TIM5_ENCODER_CH2_P10_1)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER2_DIR<\/span><span style=\"color: #F6F6F4\">         (TIM6_ENCODER)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER2_DIR_PULSE<\/span><span style=\"color: #F6F6F4\">   (TIM6_ENCODER_CH1_P20_3)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">ENCODER2_DIR_DIR<\/span><span style=\"color: #F6F6F4\">     (TIM6_ENCODER_CH2_P20_0)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">int32 Encoder1Count <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">int32 Encoder2Count <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Encoder1RPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Encoder2RPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">typedef<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">struct<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> SetSpeed;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> ActualSpeed;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> CurrSpeed;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Kp;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Ki;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Kd;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Err;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> ErrLast;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> ErrPrev;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><span style=\"color: #97E1F1; font-style: italic\">pid_config_t<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #97E1F1; font-style: italic\">pid_config_t<\/span><span style=\"color: #F6F6F4\"> MotorPid1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Kp <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.8<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Ki <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Kd <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2.5<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #97E1F1; font-style: italic\">pid_config_t<\/span><span style=\"color: #F6F6F4\"> MotorPid2 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Kp <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.8<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Ki <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.0<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        .Kd <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2.5<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">};<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> speed_test <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.3<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> distance_test<\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0.45<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> offset_test <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> L <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> R <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">movControl<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">speed<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">distance<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">offset<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmExpect<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">LPwm<\/span><span style=\"color: #F6F6F4\">,<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">RPwm<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmSet<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">LPwm<\/span><span style=\"color: #F6F6F4\">,<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">RPwm<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">servoAngleSet<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">angle<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmInit<\/span><span style=\"color: #F6F6F4\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(SERVO_MOTOR, SERVO_MOTOR_FREQ, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#ifdef<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_CONTROLLER_TYPE_B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTOR_L, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTOR_R, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">gpio_init<\/span><span style=\"color: #F6F6F4\">(MOTOR_R_DIRECTION, GPO, GPIO_LOW, GPO_PUSH_PULL);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">gpio_init<\/span><span style=\"color: #F6F6F4\">(MOTOR_L_DIRECTION, GPO, GPIO_LOW, GPO_PUSH_PULL);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTORL_1, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTORL_2, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTORR_1, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_init<\/span><span style=\"color: #F6F6F4\">(MOTORR_2, <\/span><span style=\"color: #BF9EEE\">17000<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#endif<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">encoder_dir_init<\/span><span style=\"color: #F6F6F4\">(ENCODER1_DIR, ENCODER1_DIR_PULSE, ENCODER1_DIR_DIR);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">encoder_dir_init<\/span><span style=\"color: #F6F6F4\">(ENCODER2_DIR, ENCODER2_DIR_PULSE, ENCODER2_DIR_DIR);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">motorPwmExpect<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">,<\/span><span style=\"color: #BF9EEE\">8<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pit_ms_init<\/span><span style=\"color: #F6F6F4\">(PIT0, PID_MS);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">while<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">TRUE<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">printf<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">1:<\/span><span style=\"color: #BF9EEE\">%f<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,Encoder1RPM);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">printf<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #E7EE98\">2:<\/span><span style=\"color: #BF9EEE\">%f<\/span><span style=\"color: #F286C4\">\\n<\/span><span style=\"color: #DEE492\">&quot;<\/span><span style=\"color: #F6F6F4\">,Encoder2RPM);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #7B7F8B\">\/\/ motorPwmSet(L,R);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">movControl<\/span><span style=\"color: #F6F6F4\">(speed_test, distance_test, offset_test);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">system_delay_ms<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/* \u7b97\u6cd5\u5b58\u5728\u6f5c\u5728\u95ee\u9898\uff0c\u5df2\u5e9f\u5f03 *\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/void movControl(double speed, double distance, double offset) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    if (offset == 0) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/        servoAngleSet (0);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/        motorPwmExpect (speed \/ WHEEL_CIRCUMFERENCE,1.0 \/ WHEEL_CIRCUMFERENCE * speed);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/        return;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    double Radius = sqrt(distance * distance + offset * offset) \/ 2 * 1.0 \/ cos (atan (distance \/ offset));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    double Delta = (atan (WHEELBASE \/ Radius)) * ((offset &gt; 0) ? -1.0 : 1.0);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    Delta *= 180;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    Delta \/= 3.1415926;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    servoAngleSet (Delta);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    double DeltaVPrime = speed * BACK_WHEEL_DISTANCE \/ Radius;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    DeltaVPrime \/= 2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    double LeftWheelRPM = (speed + ((offset &gt; 0) ? DeltaVPrime : -DeltaVPrime)) \/ WHEEL_CIRCUMFERENCE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    double RightWheelRPM = 1.0 \/ WHEEL_CIRCUMFERENCE * (speed + ((offset &lt; 0) ? DeltaVPrime : -DeltaVPrime));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/    motorPwmExpect (LeftWheelRPM,RightWheelRPM);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #7B7F8B\">\/\/}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">movControl<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">speed<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">distance<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">offset<\/span><span style=\"color: #F6F6F4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (offset <\/span><span style=\"color: #F286C4\">==<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">servoAngleSet<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #62E884\">motorPwmExpect<\/span><span style=\"color: #F6F6F4\"> (speed <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> WHEEL_CIRCUMFERENCE,<\/span><span style=\"color: #BF9EEE\">1.0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> WHEEL_CIRCUMFERENCE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> speed);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">return<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Radius <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (distance <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> distance <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> offset <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> offset) <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> offset);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Delta <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">atan<\/span><span style=\"color: #F6F6F4\">(WHEELBASE <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> Radius);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">servoAngleSet<\/span><span style=\"color: #F6F6F4\"> (Delta <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #BF9EEE\">180.0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">3.1415926<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> DeltaSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> speed <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> BACK_WHEEL_DISTANCE <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> Radius <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2.0<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> LeftWheelRPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (speed <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> DeltaSpeed) <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> WHEEL_CIRCUMFERENCE;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> RightWheelRPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1.0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> WHEEL_CIRCUMFERENCE <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> (speed <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> DeltaSpeed);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">motorPwmExpect<\/span><span style=\"color: #F6F6F4\"> (LeftWheelRPM,RightWheelRPM);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">servoAngleSet<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">angle<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    angle <\/span><span style=\"color: #F286C4\">\/=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">3<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    angle <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> SERVO_MOTOR_MID;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> angle1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> angle;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (angle1 <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> SERVO_MOTOR_MAX) angle1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> SERVO_MOTOR_MAX;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (angle1 <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> SERVO_MOTOR_MIN) angle1 <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> SERVO_MOTOR_MIN;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(SERVO_MOTOR, <\/span><span style=\"color: #62E884\">SERVO_MOTOR_DUTY<\/span><span style=\"color: #F6F6F4\">(angle1));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmExpect<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">LPwm<\/span><span style=\"color: #F6F6F4\">,<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">RPwm<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    MotorPid1.SetSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> LPwm;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    MotorPid2.SetSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> RPwm;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmSet<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">LPwm<\/span><span style=\"color: #F6F6F4\">,<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">RPwm<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    LPwm <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (LPwm <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> MOTOR_MAX) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> MOTOR_MAX <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> LPwm ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    LPwm <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (LPwm <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MOTOR_MAX) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MOTOR_MAX <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> LPwm ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    RPwm <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (RPwm <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> MOTOR_MAX) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> MOTOR_MAX <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> RPwm ;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    RPwm <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> (RPwm <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MOTOR_MAX) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MOTOR_MAX <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> RPwm ;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#ifdef<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_CONTROLLER_TYPE_B<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTOR_L, ((LPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> LPwm <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">LPwm) <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTOR_R, ((RPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> RPwm <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">RPwm) <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">gpio_set_level<\/span><span style=\"color: #F6F6F4\">(MOTOR_L_DIRECTION, (LPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">gpio_set_level<\/span><span style=\"color: #F6F6F4\">(MOTOR_R_DIRECTION, (RPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) <\/span><span style=\"color: #F286C4\">?<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">:<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (LPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORL_1, LPwm <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORL_2, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        } <\/span><span style=\"color: #F286C4\">else<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORL_1, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORL_2, <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">LPwm <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (RPwm <\/span><span style=\"color: #F286C4\">&gt;=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORR_1, RPwm <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORR_2, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        } <\/span><span style=\"color: #F286C4\">else<\/span><span style=\"color: #F6F6F4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORR_1, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">            <\/span><span style=\"color: #62E884\">pwm_set_duty<\/span><span style=\"color: #F6F6F4\">(MOTORR_2, <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">RPwm <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">100<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#endif<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">pidCalc<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #97E1F1; font-style: italic\">pid_config_t<\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">Pid<\/span><span style=\"color: #F6F6F4\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrPrev <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrLast;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrLast <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Err;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Err <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">SetSpeed <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">CurrSpeed;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> Delta <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Kd <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> (Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Err <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrLast)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                   <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Kp <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Err<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">                   <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Ki <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> (Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">Err <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">2<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrLast <\/span><span style=\"color: #F286C4\">+<\/span><span style=\"color: #F6F6F4\"> Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ErrPrev);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ActualSpeed <\/span><span style=\"color: #F286C4\">+=<\/span><span style=\"color: #F6F6F4\"> Delta;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ActualSpeed <\/span><span style=\"color: #F286C4\">&gt;<\/span><span style=\"color: #F6F6F4\"> MAX_RPM)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ActualSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> MAX_RPM;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">if<\/span><span style=\"color: #F6F6F4\"> (Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ActualSpeed <\/span><span style=\"color: #F286C4\">&lt;<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MAX_RPM)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">        Pid<\/span><span style=\"color: #F286C4\">-&gt;<\/span><span style=\"color: #F6F6F4\">ActualSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">MAX_RPM;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #62E884\">IFX_INTERRUPT<\/span><span style=\"color: #F6F6F4\">(cc60_pit_ch0_isr, <\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">, CCU6_0_CH0_ISR_PRIORITY) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">interrupt_global_enable<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #BF9EEE\">0<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pit_clear_flag<\/span><span style=\"color: #F6F6F4\">(CCU60_CH0);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Encoder1Count <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">encoder_get_count<\/span><span style=\"color: #F6F6F4\">(ENCODER1_DIR);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Encoder2Count <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">encoder_get_count<\/span><span style=\"color: #F6F6F4\">(ENCODER2_DIR);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">encoder_clear_count<\/span><span style=\"color: #F6F6F4\">(ENCODER1_DIR);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">encoder_clear_count<\/span><span style=\"color: #F6F6F4\">(ENCODER2_DIR);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Encoder1RPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1.0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> Encoder1Count <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> GEAR_RATIO <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\">PID_MS);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    Encoder2RPM <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #BF9EEE\">1.0<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> Encoder2Count <\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\"> GEAR_RATIO <\/span><span style=\"color: #F286C4\">*<\/span><span style=\"color: #F6F6F4\"> (<\/span><span style=\"color: #BF9EEE\">1000<\/span><span style=\"color: #F286C4\">\/<\/span><span style=\"color: #F6F6F4\">PID_MS);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    MotorPid1.CurrSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> Encoder1RPM;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    MotorPid2.CurrSpeed <\/span><span style=\"color: #F286C4\">=<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #F286C4\">-<\/span><span style=\"color: #F6F6F4\">Encoder2RPM;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pidCalc<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">MotorPid1);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">pidCalc<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">&amp;<\/span><span style=\"color: #F6F6F4\">MotorPid2);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #62E884\">motorPwmSet<\/span><span style=\"color: #F6F6F4\">(MotorPid1.ActualSpeed,MotorPid2.ActualSpeed);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">h<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6\">C<\/span><span role=\"button\" tabindex=\"0\" data-code=\"#ifndef MOTOR_H\n#define MOTOR_H\n\nvoid motorPwmInit();\nvoid movControl(double speed, double distance, double offset);\n\n#endif\n\" style=\"color:#f6f6f4;display:none\" aria-label=\"\u590d\u5236\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">#ifndef<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_H<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#define<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">MOTOR_H<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">motorPwmInit<\/span><span style=\"color: #F6F6F4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">void<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">movControl<\/span><span style=\"color: #F6F6F4\">(<\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">speed<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">distance<\/span><span style=\"color: #F6F6F4\">, <\/span><span style=\"color: #F286C4\">double<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #FFB86C; font-style: italic\">offset<\/span><span style=\"color: #F6F6F4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">#endif<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u7a0b\u5e8f c h<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[3],"tags":[],"class_list":["post-228","post","type-post","status-publish","format-standard","hentry","category-code"],"_links":{"self":[{"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=228"}],"version-history":[{"count":3,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":339,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=\/wp\/v2\/posts\/228\/revisions\/339"}],"wp:attachment":[{"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yin.nnneri.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}