PID项目经验

项目场景:

电机型号:MD36N行星减速电机_AB两相光电编码器霍尔编码器

电机参数:

//光电编码器线数500,减速比27,减速器长度32.5mm,以1:27输出轴:27*500=13500线,
  四倍频  MD36NP27_24V,减速后转速325(30)rpm,额定转速230(20)rpm
//霍尔编码器线数13,减速比71

单片机型号:STM32F429IG,keil

程序最终功能:串级位置式PID反复调节电机,使得电机可以在一定范围内精准任意停靠在某个位置,比如电机控制目标在圆形轨道转动,就可以实现在固定角度的位置停靠,四等分,八等分等


实现步骤

1、PID调节相关的定时器设置

PID计算定时器

编码器

电机PWM输出定时器

2、

@Override
	public void run() {
		bytes = mmInStream.read(buffer);
		mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
	}

问题分析及解决方案:

1、当使用串级位置式PID时,在其他子程序中加入已调试好的程序,PID控制电机突然不动,

关闭所有打开的c、h文件,再打开main.c重新编译下载

2、while循环与if语句对于电机PID调速的影响

电机位置环调速时,target_location在形式上必须是电机转一圈的倍数值,且不为零,其他值也不行,不能直接赋值。

else if也不能用,只能用if

if语句的判断条件不能是数组元素,必须是一个变量。

if语句在keil嵌入式中使用的必须条件就是,if语句必须列举全部的可能性,

3、FreeRTOS的软件定时器会影响软件定时器的定时时间,甚至导致失效

4、直流有刷减速电机位置环速度环位置式调速

a、位置环位置式的初始位置与每转一圈的位置都会被PID记录,因此对电机位置的管理尤为重要,且只能每次转固定脉冲的倍数,不能出现乘法,只能以+=形式赋值。

b、复位多次PID位置环的调试结果符合正弦曲线或PID超调经典曲线,即一次过位,一次正好,一次欠位,或者多次过位...

 5、PID位置环速度环串级调速

6、速度环调速时,电机以最大速度启动且无法调速

a09b1e6696f940af8f84192bf6849e15.png7、PID环境配置

上溢下溢计数方向

IN1与IN2双PWM调速时的电机使能方式FWD\REV

电机旋转方向

电机设置速度方向

计算PID的定时器周期太大,无法调速

速度上限还是下限处理,当PWM值越大,速度越小时,设置下限,且界值不对,无法调速

编码器频率

PWM上限

电机速度太高,每圈脉冲数太多导致PID调节失效

电机将FWD,REV同时使能,电机不转

 

 

 

 

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值