智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 921|回复: 2
打印 上一主题 下一主题

舵机加上PD控制后就不转了,去掉之后就能转

[复制链接]

24

主题

70

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2252
威望
1149
贡献
673
兑换币
719
注册时间
2015-11-29
在线时间
215 小时
毕业学校
理工大学
跳转到指定楼层
1#
发表于 2016-1-18 14:26:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  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,s3010_pwm);这之类的,舵机就能转
  41.         h = 64 - picture_middle;
  42.         s3010_pwm = PID_realize( h );
  43.         tpm_pwm_duty(S3010_TPM, S3010_CH,s3010_pwm);
  44.         DELAY_MS(200);
  45.   
  46.         vcan_sendccd((uint8 *)&CCD_BUFF[0],TSL1401_SIZE);//给上位机发送数据
  47.    
  48.     }
  49. }
  50. void bin(uint8 * bin, uint8 len)
  51. {
  52.     uint8 i;
  53.    
  54.     for(i=10;i<63;i++)
  55.     {
  56.         if(ABS(bin[i - 1]-bin[i]) >= 80)
  57.         {
  58.             leftline = i;
  59.             break;
  60.         }
  61.     }
  62.     for(i=111;i>64;i--)
  63.     {
  64.         if(ABS(bin[i + 1]-bin[i]) >= 80)
  65.         {
  66.             rightline = i;
  67.             break;
  68.         }
  69.     }
  70. #if 0
  71.     for(i = leftline; i < rightline; i++)
  72.     {
  73.         bin[i] = 255;
  74.     }
  75. #endif
  76.     picture_middle = (uint8)((leftline + rightline) / 2);
  77.     bin[picture_middle] = 0;
  78. }
  79. //   PIT中断服务函数     由于 TSL1401_INT_TIME 配置 为 PIT0 ,因而使用 PIT0
  80. void PIT_IRQHandler()
  81. {
  82.     if(PIT_TFLG(PIT0) == 1 )        //判断是否 PIT0 进入中断
  83.     {
  84.         tsl1401_time_isr();
  85.         PIT_Flag_Clear(PIT0);
  86.     }
  87. }
  88. //发送图像到上位机显示   不同的上位机,不同的命令
  89. void vcan_sendccd(uint8 *ccdaddr, uint32 ccdsize)
  90. {
  91. #define CMD_CCD     2
  92.     uint8 cmdf[2] = {CMD_CCD, ~CMD_CCD};    //开头命令
  93.     uint8 cmdr[2] = {~CMD_CCD, CMD_CCD};    //结尾命令

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

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

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


回复

使用道具 举报

24

主题

70

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2252
威望
1149
贡献
673
兑换币
719
注册时间
2015-11-29
在线时间
215 小时
毕业学校
理工大学
2#
 楼主| 发表于 2016-1-24 12:15:18 | 只看该作者
顶起:)
回复 支持 反对

使用道具 举报

24

主题

70

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2252
威望
1149
贡献
673
兑换币
719
注册时间
2015-11-29
在线时间
215 小时
毕业学校
理工大学
3#
 楼主| 发表于 2016-1-24 15:30:01 | 只看该作者
再顶
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-2 06:43 , Processed in 0.039115 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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