找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10702|回复: 9
收起左侧

飞思卡尔智能车ccd光电组K60单片机程序,速度2.8m/s

  [复制链接]
ID:198134 发表于 2017-5-8 14:36 | 显示全部楼层 |阅读模式
研究目标:  通过摄像头提取道路图像,并进行图像转换与处理,利用编码器采样小车速度,研究采用双环PID控制方法对小车进行控制,使智能小车能自动探寻轨迹,并能避障快速精准运行。结合K60芯片所提供的驱动方式,我们选择了PWM(Pulse Width Modulation)控制模式来控制电机的速度。简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉冲宽度调制的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。

K60 IAR配置文件
Flash的配置:
0.png 0.png 0.png

飞思卡尔源码:
  1. /******************** (C) COPYRIGHT 2017 蓝宙电子工作室 ********************
  2. * 文件名       :main.c
  3. * 描述         :工程模版实验
  4. *
  5. * 实验平台     :landzo电子开发版
  6. * 库版本       :
  7. * 嵌入系统     :

  8. *               CCD的PIN定义   
  9.                            ADC1_SE6b   -- PTC10
  10.                            CLK_ClrVal()  PTE5_OUT = 0
  11.                            SI_SetVal()   PTE4_OUT = 1



  12. * 作者         :野火嵌入式开发工作室/landzo 蓝电子
  13. 200  200  10  0.3  0  0.3  4  1  1.5  t=15.3
  14. **********************************************************************************/

  15. #include "include.h"
  16. #include "calculation.h"


  17. /*************************
  18. 设置系统的全局变量
  19. *************************/
  20. #define M                          1   // 8       // 10     //差速参数关系
  21. #define W                          13.8    //车宽
  22. #define L                          40    //车长的两倍------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  23. #define SteeringEngine_mid         120
  24. #define SteeringEngine_Max         135//136
  25. #define SteeringEngine_Min         103//103(106很好)

  26. #define Motor_n_max               700
  27. #define Motor_n_min               100
  28. extern float K; //1.5// 2.3      //差速参数关系


  29. extern s16 Motor_n_Direct  ;//450; //250; //250;//305;    //直道转速
  30. extern s16 Motor_n_Curve_1 ; //400;// 250;// 250;//305 ;    //弯道转速
  31. extern s16 Motor_n_Curve_2; //350;// 250;// 250;//305 ;    //弯道转速
  32. extern s16 Motor_n_Curve_3 ;//300;// 250;// 250;//305 ;    //弯道转速

  33. extern u8 TIME0flag_5ms   ;
  34. extern u8 TIME0flag_10ms  ;
  35. extern u8 TIME0flag_15ms  ;
  36. extern u8 TIME0flag_20ms  ;
  37. extern u8 TIME1flag_20ms ;
  38. extern u8 TIME1flag_1ms ;

  39. extern u8 TimerFlag20ms;


  40. u16 pwm_l=0;
  41. u16 pwm_r=0;
  42. extern u16 pwmtest_l;
  43. extern u16 pwmtest_r;//左右轮pwm计数值
  44. u16 pwmset_l;
  45. u16 pwmset_l;
  46. u16 Motor_Pwm=0;
  47. s16 Motor_Pwm_l;
  48. s16 Motor_Pwm_r;  //左右轮速度设定值(PWM占空比)
  49. u16 Motor_n;
  50. extern u16 Motor_n_l;
  51. extern u16 Motor_n_r;  //左右轮转速设定值(相对编码器)

  52. u8 AtemP ;
  53. u8 Pixel[128];

  54. s16 bai_dian_sum=0;
  55. s16 bai_dian_num=0;
  56. s16 bai_dian_num_l=0;
  57. s16 bai_dian_num_r=0;
  58. s16 hei_dian_num_l=0;
  59. s16 hei_dian_num_r=0;

  60. s32 Center;
  61. s32 Center_car=68;//64+4;
  62. u8  FAVAULE;
  63. u8 FAVAULE_max;
  64. u8 FAVAULE_min;


  65. extern float SteeringEngine_Kp;
  66. extern float SteeringEngine_Ki;
  67. extern float SteeringEngine_Kd;
  68. extern float A1;
  69. extern float SteeringEngine_Kp_W;
  70. extern float SteeringEngine_Ki_W;
  71. extern float SteeringEngine_Kd_W;
  72. extern float A1_W;
  73. s32 e[3]={0 , 0 , 0};
  74. //s32 e_flag[150]={0};
  75. u8 e_flag_sum;
  76. s16 SteeringEngine_e ;

  77. extern float Motor_Kp;
  78. extern float Motor_Ki;
  79. extern float Motor_Kd;
  80. s16 e_n[3]={0 , 0 , 0};
  81. s16 e_l[3]={0 , 0 , 0};
  82. s16 e_r[3]={0 , 0 , 0};


  83. u16 SteeringEngine= 120;

  84. float tan_a;
  85. u8 W_flag;
  86. u8 L_flag;
  87. u8 R_flag;


  88. void main()
  89. {
  90.     u8 i ,n=0 ;
  91.    int sign(),abs();
  92. // u8 Pixel_pt[128];  

  93.    
  94.    //u8 send_data_cnt = 0;   
  95.   DisableInterrupts;                             //禁止总中断
  96.    
  97.   /*********************************************************
  98.   初始化程序
  99.   *********************************************************/
  100.    //自行添加代码

  101.    uart_init (UART3, 115200);                      //初始化UART3,输出脚PTC17,输入脚PTC16,串口频率 115200

  102.   //  adc_init(ADC1, AD6a) ;
  103.    
  104.    gpio_init (PORTB,4, GPI_UP,1);
  105.    gpio_init (PORTB,5, GPI_UP,1);
  106.    gpio_init (PORTB,6, GPI_UP,1);                      //PORTB4、5、6连接拨码开关
  107.   
  108.   // pit_init_ms(PIT0, 5);                                    //初始化PIT0,定时时间为: 5ms
  109.    pit_init(PIT1, 10000);                                   //初始化PIT1,定时时间为: 0.2ms
  110.    
  111.    CCD_init1() ;             //CCD传感器初始化

  112.    
  113.    FTM_PWM_init(FTM0, CH0, 10000, 0);               //电机PTC1
  114.    FTM_PWM_init(FTM0, CH1, 10000, 0);               //电机PTC2
  115.    FTM_PWM_init(FTM0, CH2, 10000, 0);               //电机PTC3
  116.    FTM_PWM_init(FTM0, CH3, 10000, 0);               //电机PTC4
  117.    
  118.    gpio_init (PORTA,17,GPI,1);                     //编码器正反转状态
  119.    gpio_init (PORTA,19,GPI,1);                     //编码器正反转状态
  120.    gpio_Interrupt_init(PORTA,8, GPI_DOWN, RING) ;         
  121.    gpio_Interrupt_init(PORTA,9, GPI_DOWN, RING) ;
  122.    
  123.    FTM_PWM_init(FTM2,CH0,100,120);        //舵机占空比初始化 PTA10
  124.    
  125.    /*****拨码开关模式选择*****/
  126.    switch_init();

  127.    EnableInterrupts;                                            //开总中断  
  128.    
  129.    /******************************************
  130.     执行程序
  131.     ******************************************/
  132.     while(1)
  133.     {
  134.       if(TIME1flag_20ms == 1)
  135.       {
  136.         TIME1flag_20ms = 0 ;
  137.      //   uart_putchar(UART0,0xff) ;
  138.         /* Sampling CCD data */
  139.         ImageCapture(Pixel);
  140.         /* Send data to CCDView every 100ms */
  141.         /************阈值确定*******************/
  142.         
  143.         FAVAULE_max= 0;
  144.         FAVAULE_min= 254;
  145.         for(i=5;i<123;i++)
  146.         {
  147.           if(Pixel[i]>254) {Pixel[i]=254;}    //去反光点
  148.           if(Pixel[i]<FAVAULE_min){FAVAULE_min=Pixel[i];}
  149.           if(Pixel[i]>FAVAULE_max){FAVAULE_max=Pixel[i];}
  150.         }
  151.        if(FAVAULE_max-FAVAULE_min > 80)
  152.              FAVAULE=(FAVAULE_min+FAVAULE_max)>>1;
  153. //   FAVAULE=(FAVAULE_min+FAVAULE_max)/2;
  154.       
  155.        /********二值化,并进行白点计算***********/
  156.     /* for(i=0; i<128; i++)
  157.         {
  158.           if(Pixel[i]>=FAVAULE)
  159.           {
  160.             Pixel_pt[i]=254;
  161.            bai_dian_sum+=i;
  162.            bai_dian_num++;
  163.           }else
  164.             Pixel_pt[i]=0;
  165.         }      
  166.      */
  167.         /* Send data to CCDView every 100ms发送数据 */\
  168.       // SendImageData(Pixel);// _pt);
  169.         
  170.         
  171.    
  172.    
  173.         
  174.        /**********
  175.         计算黑线位置
  176.         **********/  
  177.         bai_dian_sum=0;
  178.         bai_dian_num=0;
  179.         bai_dian_num_l=0;
  180.         bai_dian_num_r=0;
  181.         hei_dian_num_l=0;
  182.         hei_dian_num_r=0;
  183.         for(i=5;i<64;i++)
  184.         {
  185.           if(Pixel[i]>FAVAULE)
  186.           {
  187.           bai_dian_sum+=i;
  188.           bai_dian_num_l++;
  189.           }else{
  190.           hei_dian_num_l++;
  191.           }
  192.         }
  193.         for(i=64;i<123;i++)
  194.         {
  195.           if(Pixel[i]>FAVAULE)
  196.           {
  197.           bai_dian_sum+=i;
  198.           bai_dian_num_r++;
  199.           }else{
  200.           hei_dian_num_r++;
  201.           }
  202.         }
  203.         bai_dian_num=bai_dian_num_l+bai_dian_num_r;
  204.        if(bai_dian_num < 96)
  205.        {
  206.         if(bai_dian_num_l>bai_dian_num_r)
  207.         {
  208.           L_flag=1;
  209.           R_flag=0;
  210.         }
  211.          if(bai_dian_num_l<bai_dian_num_r)
  212.         {
  213.           L_flag=0;
  214.           R_flag=1;
  215.         }
  216.        }
  217.        /*
  218.         if(bai_dian_num > 96)   //十字路口处理
  219.         {        
  220.           Array_Shift( e ,3 );
  221.           e[2] = hei_dian_num_l-hei_dian_num_r;


  222. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整资料打包下载:
2016程序设计12.rar (10.79 MB, 下载次数: 212)

评分

参与人数 1黑币 +5 收起 理由
LQL-LQL + 5 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:636560 发表于 2019-11-6 10:45 | 显示全部楼层
好精彩,谢谢楼主
回复

使用道具 举报

ID:378347 发表于 2019-7-22 16:51 | 显示全部楼层
好评,好资料!!!!!
回复

使用道具 举报

ID:338175 发表于 2019-3-10 17:50 | 显示全部楼层
谢谢啦,准备学习哈哈哈
回复

使用道具 举报

ID:411857 发表于 2018-10-18 18:38 | 显示全部楼层
很好的资料 ,很有参考价值
回复

使用道具 举报

ID:343556 发表于 2018-10-7 23:28 来自手机 | 显示全部楼层
很好的资料,正需要
回复

使用道具 举报

ID:378747 发表于 2018-7-24 23:44 | 显示全部楼层
好资料,51黑精彩!!!
回复

使用道具 举报

ID:378747 发表于 2018-7-24 23:44 | 显示全部楼层

好资料,51黑精彩!!!
回复

使用道具 举报

ID:262613 发表于 2018-5-29 00:52 | 显示全部楼层
好资料,51黑精彩!!!
回复

使用道具 举报

ID:1 发表于 2017-5-18 03:00 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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