首页 > 编程知识 正文

(硬件学习_STM32_CubeMX_自动控制_PID闭环控制电机转速)

时间:2023-05-04 01:52:28 阅读:121914 作者:2651

前言:这是一个新栏目,用于记录硬件方面的学习历史。

虽然到目前为止硬件学习还没有系统地组织起来,但是我希望这个栏目的开设能让我的学习更加系统。

注:本栏是在学习过程中添加的,内容没有顺序、关联。仅是个人记录用,不适合学习者观看。

准备(知识储备)计时器中断知识PWM电机控制知识编码器计数器知识系统配置(STM32F103C8T6L298N或TB6612电机控制模块光电编码器电机接口定义)

中间的4条是编码器线路,外面的2条是编码器电源,中间的2条是编码器脉冲输出

使用l298n:12v供电

使用L298NPWM控制时,需要拆下跳线帽,通过cjdwd1和cjdwd2的电平高低控制进行正反转(4条线与F103连接,分别为PWM、GND、cjdwd1、cjdwd2) )。

使用编码器:向ams1117 -5.0供电5V

3条线与F103连接,分别为脉冲2条、GND

计时器构成: F103共有4个计时器,构成如下。

ylddt1——空

ylddt2——转速采样,100HZ

支持ylddt3——2通道、PWM信号时钟、10kHZ、PA7输出PWM

ylddt4——编码器计数模式、上升沿触发、支持PB6/7的编码器

在代码逻辑:中,当ylddt2计数时,回调函数获取电机脉冲以转换为速度,将其输入到PID控制器,PID控制器将占空比输出到L298N

PID闭环控制逻辑(重点学习) :相关备注:

这里的图像有错误。 增量PID的OUT不需要为=。 因为后面的return加上了原始值。

注意增量PID和位置PID输出值的区别!!

代码实现(部分) control.h # ifndef _ control _ h # define _ _ control _ h//全局变量extern unsigned int MotorSpeed; 扩展速度目标; 扩展监视器输出; //函数声明voidgetmotorpulse(void ); intspeedinnercontrol(intspeed,int Target; 语音语音呼叫诊断(int PWM; # endif control.c # include ' control.h ' # include '胖面包. h ' # include ' main.h ' # include ' math.h ' unsignedintion //全局变量、速度目标值int MotorOutput; //通过全局变量、电机输出//1.ylddt4读取电机脉冲, 计算速度voidgetmotorpulse(void ) ) motorspeed=) short ) __HAL_ylddt_GET_COUNTER(h )//ylddt4计数器将电机脉冲//计数器清除(//2.增量PID控制器int Error_Last,Error_Prev; //上次偏差值、上次误差int Pwm_add、Pwm; //PWM增量、PWM输出占空比float Kp=10.0、Ki=0.9、Kd=0.0; //PID系数intspeedinnercontrol(intspeed,int Target )//速度内环控制({ int Error=Speed - Target; //偏差=目标速度-实际速度PWM_add=KP*(error-error_last ) /比例Ki * Error //积分KD* ) error-2.0f * error _ lasterror _ pr ror //微分Pwm =Pwm_add; //原始量的增量=输出量Error_Prev=Error_Last; //保存上次误差Error_Last=Error保存上次偏差if(PWM100 ) Pwm=100限制上下限,不超过PWM范围if(PWM-100 ) Pwm=-100 返回PWM; 返回//输出值}//3.电机电压和方向控制函数voidsetmotorvoltageanddirection (int PWM ) if (PWM0)//反转) Hal _ gpio _ write pin (CJD wd wd ) PWM=(-PWM; //计算值为负值时,先取负值。 因为PWM寄存器只能是正值__Hal_ylddt_set_compare(h胖面包3,ylddt_CHANNEL_2,PWM ) )。 //输出} else { Hal _ gpio _ write pin (CJD wd1_ gpio _ port,cjdwd1_Pin,GPIO_PIN_RESET ); Hal _ gpio _ write pin (CJD wd2_ gpio _ port,cjdwd2_Pin,GPIO_PIN_SET ); __Hal_ylddt_set_compare(h胖面包3,ylddt_CHANNEL_2,Pwm ); }} ylddt2回调函数void Hal _ yld dt _ periodelapsedcallback (yld dt _ handle typedef * h胖面包(if ) h胖面包==h胖面包2 ) //3 .在电机控制函数setmotorvoltageanddirection (电机输出)中引入占空比; }实际调试:带使用Keil5的调试

使用STM32Studio进行调试

用手试着关掉电机,观察控制效果

按下并松开RST键,可以看到电机工作的曲线

CubeMX、HAL库是个好东西,不用胶水,不用磨刀石就能不磨刀,这是最好的老师知道放弃,但有时可以捡起来每天锻炼一个小时,幸福地生活一辈子

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。