找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电机速度闭环控制STM32源码

[复制链接]
ID:488832 发表于 2019-3-11 20:45 | 显示全部楼层 |阅读模式
电机速度闭环控制案列

单片机源程序如下:
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "stm32f10x.h"                                            //包含stm32库系统头文件
  4. #include "servor.h"                                                        //包含GPIO库头文件
  5. #include "usart.h"                                                          //包含串口通信设置头文件
  6. #include "delay.h"                                                //包含系统定时器库头文件
  7. #include "timer.h"                                        //包含定时器设置头文件
  8. #include "PS2.h"
  9. #include "key.h"
  10. #include "led.h"
  11. #include "beep.h"
  12. #include "common.h"
  13. #include "adc.h"
  14. #include "motor.h"
  15. #include "control_app.h"
  16. #include "oled.h"
  17. #include "show.h"
  18. #include "encoder.h"
  19. u32 value;                                                                       
  20. u32 key, key_bak;
  21. extern u32 a;                                                                  //a用来计数,配合系统滴答定时器可检测代码运行时间
  22. extern uint8 flag_RecFul;
  23. int Encoder_Left,Encoder_Right;             //左右编码器的脉冲计数
  24. int Motor_A,Motor_B,Servo,Target_A,Target_B;  //电机舵机控制相关  
  25. int Encoder_A_EXTI;
  26. uint16 CPWM[MOTOR_NUM]=   {1500,1500,1500,1500,1500,1500,1500,1500,1500};
  27. char redata[500] = {0};    // 定义接收数据变量数组
  28. uint16 adc_value=0;
  29. unsigned char flag_scan_ps2 = 0;
  30. u8 LX_AD=0;
  31. u8 LY_AD=0;
  32. u8 RX_AD=0;
  33. u8 RY_AD=0;
  34. u32 Motor_Pwm=990;
  35. u8 ps2_mode=0;
  36. char menu=2;
  37. u8 delay_50,delay_flag;
  38. void scan_ps2(void);
  39. void Check_Power(void);
  40. void ps2_handle(void);

  41. /**********************************************************************************/
  42. /*****************************主函数***********************************************/
  43. int main(void)
  44. {   
  45.         SysTick_Init();                                                                           //系统滴答定时器初始化
  46.         Servor_GPIO_Config();                                                                           //GPIO初始化
  47.   Uart_Init(2);       
  48.         Uart_Init(3);
  49.         Timer_Init();                                                                           //定时器初始化
  50.         Timer_ON();                                                                                   //开启定时器                        
  51.         LED_Init();       
  52.         //KEY_Init();
  53. //        Beep_Init();
  54.         Uart_Init(1);
  55. //        PS2_Init();
  56.         OLED_Init();                    //=====OLED初始化       
  57.         Encoder_Init_TIM3();
  58.         Encoder_Init_TIM_Exit0();
  59.         Encoder_Init_TIM_Exit1();
  60.         //Adc_Init();
  61.         USART_Config(USART1,115200);
  62.         USART_Config(USART2,115200);
  63.         USART_Config(USART3,115200);
  64.         Motor_Gpio_init();
  65. //        PWM2_Init(1000,5);  // 初始化电机工作频率 72/(5+1)  12KHZ
  66.         PWM2_Init(7199,0);  // 初始化电机工作频率 72/(5+1)  12KHZ
  67.         //Led_Test();
  68.         //Beep_Test();

  69.         while (1)
  70.         {
  71.      oled_show();          //===显示屏打开
  72.                  delay_flag=1;       
  73.                  delay_50=0;
  74.                  while(delay_flag);             //通过定时中断实现的50ms精准延时       
  75.         }
  76. }

  77. /*
  78. void ps2_handle(void) {
  79.         //ps2_SONY
  80.                 Delay_ms(85);
  81.                 flag_scan_ps2=1;
  82.        
  83. }
  84. */

  85. void scan_ps2(void)
  86. {
  87.         if (flag_scan_ps2)//
  88.         {
  89.                 flag_scan_ps2 = 0;
  90.                 key = PS2_DataKey();
  91.           LX_AD=PS2_AnologData(PSS_LX);
  92.                 RY_AD=PS2_AnologData(PSS_RY);       
  93.                 //UART_Put_Inf("LY_AD:",LY_AD);
  94.                 ps2_mode=PS2_RedLight();
  95.                 if(ps2_mode==0)
  96.                 {
  97.                         if(key==PSB_SELECT)
  98.                         {
  99.                                 if(key_bak == key)return;
  100.                           key_bak=key;
  101.                                 menu=0;
  102.                                 N_Beep(1);
  103.                         }
  104.                         if(key==PSB_START)
  105.                         {
  106.                                 if(key_bak == key)return;
  107.                           key_bak=key;
  108.                                 menu=1;
  109.                                 N_Beep(1);
  110.                         }
  111.                         if(menu==0)
  112.                         {
  113.                                 switch(key)
  114.                                 {
  115.                                         case PSB_PAD_UP:break;
  116.                                         case PSB_PAD_DOWN:break;
  117.                                         case PSB_PAD_LEFT:break;
  118.                                         case PSB_PAD_RIGHT:break;
  119.                
  120.                                         case PSB_TRIANGLE:break;
  121.                                         case PSB_CROSS:break;
  122.                                         case PSB_PINK:break;
  123.                                         case PSB_CIRCLE:break;

  124.                                         case PSB_L1:N_Beep(1);Motor_Pwm+=200;if(Motor_Pwm>=990) Motor_Pwm=990;break;
  125.                                         case PSB_L2:N_Beep(1);Motor_Pwm-=200;if(Motor_Pwm<=600) Motor_Pwm=600;break;
  126.                                         case PSB_R1:break;
  127.                                         case PSB_R2:break;
  128.                                         default:break;
  129.                                 }
  130.                                 //LY_AD=PS2_AnologData(PSS_LY);
  131.                     //RY_AD=PS2_AnologData(PSS_RY);                                       
  132.                                 if(LX_AD>110 && LX_AD<=146)    //左摇杆y轴在ad值在:100--146范围内让电机保持停止状态
  133.                                 {
  134.                
  135.                                         CPWM[1]=1500;
  136.                                 }
  137.                                 else if(LX_AD>=0 && LX_AD<=110)
  138.                                 {
  139.                                         CPWM[1]=1100;
  140.                                 }
  141.                                 else if(LX_AD>146 && LX_AD<=255)
  142.                                 {
  143.                                         CPWM[1]=1900;
  144.         }

  145.                          if(RY_AD>110 && RY_AD<=146)   //左摇杆X轴在ad值在:100--146范围内,让舵机保持在1500中间位置
  146.                                 {
  147.                                         Set_Pwm_Motor1(0);
  148.                                         Set_Pwm_Motor2(0);
  149.                                 }
  150.                                 else if(RY_AD>=0 && RY_AD<=110)
  151.                                 {
  152.                                         Set_Pwm_Motor1(Motor_Pwm);
  153.                                         Set_Pwm_Motor2(Motor_Pwm);
  154.                                 }
  155.                                 else if(RY_AD>146 && RY_AD<=255)
  156.                                 {
  157.                                         Set_Pwm_Motor1(-Motor_Pwm);
  158.                                         Set_Pwm_Motor2(-Motor_Pwm);
  159.                                 }
  160.                          }
  161.                         }
  162.                 }
  163.         }
复制代码

所有资料51hei提供下载:
2.电机速度闭环控制.7z (206 KB, 下载次数: 14)
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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