[其他ST产品] 小车PID算法跑直线

[复制链接]
482|10
 楼主| 结合国际经验 发表于 2023-2-28 17:35 | 显示全部楼层 |阅读模式
  1. #include<stm32f10x.h>
  2. #include"sys.h"


  3. extern unsigned char Rec_Dat_U1;
  4. extern unsigned char Rec_String_U1[200];
  5. extern int conut_flag_1;


  6. #define in_1(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0)
  7. #define in_2(x)    x?GPIO_ResetBits(GPIOC , GPIO_Pin_1): GPIO_SetBits(GPIOC , GPIO_Pin_1)
  8. #define in_3(x)    x?GPIO_ResetBits(GPIOB , GPIO_Pin_10): GPIO_SetBits(GPIOB , GPIO_Pin_10)
  9. #define in_4(x)    x?GPIO_ResetBits(GPIOB , GPIO_Pin_11): GPIO_SetBits(GPIOB , GPIO_Pin_11)
  10. #define key_1   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)
  11. #define key_2   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)
  12. #define key_3   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)
  13. #define key_4   GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)


  14. float  Kp_l =                0.82  ; //比例常数
  15. float  Ti_l =                0.09 ; //微分时间常数
  16. float  Td_l =                0.015 ; //采样周期


  17. float  Kp_r =                0.20  ;
  18. float  Ti_r =                0.09 ;
  19. float  Td_r =                0.015 ;


  20. #define T                  0.02
  21. #define Ki_l                Kp_l*(T/Ti_l)        // Kp Ki Kd
  22. #define Kd_l                Kp_l*(Td_l/T)


  23. #define Ki_r                Kp_l*(T/Ti_l)        // Kp Ki Kd
  24. #define Kd_r                Kp_l*(Td_l/T)


  25. #define left_b in_1(1); in_2(0);
  26. #define left_f in_1(0); in_2(1);
  27. #define right_f in_3(1); in_4(0);
  28. #define right_b in_1(0); in_2(1);


  29. extern float pwm_l;
  30. extern float pwm_r;


  31. void CAR_GPIO_INIT(void);


  32. int main()
  33. {


  34. // int speed=50;
  35. SYS_CONFIG();
  36. CAR_GPIO_INIT();
  37. pwm_init(TIM3_1);
  38. pwm_init(TIM3_2);
  39. TIM4_PWMINPUT_INIT(0xffff,31);  //1M速度采样率
  40. TIM5_PWMINPUT_INIT(0xffff,31);
  41. incPIDinit();
  42.   PID_set(Kp_l,Ki_l,Kd_l,Kp_r,Ki_r,Kd_r);   
  43. //void PID_set(float pp_1,float ii_1,float dd_1,float pp_2,float ii_2,float dd_2)
  44.   right_f
  45. left_f
  46. // set_pwm_percent(TIM3_1,50) ;
  47. // set_pwm_percent(TIM3_2,50) ;
  48. PID_setpoint(&PID_l, 160);
  49. PID_setpoint(&PID_r, 160);
  50. while(1)
  51. {
  52. printf("%d\r\n",(int)pwm_l);
  53. delay_ms(200);
  54. }
  55. }
  56. void CAR_GPIO_INIT()
  57. {


  58.   GPIO_InitTypeDef GPIO_InitStructure;

  59. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);

  60. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  61. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  62.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  63. GPIO_Init(GPIOB, &GPIO_InitStructure);           

  64. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  65. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;  
  66.   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  
  67. GPIO_Init(GPIOB, &GPIO_InitStructure);        

  68. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  69. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;   
  70. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  71. GPIO_Init(GPIOC, &GPIO_InitStructure);         

  72. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  73. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;  
  74. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  75. GPIO_Init(GPIOC, &GPIO_InitStructure);         

  76. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  77. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   
  78. GPIO_Init(GPIOD, &GPIO_InitStructure);         

  79. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  80. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;  

  81. GPIO_Init(GPIOD, &GPIO_InitStructure);     
  82. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  83. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;   
  84. GPIO_Init(GPIOD, &GPIO_InitStructure);         

  85. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  86. GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;  
  87. GPIO_Init(GPIOD, &GPIO_InitStructure);   
  88. }


Bblythe 发表于 2024-5-6 07:07 | 显示全部楼层

超出 120 个字节则必须用 idata 显式的指定为间接寻址
周半梅 发表于 2024-5-6 09:03 | 显示全部楼层

靠近功率开关管或整流器的电容分到的纹波电流远多于相距较远的电容分到的纹波电流
Pulitzer 发表于 2024-5-6 10:06 | 显示全部楼层

small 模式下未指存储类型的变量默认为data型
童雨竹 发表于 2024-5-6 12:02 | 显示全部楼层

离线式变换器
Wordsworth 发表于 2024-5-6 13:05 | 显示全部楼层

一般要进行内存优化,尽量提高内存的使用效率
Clyde011 发表于 2024-5-6 14:08 | 显示全部楼层

让尽可能多的变量使用直接寻址,提高速度
公羊子丹 发表于 2024-5-6 15:01 | 显示全部楼层

经变压器映射成这么多节点
万图 发表于 2024-5-6 16:04 | 显示全部楼层

访问时采用不同的指令,所以并不会占用 RAM 空间
Uriah 发表于 2024-5-6 17:07 | 显示全部楼层

极限情况下可以定义的变量可占 247 个字节
帛灿灿 发表于 2024-5-6 19:03 | 显示全部楼层

51 单片机不使用线性编址
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

775

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部