当前位置:   article > 正文

【STM32+HAL】直流电机PID控制_stm32 hal库电机控制

stm32 hal库电机控制

一、准备工作:

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

 有关LCD的初始化配置,参见我的另一篇blog:【STM32+HAL】LCD显示及触摸初始化配置​​​​​​

二、所用工具:

1、芯片: STM32F407ZGT6

2、STM32CubeMx软件

3、显示屏:正点原子4.3寸TFT LCD MCU电阻屏 480*800

4、驱动器:L298N

5、电机:MG310电机(GMR编码器)

三、实现功能:

实现对直流减速电机的PID控制及转速显示

四、HAL配置步骤:

1、定时器配置

2、编码器配置

编码器用于读取电机转速,原理详见下附链接

3、PWM配置

4、中断配置

至此,HAL库配置完成

五、硬件连接:

根据芯片原理图,

L298N:PA7(PWM输出IO口)接L298N的IN1,IN2接地,12V供电接输入电压源正极,电压源负极接单片机GND,GND接单片机GND,输出A接电机正负极

编码器:PA6,PC7(编码器IO口)分别接编码器A、B相

六、KEIL填写代码:

1、初始化

  1. HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);//开启编码器
  2. HAL_TIM_Base_Start_IT(&htim3);//开启编码器中断
  3. HAL_TIM_Base_Start_IT(&htim2);//开启定时器中断
  4. HAL_TIM_PWM_Start(&htim14,TIM_CHANNEL_1);//开启PWM波
  5. HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);//串口接收初始化
  6. LCD_Init();
  7. POINT_COLOR=RED; //LCD显示初始化
  8. LCD_Clear(WHITE);
  9. tp_dev.init(); //LCD触摸初始化

2、PWM波生成模块

  1. void Generate(void)
  2. {
  3. if(flag_pwm){ //PWM开关
  4. if(Bias<-3||Bias>3)//偏差过小时不开启改变
  5. Cnt+=Bias;
  6. Cnt=(Cnt>9992)?9992:Cnt;//防溢出
  7. TIM14->CCR1=Cnt;
  8. }
  9. }

3、读取电机速度模块

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3. UNUSED(htim);
  4. if(htim->Instance==TIM2){
  5. Encode = (short)(__HAL_TIM_GET_COUNTER(&htim3));
  6. __HAL_TIM_SET_COUNTER(&htim3,0);
  7. Bias=PID(Encode,SetSpeed);
  8. }
  9. }

4、PID偏差计算模块

  1. int PID(int current,int target) //PID速度控制
  2. {
  3. static int LastError; //Error[-1]
  4. static int PrevError; //Error[-2]
  5. int iError,Outpid; //当前误差
  6. target=target/0.15; //将速度值转换为编码值
  7. iError=target-current; //增量计算
  8. Outpid=(Proportion * iError) //E[k]项
  9. -(Integral * LastError) //E[k-1]项
  10. +(Derivative * PrevError); //E[k-2]项
  11. PrevError=LastError; //存储误差,用于下次计算
  12. LastError=iError;
  13. return Outpid;
  14. }

七、原理讲解

L298N、电机、单片机的线路连接(51、stm32程序)

STM32Cube HAL库——霍尔编码器测速(电机转速测量)

HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲

八、源码提供

【STM32+HAL】直流电机PID控制

九、更多细节

1、编码器检测电机正反转:
dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);

2、L298N正反转:

需配置两路PWM输入IN1,IN2

  1. void PWM_Select(int x)
  2. {
  3. if(x==0) PWMA=0,PWMB=0;
  4. else if(x==1) PWMA=Moto,PWMB=0;
  5. else if(x==2) PWMA=0,PWMB=Moto;
  6. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/966101
推荐阅读
相关标签
  

闽ICP备14008679号