找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3087|回复: 3
打印 上一主题 下一主题
收起左侧

stm32F1单片机调简易倒立摆 成功版源码 含pid调节

[复制链接]
跳转到指定楼层
楼主
ID:226162 发表于 2017-8-10 20:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用到了编码器,步进电机,含pid的调节,与大家分享!

所有资料51hei提供下载:
倒立摆调试-全部成功.rar (317.32 KB, 下载次数: 83)


单片机源程序如下:
  1. /********************************************************

  2.   说明:本工程模板包含MPU6050,OLED,TIM2作为定时器使用时间片,
  3.         TIM3作4路PWM输出并计算输出的脉冲个数,使用PC15作为LED,
  4.         使用PE1,PE2,PE3,PE4做外部中断的按键输入。
  5.        
  6.         作者:汕头大学电子系max团队

  7. ********************************************************/
  8. #include "sys.h"
  9. #include "delay.h"
  10. #include "usart.h"
  11. #include "math.h"
  12. #include "led.h"   //LED:PC15
  13. #include "TIM4.h" //PB6和PB7为编码器通道
  14. #include "TIM2.h"  //定时器2作为时间片
  15. #include "pwm.h" //定时器3做PWM输出,并计算输出脉冲个数;PB0,PB1,PA6,PA7
  16. //#include "OLED_I2C.h"  //SCL:PB10 SDA:PB11
  17. #include "delay_1.h"
  18. #include "key.h" //按键:PE1,PE2,PE3,PE4
  19. #include "ADC.h"  //AD1:通道1 PC0
  20. #include "DMA.h"

  21. #define N 10

  22. float Kp = 160;
  23. float Kd = 5;
  24. float Ki = 1.2;
  25. float Kp_b = 0;        //编码器Kp
  26. float Ki_b = 0;        //编码器Kd

  27. int   Go = 0.0;
  28. float err = 0;

  29. float jifen_shangxian = 1000;  //积分限幅
  30. float Ju_Li_Max = 10000;  //积分限幅

  31. // ADC1转换的电压值通过MDA方式传到SRAM
  32. extern __IO uint16_t ADC_ConvertedValue;

  33. // 局部变量,用于保存转换计算后的电压值          
  34. float ADC_ConvertedValueLocal,Angle,Angle_err,Angle_Last,Angle_jifen;  

  35. extern uint8_t SendBuff[SIZE];

  36. int PWM_OUT = 0,PWM_WEIYI ,PWM_ANGLE;
  37. u8 time = 2; //定时器2计?
  38. int Time_EN = 500;
  39. int Time_Go = 0;
  40. int Time_D = 10;
  41. u8 Key_Flag = 0;//按键返回1234

  42. int Count_TIM4 ; //脉冲数取值
  43. int Wei_Yi;       //更新脉冲数
  44. int Wei_Yi_Last = 0;//上一次的位移数值
  45. int Speed; //电机的速度
  46. int Ju_Li = 0;//速度的积分

  47. int Wei_Yi_flag=0;
  48. int ZhouQi = 0;

  49. u8 i = 0,j = 0;         
  50. float Lvbo[N] = {0};
  51. int Mode1_Flag = 0,Mode4_Flag = 0;

  52. /***************DMA打印函数****************/
  53. /****
  54.   shu1:3位,shu2:5位,shu3:3位,shu4:4位,shu5:9位
  55. *****/
  56. void DMA_Send(int start,int Shu1,int Shu2 ,int Shu3,int Shu4,int Shu5)  //start:数组的起始位置 shu:变量
  57. {   
  58.           if(Shu1 < 0)
  59.                 {
  60.       Shu1 = -Shu1;
  61.                         SendBuff[start]   = '-';
  62.                         SendBuff[start+1] = Shu1/100 + 0x30;
  63.                         SendBuff[start+2] = Shu1%100/10 + 0x30;
  64.                         SendBuff[start+3] = Shu1%10 + 0x30;
  65.                         SendBuff[start+4] = ' ';
  66.     }
  67.                 else
  68.                 {
  69.       SendBuff[start]   = '+';
  70.                         SendBuff[start+1] = Shu1/100 + 0x30;
  71.                         SendBuff[start+2] = Shu1%100/10 + 0x30;
  72.                         SendBuff[start+3] = Shu1%10 + 0x30;
  73.                         SendBuff[start+4] = ' ';
  74.     }
  75.                 if(Shu2<0)
  76.                 {
  77.                         Shu2 = -Shu2;
  78.                         SendBuff[start+5] = '-';
  79.                         SendBuff[start+6] = Shu2/10000 + 0x30;
  80.                         SendBuff[start+7] = Shu2%10000/1000 + 0x30;
  81.                         SendBuff[start+8] = Shu2%1000/100 + 0x30;
  82.                         SendBuff[start+9] = Shu2%100/10 + 0x30;
  83.                         SendBuff[start+10] = Shu2%10 + 0x30;
  84.                         SendBuff[start+11] = ' ';
  85.                 }
  86.                 else
  87.                 {
  88.                         SendBuff[start+5] = '+';
  89.       SendBuff[start+6] = Shu2/10000 + 0x30;
  90.                         SendBuff[start+7] = Shu2%10000/1000 + 0x30;
  91.                         SendBuff[start+8] = Shu2%1000/100 + 0x30;
  92.                         SendBuff[start+9] = Shu2%100/10 + 0x30;
  93.                         SendBuff[start+10] = Shu2%10 + 0x30;
  94.                         SendBuff[start+11] = ' ';
  95.     }
  96.           
  97.                 if(Shu3 < 0)
  98.                 {
  99.       Shu3 = -Shu3;
  100.                         SendBuff[start+12]   = '-';
  101.                         SendBuff[start+13] = Shu3/100 + 0x30;
  102.                         SendBuff[start+14] = Shu3%100/10 + 0x30;
  103.                         SendBuff[start+15] = Shu3%10 + 0x30;
  104.                         SendBuff[start+16] = ' ';
  105.     }
  106.                 else
  107.                 {
  108.       SendBuff[start+12]   = '+';
  109.                         SendBuff[start+13] = Shu3/100 + 0x30;
  110.                         SendBuff[start+14] = Shu3%100/10 + 0x30;
  111.                         SendBuff[start+15] = Shu3%10 + 0x30;
  112.                         SendBuff[start+16] = ' ';
  113.     }
  114.                
  115.                 if(Shu4 < 0)
  116.                 {
  117.       Shu4 = -Shu4;
  118.                         SendBuff[start+17]   = '-';
  119.                         SendBuff[start+18] = Shu4/1000 + 0x30;
  120.                         SendBuff[start+19] = Shu4%1000/100 + 0x30;
  121.                         SendBuff[start+20] = Shu4%100/10 + 0x30;
  122.                         SendBuff[start+21] = Shu4%10 + 0x30;
  123.                         SendBuff[start+22] = ' ';
  124.     }
  125.                 else
  126.                 {
  127.                   SendBuff[start+17]   = '+';
  128.                         SendBuff[start+18] = Shu4/1000 + 0x30;
  129.                         SendBuff[start+19] = Shu4%1000/100 + 0x30;
  130.                         SendBuff[start+20] = Shu4%100/10 + 0x30;
  131.                         SendBuff[start+21] = Shu4%10 + 0x30;
  132.                         SendBuff[start+22] = ' ';
  133.     }
  134.                 if(Shu5 < 0)
  135.                 {
  136.       Shu5 = -Shu5;
  137.                         SendBuff[start+23]   = '-';
  138.                         SendBuff[start+24] = Shu5/100000000 + 0x30;
  139.                         SendBuff[start+25] = Shu5%100000000/10000000 + 0x30;
  140.                         SendBuff[start+26] = Shu5%10000000/1000000 + 0x30;
  141.                         SendBuff[start+27] = Shu5%1000000/100000 + 0x30;
  142.                         SendBuff[start+28] = Shu5%100000/10000 + 0x30;
  143.                         SendBuff[start+29] = Shu5%10000/1000 + 0x30;
  144.                         SendBuff[start+30] = Shu5%1000/100 + 0x30;
  145.                         SendBuff[start+31] = Shu5%100/10 + 0x30;
  146.                         SendBuff[start+32] = Shu5%10 + 0x30;
  147.                         SendBuff[start+33] = ' ';
  148.     }
  149.                 else
  150.                 {
  151.                   SendBuff[start+23]   = '+';
  152.                         SendBuff[start+24] = Shu5/100000000 + 0x30;
  153.                         SendBuff[start+25] = Shu5%100000000/10000000 + 0x30;
  154.                         SendBuff[start+26] = Shu5%10000000/1000000 + 0x30;
  155.                         SendBuff[start+27] = Shu5%1000000/100000 + 0x30;
  156.                         SendBuff[start+28] = Shu5%100000/10000 + 0x30;
  157.                         SendBuff[start+29] = Shu5%10000/1000 + 0x30;
  158.                         SendBuff[start+30] = Shu5%1000/100 + 0x30;
  159.                         SendBuff[start+31] = Shu5%100/10 + 0x30;
  160.                         SendBuff[start+32] = Shu5%10 + 0x30;
  161.                         SendBuff[start+33] = ' ';
  162.     }
  163.                
  164.                 SendBuff[start+34]= '\n';
  165. }

  166. /*************电机控制:正转***************/
  167. void Motor_Zheng(int pwm)
  168. {
  169.   TIM_SetCompare1(TIM3,pwm);
  170.         GPIO_ResetBits(GPIOC, GPIO_Pin_4);
  171. }

  172. /*************电机控制:反转**************/
  173. void Motor_Fan(int pwm)
  174. {
  175.   TIM_SetCompare1(TIM3,1000-pwm);
  176.         GPIO_SetBits(GPIOC, GPIO_Pin_4);
  177. }



  178. int main(void)
  179. {
  180. //   u8 i = 0,j = 0;         
  181.         delay_init();                     //延时函数初始化          
  182.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  183.         uart_init(115200);         //串口初始化为9600
  184.          
  185.         printf("***********************\r\n");
  186.         USART1_DMA_Config();
  187.         LED_GPIO_Config();   //LED初始化 :PC15
  188.   TIM2_Init();  //定时器2初始化
  189.         TIM3_PWM_Init();//定时器3PWM输出初始化
  190.         Time4_Config(); //TIM4编码器模式
  191.         ADC1_Init();  //AD初始化 PC0
  192.         /*****************按键初始化****************/
  193.         KEY_Init();//IO初始化       
  194.   EXTIX_Init();//外部中断初始化       
  195.   
  196.         printf("111111111111111111111111\r\n");
  197.        
  198.   printf("333333333333333333333333333\r\n");

  199.   USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);  //串口1的DMA使能

  200.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); //开启定时器TIM2
  201.        
  202.         TIM_SetCounter(TIM4, 5050);  //TIM4编码器计数初始值
  203.        
  204.         while(1)
  205.         {
  206.                 Count_TIM4 = (TIM4 -> CNT) - 5050;   //定时器4脉冲计数,编码器输入,初始为5500
  207.                
  208.                 Wei_Yi = 5000*ZhouQi + Count_TIM4;   //就算出位移
  209.                
  210.                
  211.                 if((TIM4 -> CNT) >= 10050)
  212.                 {
  213.        (TIM4 -> CNT) = 5050;
  214.                          ZhouQi ++;             //转的圈数++
  215.     }
  216.                 else if((TIM4 -> CNT) <= 50)
  217.                 {
  218.        (TIM4 -> CNT) = 5050;
  219.                           ZhouQi--;                  //转的圈数--
  220.     }
  221.                
  222.                 /********递推均值滤波********/
  223.                 Lvbo[i++] =(ADC_ConvertedValue - 2048)*0.0879 + err; // 读取转换的AD值(int)
  224.                 if(i == N)
  225.                 {
  226.                         i = 0;
  227.                 }
  228.                
  229.                 for(j = 0;j<N;j++)
  230.                 {
  231.                         ADC_ConvertedValueLocal = ADC_ConvertedValueLocal + Lvbo[j];
  232.                 }
  233.                
  234.                 /*****按键4按下后给偏移角Go,其他状态不要偏移*********/
  235.                 if(Key_Flag != 4)
  236.                 {
  237.                  Angle = ADC_ConvertedValueLocal /10;
  238.                 }
  239.                 else
  240.                 {
  241.        Angle = ADC_ConvertedValueLocal /10+Go;
  242.     }

  243.                 ADC_ConvertedValueLocal  = 0;
  244.    
  245.                 /**********状态0关闭电机*******/
  246.                 if(Key_Flag ==0)
  247.                 {
  248.               GPIO_ResetBits(GPIOC, GPIO_Pin_5);
  249.     }
  250.                 else if(Key_Flag == 1)       //按键1,基本题第一二题,完成圆周运动
  251.                 {   
  252.                           GPIO_SetBits(GPIOC, GPIO_Pin_5);
  253.                                 switch(Mode1_Flag)
  254.                                 {
  255.                                         case 0:{Motor_Zheng(800);}break;
  256.                                         case 1:{Motor_Fan(900);}break;
  257.                                         case 2:{Motor_Zheng(950);}break;
  258.                                         case 3:{Motor_Fan(950);}break;
  259.                                         case 4:{Motor_Zheng(800);}break;
  260.                                         case 5:{Motor_Zheng(0);Key_Flag =0;}break;
  261.                                 }
  262.           }
  263.                
  264.                
  265.                 else if(Key_Flag == 3)    //按键3,摆摆动至+-35度进入状态6,进行PID调节
  266.                 {
  267.         GPIO_SetBits(GPIOC, GPIO_Pin_5);
  268.                                 switch(Mode1_Flag)
  269.                                 {
  270.                                         case 0:{Motor_Zheng(800);}break;
  271.                                         case 1:{Motor_Fan(900);}break;
  272.                                         case 2:{Motor_Zheng(180);}break; //200
  273.                                         case 3:{
  274.                                                        Motor_Zheng(0);
  275.                                                        if(Angle>-35&& Angle<35)
  276.                    {
  277.                     Key_Flag  = 6;
  278.                    }
  279.                                                                          else
  280.                                                                          {
  281.                     Key_Flag =0;
  282.                    }
  283.                   }break;
  284.                                 }
  285.     }
  286.           LED1_TOGGLE        ;
  287.                 DMA_Send(0,Angle,Count_TIM4,Angle_err,Speed,Ju_Li);//Angle_jifen
  288.                 LED1_TOGGLE        ;

  289.         }
  290. }

  291. /*******************中断函数*******************/
  292. void TIM2_IRQHandler(void)
  293. {  
  294.                 if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
  295.                 {       
  296.                         time--;       
  297.                
  298.                         if(time <= 0)
  299.                         {
  300.                                 time = 2;
  301.                                 if(Key_Flag == 2)   //状态2的PID控制
  302.                                 {
  303.                                                         Angle_err = Angle-Angle_Last;
  304.                                                
  305.                                                         Angle_Last = Angle;
  306.                                                        
  307.                                                         Speed = Wei_Yi - Wei_Yi_Last;
  308.                                                        
  309.                                                         Wei_Yi_Last = Wei_Yi;
  310.                                                        
  311.                                                         Ju_Li += Speed;
  312.                                                         if(Ju_Li > Ju_Li_Max)
  313.                                                         {
  314.                  Ju_Li = Ju_Li_Max ;
  315.               }
  316.                                                         if(Ju_Li < -Ju_Li_Max)
  317.                                                         {
  318.                  Ju_Li = -Ju_Li_Max ;
  319.               }
  320.                                        
  321.                                                        
  322.                                                 PWM_WEIYI = -Speed*Kp_b -Ju_Li*Ki_b ;                               
  323.                                           
  324.                                                 PWM_ANGLE = (Angle)*Kp + Angle_err*Kd;
  325.                                                
  326.                                                 PWM_OUT = PWM_ANGLE + PWM_WEIYI;
  327.                                        
  328.                                           if(PWM_OUT < 0)
  329.                                                 {
  330.                                                         if(PWM_OUT<=-1000)
  331.                                                         {
  332.                                                                 PWM_OUT=-1000;
  333.                                                         }
  334.                                                         Motor_Zheng(-PWM_OUT);
  335.                                                 }
  336.                                                 else
  337.                                                 {
  338.                                                         if(PWM_OUT>=1000)
  339.                                                         {
  340.                                                                 PWM_OUT=1000;
  341.                                                         }
  342.                                                          Motor_Fan(PWM_OUT);
  343.                                                 }
  344.                                                 if(Angle >= 45 || Angle <=-45)
  345.                                                 {
  346.                                                   GPIO_ResetBits(GPIOC, GPIO_Pin_5);
  347.               Motor_Fan(0);
  348.                                                         Key_Flag = 0;
  349.                                                         PWM_OUT = 0;
  350.                                                         Angle_jifen=0;
  351.                                                   Wei_Yi_flag=0;
  352.             }
  353.                           }
  354.                                
  355.                                 if(Key_Flag == 6)   //状态6的PID控制,和状态2一样,可以适当微调
  356.                                 {
  357.                                                 Angle_err = Angle-Angle_Last;
  358.                                                
  359.                                                         Angle_Last = Angle;
  360.                                                        
  361.                                                         Speed = Wei_Yi - Wei_Yi_Last;
  362.                                                        
  363.                                                         Wei_Yi_Last = Wei_Yi;
  364.                                                        
  365.                                                         Ju_Li += Speed;
  366.                                                         if(Ju_Li > Ju_Li_Max)
  367.                                                         {
  368.                  Ju_Li = Ju_Li_Max ;
  369.               }
  370.                                                         if(Ju_Li < -Ju_Li_Max)
  371.                                                         {
  372.                  Ju_Li = -Ju_Li_Max ;
  373.               }
  374.                                        
  375.                                                        
  376.                                                 PWM_WEIYI = -Speed*Kp_b -Ju_Li*Ki_b ;                               
  377.                                           
  378.                                                 PWM_ANGLE = (Angle)*Kp + Angle_err*Kd;
  379.                                                
  380.                                                 PWM_OUT = PWM_ANGLE + PWM_WEIYI;
  381.                                        
  382.                                           if(PWM_OUT < 0)
  383.                                                 {
  384.                                                         if(PWM_OUT<=-1000)
  385.                                                         {
  386.                                                                 PWM_OUT=-1000;
  387.                                                         }
  388.                                                         Motor_Zheng(-PWM_OUT);
  389.                                                 }
  390.                                                 else
  391.                                                 {
  392.                                                         if(PWM_OUT>=1000)
  393.                                                         {
  394.                                                                 PWM_OUT=1000;
  395.                                                         }
  396.                                                          Motor_Fan(PWM_OUT);
  397.                                                 }
  398.                                                 if(Angle >= 45 || Angle <=-45)
  399.                                                 {
  400.                                                   GPIO_ResetBits(GPIOC, GPIO_Pin_5);
  401.               Motor_Fan(0);
  402.                                                         Key_Flag = 0;
  403.                                                         PWM_OUT = 0;
  404.                                                         Angle_jifen=0;
  405.                                                   Wei_Yi_flag=0;
  406.             }
  407.                           }
  408.                                
  409.                                
  410.                                 if(Key_Flag == 4)   //状态4:给一个偏移角后进行同样的PID控制,系统会往偏移方向摆动
  411.                                 {
  412.            Angle_err = Angle-Angle_Last;
  413.                                                
  414.                                                         Angle_Last = Angle;
  415.                                                        
  416.                                                         Speed = Wei_Yi - Wei_Yi_Last;
  417.                                                        
  418.                                                         Wei_Yi_Last = Wei_Yi;
  419.                                                        
  420.                                                         Ju_Li += Speed;
  421.                                                         if(Ju_Li > Ju_Li_Max)
  422.                                                         {
  423.                  Ju_Li = Ju_Li_Max ;
  424.               }
  425.                                                         if(Ju_Li < -Ju_Li_Max)
  426.                                                         {
  427.                  Ju_Li = -Ju_Li_Max ;
  428.               }
  429.                                        
  430.                                                        
  431.                                                 PWM_WEIYI = -Speed*Kp_b -Ju_Li*Ki_b ;                               
  432.                                           
  433.                                                 PWM_ANGLE = (Angle)*Kp + Angle_err*Kd;
  434.                                                
  435.                                                 PWM_OUT = PWM_ANGLE + PWM_WEIYI;
  436.                                        
  437.                                           if(PWM_OUT < 0)
  438.                                                 {
  439.                                                         if(PWM_OUT<=-1000)
  440.                                                         {
  441.                                                                 PWM_OUT=-1000;
  442.                                                         }
  443.                                                         Motor_Zheng(-PWM_OUT);
  444.                                                 }
  445.                                                 else
  446.                                                 {
  447.                                                         if(PWM_OUT>=1000)
  448.                                                         {
  449.                                                                 PWM_OUT=1000;
  450.                                                         }
  451.                                                          Motor_Fan(PWM_OUT);
  452.                                                 }
  453.                                                 if(Angle >= 45 || Angle <=-45)
  454.                                                 {
  455.                                                   GPIO_ResetBits(GPIOC, GPIO_Pin_5);
  456.               Motor_Fan(0);
  457.                                                         Key_Flag = 0;
  458.                                                         PWM_OUT = 0;
  459.                                                         Angle_jifen=0;
  460.                                                   Wei_Yi_flag=0;
  461.             }
  462.                           }
  463.                                
  464.                         }               

  465.                         if(Key_Flag == 1)   //按键1按下后,控制摆动的时间
  466.                         {
  467.          Time_EN --;
  468.                                 if(Time_EN <=0 && Mode1_Flag <5)
  469.                          {
  470.          Time_EN =500;
  471.                                  Mode1_Flag ++;
  472.                                  if(Mode1_Flag >= 5)
  473.                                  {
  474.             Mode1_Flag = 5;
  475.          }
  476.        }
  477.       }
  478.                        
  479.                   if(Key_Flag == 3)
  480.                         {
  481.         Time_EN --;
  482.                          if(Time_EN <=0 && Mode1_Flag <3)
  483.                          {
  484.          Time_EN =500;
  485.                                  Mode1_Flag ++;
  486.                                  if(Mode1_Flag >= 3)
  487.                                  {
  488.             Mode1_Flag = 3;
  489.          }
  490.        }
  491.       }
  492.                        
  493.                         if(Key_Flag == 4)
  494.                         {
  495.         Time_Go--;
  496.                                 if(Time_Go <= 0)
  497.                                 {
  498.                                          Time_Go = 0;
  499.                                          Go = 0;
  500.                                          Key_Flag = 2;
  501.         }
  502.       }
  503.                         TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);  
  504.                 }                        
  505. }



  506. //外部中断0服务程序
  507. void EXTI1_IRQHandler(void)
  508. {
  509.         delay_ms(10);//消抖
  510.        
  511.         if(KEY3==1)                  //WK_UP按键1
  512.         {                                 
  513.                  Key_Flag = 1;
  514.                 Time_EN = 500;
  515.                  Mode1_Flag = 0;
  516.         }
  517.         EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE0上的中断标志位  
  518. }


  519. //外部中断2服务程序
  520. void EXTI2_IRQHandler(void)
  521. {
  522.         delay_ms(10);//消抖
  523.         if(KEY2==0)          //按键KEY2  
  524.         {
  525.     Kp = 160;//200
  526.     Kd = 1.5; //10
  527.                 Kp_b = 0.2;//5 0.475
  528.                 Ki_b = 2;
  529.                 Ju_Li_Max=200;
  530.                 Speed=0;
  531.                 Key_Flag = 2;
  532.                 GPIO_SetBits(GPIOC, GPIO_Pin_5);
  533.                 Ju_Li = 0;
  534.   }                 
  535.         EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中断标志位  
  536. }

  537. //外部中断3服务程序
  538. void EXTI3_IRQHandler(void)
  539. {
  540.         delay_ms(10);//消抖
  541.         if(KEY1==0)         //按键KEY3
  542.         {                                 
  543.           Kp = 160;//200
  544.     Kd = 1.5; //10
  545.                 Kp_b = 0.2;//5 0.475
  546.                 Ki_b = 2;
  547.                 Ju_Li_Max=200;
  548.                 Speed=0;
  549.                 GPIO_SetBits(GPIOC, GPIO_Pin_5);
  550.           Key_Flag = 3;
  551.                 Time_EN = 500;
  552.                 Mode1_Flag = 0;
  553.                 Ju_Li = 0;
  554.         }                 
  555.         EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  
  556. }


  557. void EXTI4_IRQHandler(void)
  558. {
  559.         delay_ms(10);//消抖
  560.         if(KEY0==0)         //按键KEY4
  561.         {
  562.                 Kp = 160;//200
  563.     Kd = 1.5; //10
  564.                 Kp_b = 0.2;//5 0.475
  565.                 Ki_b = 2;
  566.                 Ju_Li_Max=200;
  567.                 Speed=0;
  568.                 Key_Flag = 4;
  569.                 GPIO_SetBits(GPIOC, GPIO_Pin_5);
  570.                 Ju_Li = 0;
  571.                 Time_Go = 3500;
  572.                 Go = 3.0;
  573.         }                 
  574.         EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
  575. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:514560 发表于 2019-4-22 20:01 | 只看该作者
怎么没有初值
回复

使用道具 举报

板凳
ID:453741 发表于 2019-7-13 19:46 | 只看该作者
强,大佬
回复

使用道具 举报

地板
ID:584101 发表于 2019-7-19 15:41 | 只看该作者
真厉害,希望有一天也有这个水平吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表