找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3347|回复: 1
收起左侧

瑞萨RL78/G13单片机风力摇摆控制系统程序设计

[复制链接]
ID:575110 发表于 2019-6-30 17:41 | 显示全部楼层 |阅读模式
0.png
风力摇摆控制系统源代码

单片机源程序如下:
  1. /***********************************************************************************************************************
  2. * File Name    : r_main.c
  3. * Version      : CodeGenerator for RL78/G13 V2.00.00.07 [22 Feb 2013]
  4. * Device(s)    : R5F100LG
  5. * Tool-Chain   : CA78K0R
  6. * Description  : This file implements main function.
  7. * Creation Date: 2015/8/15
  8. ***********************************************************************************************************************/

  9. /***********************************************************************************************************************
  10. Pragma directive
  11. ***********************************************************************************************************************/
  12. /* Start user code for pragma. Do not edit comment generated here */
  13. /* End user code. Do not edit comment generated here */

  14. /***********************************************************************************************************************
  15. Includes
  16. ***********************************************************************************************************************/
  17. #include "r_cg_macrodriver.h"
  18. #include "r_cg_cgc.h"
  19. #include "r_cg_port.h"
  20. #include "r_cg_serial.h"
  21. #include "r_cg_timer.h"
  22. #include "r_cg_pclbuz.h"
  23. /* Start user code for include. Do not edit comment generated here */
  24. #include "r_cg_KeyScan.h"
  25. #include "r_cg_lcd.h"
  26. #include "Delay.h"
  27. #include "pid.h"
  28. /* End user code. Do not edit comment generated here */
  29. #include "r_cg_userdefine.h"

  30. /***********************************************************************************************************************
  31. Global variables and functions
  32. ***********************************************************************************************************************/
  33. /* Start user code for global. Do not edit comment generated here */
  34. #define  ZHENG_1   P5.0 //电机各信号线定义
  35. #define  FAN_1     P5.1
  36. #define  ZHENG_2   P5.2
  37. #define  FAN_2     P5.3
  38. #define  ZHENG_3   P5.4
  39. #define  FAN_3     P5.5
  40. #define  ZHENG_4   P6.0
  41. #define  FAN_4     P6.1
  42. #define  PWM_1           TDR06
  43. #define  PWM_2           TDR07
  44. #define  PWM_3           TDR04
  45. #define  PWM_4           TDR05

  46. int nRight_x;
  47. int nRight_y;
  48. float  x_angle,y_angle,x_anglespeed,y_anglespeed,y_anglejiasu;

  49. int expect_x_angle=0;
  50. int expect_y_angle=0;

  51. float  k_angle=1.8;     //4__ 3.0 0.5
  52. float  k_angle_dot=0.13;
  53. float  k_angle_jiasu=1;
  54. float  k;
  55. float  k_angle_dot_x,x_anglejiasu=1;
  56. unsigned int  set_angle;
  57. extern double Acceleration[3]; //加速度
  58. extern double AngularAcceleration[3]; //速度
  59. extern double Angle[3];//角度
  60. extern volatile unsigned char  num_keyboard;
  61. unsigned char key_1,key_2,key_3,key_4,key_5,key_6,key_7,key_8,key_9;
  62. void MotorSpeedOut_x(int i);
  63. void MotorSpeedOut_y(int i);
  64. void CarAngleAdjust_x(void);
  65. void CarAngleAdjust_y(void);
  66. extern void BUZZ(void);
  67. void CarAngleAdjust_y_2(void);
  68. void CarAngleAdjust_x_2(void);
  69. /* End user code. Do not edit comment generated here */
  70. void R_MAIN_UserInit(void);

  71. /***********************************************************************************************************************
  72. * Function Name: main
  73. * Description  : This function implements main function.
  74. * Arguments    : None
  75. * Return Value : None
  76. ***********************************************************************************************************************/
  77. void main(void)
  78. {
  79.     R_MAIN_UserInit();
  80.     /* Start user code. Do not edit comment generated here */
  81.     lcd_init();
  82.     R_UART0_Start();
  83.     while (1U)
  84. {         lcd_display(0,"                "
  85.                            "    Welcome     ");       
  86.                        BUZZ();
  87.                        BUZZ();
  88.                        BUZZ();
  89.             while(Keyboard_scan()!=11);
  90.                         BUZZ();
  91.         while(Keyboard_scan()==11);
  92.          lcd_display(0,"please set mode "
  93.                            "      _____     ");
  94.         while(Keyboard_scan()>16||Keyboard_scan()<1);
  95.                         BUZZ();
  96.                      key_1=num_keyboard;
  97.         while(Keyboard_scan()!=0);
  98.        
  99.         lcd_write_number(24,key_1);
  100.         while(Keyboard_scan()!=11);
  101.                         BUZZ();
  102.         while(Keyboard_scan()==11);
  103.         if(key_1==1)
  104.         {         lcd_display(0,"     starting   "
  105.                                    "      __1__     ");
  106.              R_TAU0_Channel0_Start();
  107.              k_angle=0.65;     //4__ 3.0 0.5
  108.              k_angle_dot=0.06;
  109.              k_angle_jiasu=8.0;
  110.                       
  111.                   PWM_3=23100;
  112.                   while(Angle[1]>-8.5);
  113.                   PWM_3=0;
  114.                   while(Keyboard_scan()!=12)
  115.                  {   
  116.                   expect_y_angle=-8;
  117.                   y_angle=Angle[1];
  118.                   y_anglespeed=AngularAcceleration[1];
  119.                   y_anglejiasu=Acceleration[1];
  120.                   CarAngleAdjust_y_2();
  121.                  }
  122.                  R_TAU0_Channel0_Stop();
  123.        
  124.         }
  125.         else if(key_1==2)
  126.         {         lcd_display(0,"     set cent   "
  127.                                    "        __CM    ");
  128.                 while(Keyboard_scan()>6||Keyboard_scan()<3);
  129.                 BUZZ();
  130.                 key_2=num_keyboard;
  131.                 while(Keyboard_scan()!=0);
  132.                 lcd_write_number(24,key_2);
  133.                 while(Keyboard_scan()>10||Keyboard_scan()<1);
  134.                 BUZZ();
  135.                 key_3=num_keyboard;
  136.                 if(key_3==10){key_3=0;}
  137.                 while(Keyboard_scan()!=0);
  138.                 lcd_write_number(25,key_3);
  139.                 while(Keyboard_scan()!=11);
  140.                 BUZZ();
  141.                 while(Keyboard_scan()==11);
  142.                 lcd_display(0,"      set  K    "
  143.                                   "       40_._     ");
  144.                 while(Keyboard_scan()>10||Keyboard_scan()<1);
  145.                 BUZZ();
  146.                 key_5=num_keyboard;
  147.                 if(key_5==10){key_5=0;}
  148.                 while(Keyboard_scan()!=0);
  149.                 lcd_write_number(25,key_5);
  150.                 while(Keyboard_scan()>10||Keyboard_scan()<1);
  151.                 BUZZ();
  152.                 key_6=num_keyboard;
  153.                 if(key_6==10){key_6=0;}
  154.                 while(Keyboard_scan()!=0);
  155.                 lcd_write_number(27,key_6);
  156.                 k=400+key_5+key_6*0.1;
  157.                 while(Keyboard_scan()!=11);
  158.                 BUZZ();
  159.                 while(Keyboard_scan()==11);
  160.                 lcd_display(0,"     starting   "
  161.                                   "      __2__     ");
  162.             /*********************2*********************/
  163.              key_4=key_2*10+key_3;
  164.              R_TAU0_Channel0_Start();
  165.              k_angle=0.65;     //4__ 3.0 0.5
  166.              k_angle_dot=0.0001*key_4*key_4-0.013*key_4+0.48;
  167.              k_angle_jiasu=8.0;
  168.              
  169.                 //  PWM_3=12000; //30
  170.                   //  PWM_3=14400;// 35
  171.                 //  PWM_3=16000;// 40
  172.                 //PWM_3=17200;// 45
  173.                 // PWM_3=20400;//50
  174.                  //PWM_3 = 22000;// 55
  175.                 // PWM_3=23500;  //60
  176.                  
  177.                   PWM_3=k*key_4-121;
  178.                   while(Angle[1]>-8.5);
  179.                   PWM_3=0;
  180.                   while(Keyboard_scan()!=12)
  181.                  {   
  182.                   expect_y_angle=-8;
  183.                   y_angle=Angle[1];
  184.                   y_anglespeed=AngularAcceleration[1];
  185.                   y_anglejiasu=Acceleration[1];
  186.                   CarAngleAdjust_y_2();
  187.                  }
  188.                  R_TAU0_Channel0_Stop();
  189.        
  190.         }
  191.         else if(key_1==3)
  192. {                
  193.                 lcd_display(0,"    set  angle   "
  194.                                   "       __0       ");
  195.                 while(Keyboard_scan()!=1 &&Keyboard_scan()!=10);
  196.                 BUZZ();
  197.                 key_7=num_keyboard;
  198.                 if(key_7==10){key_7=0;}
  199.                 while(Keyboard_scan()!=0);
  200.                 lcd_write_number(24,key_7);
  201.                 while(Keyboard_scan()>8||Keyboard_scan()<1 && Keyboard_scan()!=10);
  202.                 BUZZ();
  203.                 key_8=num_keyboard;
  204.                 while(Keyboard_scan()!=0);
  205.                 if(key_8==10){key_8=0;}               
  206.                 lcd_write_number(25,key_8);
  207.                 while(Keyboard_scan()!=11);
  208.                 BUZZ();
  209.                 while(Keyboard_scan()==11);
  210.                 set_angle=key_7*100+key_8*10;
  211.                  lcd_display(0,"     starting   "
  212.                                    "      __3__     ");
  213.      /*******************3******************************/
  214.              R_TAU0_Channel0_Start();
  215.              if(set_angle<45)
  216.         {
  217.              k_angle=0.65;     
  218.              k_angle_dot=0.24; //1
  219.              k_angle_jiasu=8.0;       
  220.              k_angle_dot_x=-0.0042*(float)set_angle+0.41; //2
  221.              PWM_3=12000;
  222.              PWM_1=185.9*set_angle+1328; //3
  223.              while(Angle[1]>-5.5);
  224.              PWM_3=0;
  225.              PWM_1=0;
  226.              while(Keyboard_scan()!=12)
  227.              {   
  228.                   expect_y_angle=-8;
  229.                   expect_x_angle=-8;
  230.                   y_angle=Angle[1];
  231.                   y_anglespeed=AngularAcceleration[1];
  232.                   y_anglejiasu=Acceleration[1];
  233.                   x_angle=Angle[0];
  234.                   x_anglespeed=AngularAcceleration[0];
  235.                   x_anglejiasu=Acceleration[0];
  236.                   CarAngleAdjust_y_2();
  237.                   CarAngleAdjust_x_2();
  238.                  }
  239.              }
  240.              else if (set_angle>45 && set_angle<91)
  241.              {
  242.              set_angle=90-set_angle;
  243.              k_angle=0.65;     
  244.              k_angle_dot=0.185; //1
  245.              k_angle_jiasu=8.0;       
  246.              k_angle_dot_x=-0.0042*(float)set_angle+0.41; //2
  247.              PWM_3=194*set_angle+4388;
  248.              PWM_1=12000; //3
  249.              while(Angle[0]>-5.5);
  250.              PWM_3=0;
  251.              PWM_1=0;
  252.              while(Keyboard_scan()!=12)
  253.              {   
  254.                   expect_y_angle=-8;
  255.                   expect_x_angle=-8;
  256.                   y_angle=Angle[1];
  257.                   y_anglespeed=AngularAcceleration[1];
  258.                   y_anglejiasu=Acceleration[1];
  259.                   x_angle=Angle[0];
  260.                   x_anglespeed=AngularAcceleration[0];
  261.                   x_anglejiasu=Acceleration[0];
  262.                   CarAngleAdjust_y_2();
  263.                   CarAngleAdjust_x_2();
  264.                  }
  265.              }
  266.              
  267.              else if (set_angle>90&&set_angle<180)
  268. {
  269.              set_angle=180-set_angle;
  270.              if(set_angle<45)
  271.              {
  272.              k_angle=0.65;     
  273.              k_angle_dot=0.185; //1
  274.              k_angle_jiasu=8.0;       
  275.              k_angle_dot_x=-0.0042*(float)set_angle+0.41; //2
  276.              PWM_1=192*set_angle+4388;
  277.              PWM_4=12000; //3
  278.              while(Angle[1]<4.5);
  279.              PWM_1=0;
  280.              PWM_4=0;
  281.              while(Keyboard_scan()!=12)
  282.              {   
  283.                   expect_y_angle=8;
  284.                   expect_x_angle=8;
  285.                   y_angle=Angle[1];
  286.                   y_anglespeed=AngularAcceleration[1];
  287.                   y_anglejiasu=Acceleration[1];
  288.                   x_angle=Angle[0];
  289.                   x_anglespeed=AngularAcceleration[0];
  290.                   x_anglejiasu=Acceleration[0];
  291.                   CarAngleAdjust_y_2();
  292.                   CarAngleAdjust_x_2();
  293.               }
  294.               }
  295.              
  296.              else if (set_angle>45 && set_angle<91)
  297.              {
  298.              set_angle=90-set_angle;
  299.              k_angle=0.65;     
  300.              k_angle_dot=0.185; //1
  301.              k_angle_jiasu=8.0;       
  302.              k_angle_dot_x=-0.0042*(float)set_angle+0.41; //2
  303.              PWM_4=194*set_angle+4388;
  304.              PWM_1=12000; //3
  305.              while(Angle[1]<5.5);
  306.              PWM_4=0;
  307.              PWM_1=0;
  308.              while(Keyboard_scan()!=12)
  309.              {   
  310.                   expect_y_angle=8;
  311.                   expect_x_angle=8;
  312.                   y_angle=Angle[1];
  313.                   y_anglespeed=AngularAcceleration[1];
  314.                   y_anglejiasu=Acceleration[1];
  315.                   x_angle=Angle[0];
  316.                   x_anglespeed=AngularAcceleration[0];
  317.                   x_anglejiasu=Acceleration[0];
  318.                   CarAngleAdjust_y_2();
  319.                   CarAngleAdjust_x_2();
  320.                  }
  321.              
  322.              }
  323.              
  324.              
  325. }
  326.                  R_TAU0_Channel0_Stop();

  327.        
  328. }
  329.         else if(key_1==4)
  330.         {
  331.         lcd_display(0,"     starting   "
  332.                           "      __4__     ");
  333.         R_TAU0_Channel0_Start();
  334.         expect_x_angle=0;
  335.         expect_y_angle=0;
  336.         k_angle=1.8;     //4__ 3.0 0.5
  337.         k_angle_dot=0.125;
  338.                       while(Keyboard_scan()!=12)
  339.                       {
  340.                         y_angle=AngularAcceleration[1];
  341.                         x_angle=AngularAcceleration[0];
  342.                         y_anglespeed=Acceleration[1];
  343.                         x_anglespeed=Acceleration[0];
  344.                         CarAngleAdjust_x();
  345.                         CarAngleAdjust_y();
  346.                       }
  347.        
  348.         }
  349.        
  350.         else if(key_1==13)
  351.         {
  352.                 unsigned char write_data[10];
  353.         lcd_display(0,"x:              "
  354.                           "y:              ");

  355.                       while(Keyboard_scan()!=12)
  356.                       {
  357.                         sprintf(write_data,"%6.3f",Angle[0]);
  358.                         lcd_display(3,write_data);
  359.                         Delay_ms(100);
  360.                         sprintf(write_data,"%6.3f",Angle[1]);
  361.                         lcd_display(19,write_data);
  362.                         Delay_ms(100);
  363.                       }
  364.        
  365.         }
  366. }
  367. }

  368.    
  369.     /* End user code. Do not edit comment generated here */


  370. /***********************************************************************************************************************
  371. * Function Name: R_MAIN_UserInit
  372. * Description  : This function adds user code before implementing main function.
  373. * Arguments    : None
  374. * Return Value : None
  375. ***********************************************************************************************************************/
  376. void R_MAIN_UserInit(void)
  377. {
  378.     /* Start user code. Do not edit comment generated here */
  379.     EI();
  380.     /* End user code. Do not edit comment generated here */
  381. }

  382. /* Start user code for adding. Do not edit comment generated here */
  383. void CarAngleAdjust_x(void)
  384. {
  385.   int PWM_Right;                 //风扇输出PWM的值
  386.   int nSpeed_balance;                         //PWM控制变量
  387.   int nP, nD;                                         //PD控制量
  388.   nP = (int)(expect_x_angle-x_angle)*k_angle;         //倾角,滤波后,相当于比例环节        ,转化成PWM脉宽调制的直接控制量
  389.   nD = (int)x_anglespeed*k_angle_dot;         //角速度 ,角速度归一化,相当于微分环节,转化成PWM脉宽调制的直接控制量
  390.   nSpeed_balance = nD + nP;                 //实时角度+实时角速度,作为控制输入量

  391. // if(nSpeed > MOTOR_SPEED_SET_MAX) nSpeed = MOTOR_SPEED_SET_MAX; //这个控制量输出饱和保护,防止过大
  392. // else if(nSpeed < MOTOR_SPEED_SET_MIN) nSpeed = MOTOR_SPEED_SET_MIN;//防止过小
  393.   PWM_Right = nSpeed_balance ;//+ g_nRightMotorOutSpeed; //+ g_nMotorLeftRightDiff;
  394.   MotorSpeedOut_x(PWM_Right);
  395. }
  396. void CarAngleAdjust_y(void)
  397. {
  398.   int PWM_Right;                 //风扇输出PWM的值
  399.   int nSpeed_balance;                         //PWM控制变量
  400.   int nP, nD;                                         //PD控制量
  401. // if((expect_y_angle-y_angle)<0.5||(expect_y_angle-y_angle)>-0.5)
  402. //        {expect_y_angle=y_angle;}
  403.   nP = (int)(expect_y_angle-y_angle)*k_angle;         //倾角,滤波后,相当于比例环节        ,转化成PWM脉宽调制的直接控制量
  404.   nD = (int)y_anglespeed*k_angle_dot;         //角速度 ,角速度归一化,相当于微分环节,转化成PWM脉宽调制的直接控制量
  405.   nSpeed_balance = nD + nP;                 //实时角度+实时角速度,作为控制输入量

  406. // if(nSpeed > MOTOR_SPEED_SET_MAX) nSpeed = MOTOR_SPEED_SET_MAX; //这个控制量输出饱和保护,防止过大
  407. // else if(nSpeed < MOTOR_SPEED_SET_MIN) nSpeed = MOTOR_SPEED_SET_MIN;//防止过小
  408.   PWM_Right = nSpeed_balance ;//+ g_nRightMotorOutSpeed; //+ g_nMotorLeftRightDiff;
  409.   MotorSpeedOut_y(PWM_Right);
  410. }


  411. void MotorSpeedOut_x(int i)
  412. { int nRight_x;
  413.   if(nRight_x<0)
  414.   {        PWM_2=0;
  415.         nRight_x=-nRight_x;
  416.         //if(nRight>90)nRight=90;
  417.                 PWM_1=nRight_x*320;
  418.                 Delay_ms(2);
  419.                
  420.   }
  421.   else
  422.    {        PWM_1=0;
  423.         nRight_x=nRight_x;
  424.         //if(nRight>90)nRight=90;
  425.         PWM_2=nRight_x*320;
  426.         Delay_ms(2);
  427.    }
  428. }       


  429. void MotorSpeedOut_y(int i)
  430. { int nRight;
  431.    nRight_y=i;
  432.    
  433.   if(nRight<0)
  434.   {        PWM_4=0;
  435.         nRight_y=-nRight_y;
  436.         //if(nRight>90)nRight=90;
  437.                 PWM_3=nRight_y*320;
  438.                 Delay_ms(2);
  439.                
  440.   }
  441.   else
  442.    {        PWM_3=0;
  443.         nRight_y=nRight_y;
  444.         //if(nRight>90)nRight=90;
  445.         PWM_4=nRight_y*320;
  446.         Delay_ms(2);
  447.    }
  448. }       

  449. void lcd_display_speed(unsigned char i,unsigned int adc) //数值显示
  450. {
  451. lcd_write_number(i,((adc/10000)%10));      
  452. lcd_write_number(i+1,((adc/1000)%10));
  453. lcd_write_number(i+2,((adc/100)%10));
  454. lcd_write_number(i+3,((adc/10)%10));
  455. lcd_write_number(i+4,((adc/1)%10));

  456. }

  457. void CarAngleAdjust_y_2(void)
  458. {
  459.   int PWM_Right;                 //风扇输出PWM的值
  460.   int nSpeed_balance;                         //PWM控制变量
  461.   int nP,nI,nD;                                         //PD控制量
  462. // if((expect_y_angle-y_angle)<0.5||(expect_y_angle-y_angle)>-0.5)
  463. //        {expect_y_angle=y_angle;}
  464.   nP = (int)(expect_y_angle-y_angle)*k_angle;         //倾角,滤波后,相当于比例环节        ,转化成PWM脉宽调制的直接控制量
  465.   nD = (int)y_anglespeed*k_angle_dot;         //角速度 ,角速度归一化,相当于微分环节,转化成PWM脉宽调制的直接控制量
  466.   nI = (int)y_anglejiasu*k_angle_jiasu;
  467.   nSpeed_balance = nD + nP;                 //实时角度+实时角速度,作为控制输入量

  468. // if(nSpeed > MOTOR_SPEED_SET_MAX) nSpeed = MOTOR_SPEED_SET_MAX; //这个控制量输出饱和保护,防止过大
  469. // else if(nSpeed < MOTOR_SPEED_SET_MIN) nSpeed = MOTOR_SPEED_SET_MIN;//防止过小
  470.   PWM_Right = nSpeed_balance ;//+ g_nRightMotorOutSpeed; //+ g_nMotorLeftRightDiff;
  471.   MotorSpeedOut_y(PWM_Right);
  472. }
  473. void CarAngleAdjust_x_2(void)
  474. {
  475.   int PWM_Right;               
  476.   int nSpeed_balance;                       
  477.   int nP,nI,nD;                                         
  478.   nP = (int)(expect_x_angle-x_angle)*k_angle;         
  479.   nD = (int)x_anglespeed*k_angle_dot_x;         
  480.   nI = (int)x_anglejiasu*k_angle_jiasu;
  481.   nSpeed_balance = nD + nP;
  482.   PWM_Right = nSpeed_balance;
  483.   MotorSpeedOut_x(PWM_Right);
  484. }
  485. /* End user code. Do not edit comment generated here */
复制代码

所有资料51hei提供下载:
源程序.zip (187.6 KB, 下载次数: 17)
回复

使用道具 举报

ID:1 发表于 2019-6-30 18:46 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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