找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32电机驱动代码,带过流检测

[复制链接]
coolice 发表于 2021-8-14 01:10:26 | 显示全部楼层 |阅读模式
MotorDriver_upgrade 带过流监测.rar (4.1 MB, 售价: 3 E币)
部分源码如下,完整工程源码见附件
  1. #include "main.h"
  2. extern unsigned char rx_buffer[10];
  3. extern u8 rx_received;
  4. extern u8 TIM2Timeout;
  5. extern u8 MotorState;
  6. extern s16 MotorPWM;
  7. extern int MotorSpeed;
  8. extern u8 ExceedCurrentCounter;
  9. int MotorPWM_Para=0;//调试用
  10. float MotorSetSpeed=0;//需要的转速(rpm,-MOTORMAXRPM~MOTORMAXRPM)
  11. u16 TIM2Counter=0;//TIM2溢出计数器,范围0~399,对应时间0~1s
  12. int MotorSpeed_Debug=0;
  13. u16 MotorCurrentADValue=0;

  14. int main(void)
  15. {
  16.         LED_Configuration();
  17.         LED_RED_ON();

  18.         PWM_Configuration();
  19.         KEY_Configuration();
  20.         USART2_Configuration();
  21.         Encoder_Configuration();
  22.         TIM2_Configuration();
  23.         ADC_Configuration();
  24.         TIM2_Start();
  25.         Encoder_Start();

  26.         MotorControlInit();

  27.     while(1)
  28.     {
  29.                 if(TIM2Timeout==1)//处理定时器2溢出事件,周期2.5ms
  30.                 {
  31.                         MotorSpeed+=Encoder_Get_CNT();//读取码盘数据

  32.                         if(MotorState==3)//过流保护状态指示,当第一次发生过流时,红灯闪烁(周期400ms),将转速设定值降为0以解除过流保护状态
  33.                         {
  34.                                 MotorSetPWM(0);//电机停转

  35.                                 if(TIM2Counter%80==0 && ExceedCurrentCounter==1)//1次过流保护状态红灯闪烁
  36.                                         LED_RED_TOGGLE();

  37.                                 if(ExceedCurrentCounter==2)//当第二次发生过流时,红灯闪烁(周期1.2s),电机驱动器锁死,只能复位或重新上电以解除过流保护
  38.                                         while(1)
  39.                                         {
  40.                                                 delay_ms(600);
  41.                                                 LED_RED_TOGGLE();
  42.                                         }

  43.                                 if(MotorSetSpeed==0 && ExceedCurrentCounter==1 && MotorCurrentCheck(ADC_Filter())==0)//将转速设为0,且此时不过流,则解除1次过流保护状态
  44.                                 {
  45.                                         MotorState=0;
  46.                                         LED_RED_ON();
  47.                                         MotorControlReset();//电机控制复位
  48.                                         MotorSpeed=0;//反馈转速也清0
  49.                                 }
  50.                                        
  51.                         }        
  52.                         else//不在过流保护状态才进行电机控制
  53.                         {
  54.                                 if(TIM2Counter%2==0)//每5ms进行一次PID控制
  55.                                 {
  56.                                         MotorSpeed/=2;
  57.                                         MotorSpeed_Debug=MotorSpeed;
  58.                                         MotorControl(MotorSetSpeed,0.7426*MotorSpeed);           //读出的数据除以260(码盘倍率),再除以16(减速箱比),即为输出轴的转速r/s,乘以60即得rpm
  59.                                         MotorSpeed=0;
  60.                                 }
  61.                         }

  62.                         if(TIM2Counter%40==0)//每100ms发送一次数据,以及电流检测
  63.                         {
  64.                                 MotorCurrentADValue=ADC_Filter();
  65.                                 MotorCurrentCheck(MotorCurrentADValue);
  66.                                 printf("%.2f  %.4f %d %d\r\n",MotorSetSpeed,0.7426*MotorSpeed_Debug,MotorPWM,MotorCurrentADValue);                                
  67.                         }

  68.                
  69.                         
  70.                         TIM2Counter=(TIM2Counter+1)%400;//计数器加1
  71.                         TIM2Timeout=0;//溢出事件处理完毕
  72.                 }

  73.                 if(rx_received==1)//处理串口发来的数据信息
  74.                 {
  75.                         if(strncmp((const char*)rx_buffer,"boostmotor",10)==0)//电机增速
  76.                         {
  77.                                 MotorSetSpeed+=50;
  78.                                 MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);        
  79.                         }

  80.                         if(strncmp((const char*)rx_buffer,"slackmotor",10)==0)//电机减速
  81.                         {
  82.                                 MotorSetSpeed-=50;
  83.                                 MotorSetSpeed=MotorSpeedLegalize(MotorSetSpeed);
  84.                         }                        
  85.                         
  86.                         rx_received=0;//串口数据处理完毕
  87.                 }        

  88.     }
复制代码


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

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-20 20:31

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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