智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 795|回复: 0
打印 上一主题 下一主题

舵机加了PD算法之后就没反应了,去了PD就能转,求大神

[复制链接]

24

主题

70

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2252
威望
1149
贡献
673
兑换币
719
注册时间
2015-11-29
在线时间
215 小时
毕业学校
理工大学
跳转到指定楼层
1#
发表于 2016-1-18 10:02:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "common.h"
  2. #include "include.h"
  3. //舵机相关
  4. #define S3010_TPM   TPM1         
  5. #define S3010_CH    TPM_CH0       //  PTB0
  6. #define S3010_HZ    (50)
  7. uint8 CCD_BUFF[TSL1401_SIZE];   //存储CCD图像的数组
  8. uint8 s3010_middle = 73;  //舵机中心值:对应的PWM占空比为(73/1000)  精度为1000u
  9. uint8 picture_middle = 64;//图像中心值
  10. uint8 leftline = 1;    //赛道左边界
  11. uint8 rightline = 127;   //赛道右边界
  12. struct s3010_pid        //舵机PD控制
  13. {
  14.         int err; //定义偏差值
  15.         int err_last; //定义上一个偏差值
  16.         float Kp; //定义比例系数
  17.         float Kd;//定义微分系数
  18. }pid;

  19. void PIT_IRQHandler();
  20. void vcan_sendccd(uint8 *ccdaddr, uint32 ccdsize);
  21. void bin(uint8 * bin, uint8 len);

  22. void  main(void)
  23. {
  24.     uint8 time = 5;            // 修改 PIT0 的定时时间即可修改曝光时间
  25.     uint32 s3010_pwm = s3010_middle;
  26.     int h = 0;

  27.     tsl1401_set_addrs(TSL1401_MAX,CCD_BUFF);        //初始化线性CCD
  28.     tsl1401_init(time);                         //初始化 线性CCD ,配置 中断时间为 time

  29.     //配置 中断函数 和 使能中断
  30.     set_vector_handler(PIT_VECTORn,PIT_IRQHandler);
  31.     enable_irq(PIT_IRQn);

  32.     tpm_pwm_init(S3010_TPM, S3010_CH,S3010_HZ,73);      //初始化 舵机 PWM
  33.     void PID_init();         //舵机PD算法初始化
  34.     uint32 PID_realize(int x);//舵机PD实现初始化
  35.     while(1)
  36.     {  

  37.         tsl1401_get_img();//采集 线性CCD 图像      
  38.         bin((uint8 *)&CCD_BUFF[0], TSL1401_SIZE);  //处理图像,找赛道边界
  39.           
  40.         //如果把下面改成tpm_pwm_duty(S3010_TPM, S3010_CH,70);这之类的舵机能转,
  41.         //但是如果是下面的就不能转
  42.         h = 64 - picture_middle;
  43.         s3010_pwm = PID_realize( h );
  44.         tpm_pwm_duty(S3010_TPM, S3010_CH,s3010_pwm);
  45.         DELAY_MS(200);
  46.   
  47.         vcan_sendccd((uint8 *)&CCD_BUFF[0],TSL1401_SIZE);//给上位机发送数据
  48.    
  49.     }
  50. }
  51. void bin(uint8 * bin, uint8 len)
  52. {
  53.     uint8 i;
  54.    
  55.     for(i=10;i<63;i++)
  56.     {
  57.         if(ABS(bin[i - 1]-bin[i]) >= 80)
  58.         {
  59.             leftline = i;
  60.             break;
  61.         }
  62.     }
  63.     for(i=111;i>64;i--)
  64.     {
  65.         if(ABS(bin[i + 1]-bin[i]) >= 80)
  66.         {
  67.             rightline = i;
  68.             break;
  69.         }
  70.     }
  71. #if 0
  72.     for(i = leftline; i < rightline; i++)
  73.     {
  74.         bin[i] = 255;
  75.     }
  76. #endif
  77.     picture_middle = (uint8)((leftline + rightline) / 2);
  78.     bin[picture_middle] = 0;
  79. }
  80. //   PIT中断服务函数     由于 TSL1401_INT_TIME 配置 为 PIT0 ,因而使用 PIT0
  81. void PIT_IRQHandler()
  82. {
  83.     if(PIT_TFLG(PIT0) == 1 )        //判断是否 PIT0 进入中断
  84.     {
  85.         tsl1401_time_isr();
  86.         PIT_Flag_Clear(PIT0);
  87.     }
  88. }
  89. //发送图像到上位机显示   不同的上位机,不同的命令
  90. void vcan_sendccd(uint8 *ccdaddr, uint32 ccdsize)
  91. {
  92. #define CMD_CCD     2
  93.     uint8 cmdf[2] = {CMD_CCD, ~CMD_CCD};    //开头命令
  94.     uint8 cmdr[2] = {~CMD_CCD, CMD_CCD};    //结尾命令

  95.     uart_putbuff(VCAN_PORT, cmdf, sizeof(cmdf));    //先发送命令

  96.     uart_putbuff(VCAN_PORT, ccdaddr, ccdsize); //再发送图像

  97.     uart_putbuff(VCAN_PORT, cmdr, sizeof(cmdr));    //再发送命令
  98. }
  99. void PID_init()
  100. {
  101.         pid.err=0;
  102.         pid.err_last=0;
  103.         pid.Kp=0.7;
  104.         pid.Kd=0.3;
  105. }
  106. uint32 PID_realize(int x) //x为距离中间的偏差
  107. {
  108.         uint8 out;   
  109.         pid.err = x;
  110.         out = (uint8)(s3010_middle + pid.err * pid.Kp + (pid.err - pid.err_last) * pid.Kd);        
  111.         pid.err_last = pid.err;       
  112.         return out;
  113. }
复制代码
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 19:51 , Processed in 0.047978 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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