找回密码
 立即注册

QQ登录

只需一步,快速开始

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

飞思卡尔K60dz电磁直立车程序

[复制链接]
跳转到指定楼层
楼主
ID:483530 发表于 2019-3-3 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
别人的程序分享一下
电磁直立省二完整程序,预赛发挥失常,开源散经验,仅供参考,大神勿喷。芯片K60dz,程序基于野火5.0库,control.c:直立环、速度环、方向环的控制与整合、电机控制; tiaocan.c:按键调参、可设置所有PID参数、陀螺仪中值、设定速度、电感归一化; main.c:蓝牙发送数据、oled显示电感值、干簧管停车、5次1毫秒中断

单片机源程序如下:
  1. /*
  2. *     底层库:基于野火5.0库开发
  3. *     作者:北华航天工业学院 秋明山车神队
  4. *     注意:未经作者允许,请勿用于商业,可以任意转载,但请保留作者原创
  5. *     
  6. */

  7. /***************************************************************/
  8. #include "common.h"
  9. #include "include.h"
  10. /**************************************************************/

  11. extern float Gyro_Now,g_fCarAngle;
  12. extern float OutData[4];                                                    //SCI示波器参数
  13. extern float Gyro_Now,angle_offset_vertical;                                //陀螺仪转化后的角速度,转化后的加速度角度
  14. extern float g_fCarAngle,g_fGyroscopeAngleIntegral;                         //融合后的角度
  15. extern volatile int     MMA7361 ,ENC03,real_angle;                          //加速度计AD ,陀螺仪AD,模块输出的角度
  16. extern void PIT0_IRQHandler(void);
  17. extern   void OutPut_Data(void);                                             //SCI采参数


  18. void main()
  19. {
  20.     DisableInterrupts;                                                        //禁止总中断
  21.     LCD_Init();                                                               //显示屏初始化
  22.     GYRO_VAL=flash_read(255, 0, uint16);
  23.     GYRO2_VAL=flash_read(254, 0, uint16);
  24.     led_Init();                                                               //LED初始化
  25.     adc_Init();                                                               //ad采集初始化
  26.     QD_Init();                                                                //编码器初始化
  27.     uart_init (UART1, 115200);                                                //蓝牙初始化
  28.     Key_Init();                                                               //按键初始化
  29.     //flash_init();                                                           //FLASH不要初始化
  30.     gpio_init (PTA4, GPI,0);                                                  //PTA4设置下拉
  31.     port_init (PTA4, PULLDOWN );
  32.     FTM_PWM_init(FTM0, FTM_CH1,10000,0);
  33.     FTM_PWM_init(FTM0, FTM_CH2,10000,0);
  34.     FTM_PWM_init(FTM0, FTM_CH3,10000,0);
  35.     FTM_PWM_init(FTM0, FTM_CH4,10000,0);
  36.     FTM_PWM_Duty(FTM0,FTM_CH1,0);
  37.     FTM_PWM_Duty(FTM0,FTM_CH2,0);
  38.     FTM_PWM_Duty(FTM0,FTM_CH3,0);
  39.     FTM_PWM_Duty(FTM0,FTM_CH4,0);
  40.     pit_init_ms(PIT0, 1);                                                    //初始化PIT0,定时时间为: 5ms
  41.     set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);                       //设置PIT0的中断复位函数为 PIT0_IRQHandler
  42.     enable_irq (PIT0_IRQn);                                                  //使能PIT0中断
  43.     DELAY_MS(1000);
  44.     EnableInterrupts;                                                        //中断允许
  45.    
  46.     while(1)
  47.    {
  48.      Key();
  49.      
  50.        /*#if 1
  51.         OutData[0] = g_fDirectionControlOut;
  52.         OutData[1] = g_fCarSpeednew;
  53.         OutData[2] = g_fCarSpeedleft;
  54.         OutData[3] = g_fCarSpeedright;*/
  55.      
  56.      
  57. /*        #if 1
  58.         OutData[0] = 1000*(AD[0]-AD[3])/(AD[0]+AD[3]);
  59.         OutData[1] = 1000*(AD[1]-AD[2])/(AD[1]+AD[2]);
  60.         OutData[2] = 1000*(AD[0]-AD[3]);
  61.         OutData[3] = 1000*(AD[0]+AD[3]);
  62.         
  63.         OutPut_Data();
  64.         #endif
  65. */      
  66. /*        
  67.         #if 1     //直立角度
  68.         OutData[0] = ENC03;
  69.         OutData[1] = MMA7361;
  70.         OutData[2] = angle_offset_vertical ;
  71.         OutData[3] = g_fCarAngle;
  72.         OutPut_Data();
  73.         #endif
  74. */        
  75.         
  76. /*       #if 1     //车速
  77.         OutData[0] = g_fSpeedControlIntegral;
  78.         OutData[1] = (g_fSpeedControlOutNew-g_fSpeedControlIntegral);
  79.         OutData[2] = g_fCarSpeednew ;
  80.         OutData[3] = 10*CAR_SPEED_SET;
  81.         OutPut_Data();
  82.         #endif
  83.       */  
  84.         
  85.         /*#if 1     //车速
  86.         OutData[0] = g_fSpeedControlIntegral;
  87.         OutData[1] = bianhualeft;
  88.         OutData[2] =  bianhuaright;
  89.         OutData[3] = g_fCarSpeednew;
  90.         OutPut_Data();
  91.         #endif*/
  92.         

  93.       if(Star_flag==0&&g_nInterrupt_Count==2)  
  94.       {
  95.      LCD_Fill(0x00);  //初始清屏
  96.      LCD_PrintU16(0,0,AD_average[0]);
  97.      LCD_PrintU16(32,0,AD_average[1]);
  98.      LCD_PrintU16(64,0,AD_average[2]);
  99.      LCD_PrintU16(96,0,AD_average[3]);
  100.      LCD_PrintU16(0,2,AD[0]);
  101.      LCD_PrintU16(32,2,AD[1]);
  102.      LCD_PrintU16(64,2,AD[2]);
  103.      LCD_PrintU16(96,2,AD[3]);
  104.      LCD_PrintFloat(50,4,g_fCarAngle);
  105.       }

  106.    }
  107. }

  108. /**********************中断服务程序*******************/
  109. void PIT0_IRQHandler(void)
  110. {

  111.   DisableInterrupts;

  112.   if(jishu>=8000)                                                            //干簧管检测延时
  113.   {
  114.     jishu=8000;
  115.     led(LED5,LED_ON);      
  116.     if(key_check(KEY_STOP) ==  KEY_DOWN)                                     //干簧管停车
  117.     {
  118.       KEY_START_flag=0;                                                      //调参界面复位
  119.       Star_flag=50;                                                          //电机停转
  120.       led(LED4,LED_ON);        
  121.     }   
  122.   }
  123.   
  124.   if(KEY_START_flag>=5)                                                      //调参界面5开始中断计数,干簧管延时
  125.   {jishu++;
  126.   }
  127.   
  128.   g_nInterrupt_Count++;                                                       //一堆计数
  129.   g_nSpeedControlPeriod++;
  130.   SpeedControlOutput();                                                       //一堆平滑输出
  131.   g_nDirectionControlPeriod++;
  132.   DirectionControlOutput() ;
  133.   
  134.   if(g_nInterrupt_Count>=5)                                                   //三个环控制
  135.   {
  136.     GetMotorPulse();
  137.     g_nInterrupt_Count=0;
  138.   }
  139.   else
  140.     if(g_nInterrupt_Count==1)
  141.     {
  142.       Get_AD_data();
  143.       Rd_Ad_Value();
  144.     }
  145.   else
  146.     if(g_nInterrupt_Count==2)
  147.     {
  148.       AngleCalculate();
  149.       AngleControl(g_fCarAngle,Gyro_Now);
  150.       MotorOutput();
  151.       led_turn (LED1);
  152.     }
  153.   else
  154.     if(g_nInterrupt_Count==3)
  155.     {
  156.       g_nSpeedControlCount++;
  157.       if(g_nSpeedControlCount>=20)
  158.       {
  159.         led_turn (LED2);
  160.         SpeedControl();
  161.         g_nSpeedControlCount=0;
  162.         g_nSpeedControlPeriod=0;
  163.       }
  164.     }
  165.   else
  166.     if(g_nInterrupt_Count==4)
  167.     {
  168.       g_nDirectionControlCount++;
  169.       DirectionVoltageSigma();
  170.       if(g_nDirectionControlCount>=2)
  171.       {
  172.         DirectionControl();
  173.         g_nDirectionControlCount=0;
  174.         g_nDirectionControlPeriod=0;
  175.       }
  176.    
  177.     }
  178.     PIT_Flag_Clear(PIT0);                                                    //清中断标志位
  179.     EnableInterrupts;
  180. }
复制代码

所有资料51hei提供下载:
smart_car-16.7.20.7z (785.66 KB, 下载次数: 88)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:484376 发表于 2019-3-5 09:29 | 只看该作者
这个黑科技不错,如果能把硬件材料明细标出来就完美了
回复

使用道具 举报

板凳
ID:467749 发表于 2019-3-8 14:18 | 只看该作者
不错,下下来学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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