定点PID算法

本文介绍了如何在STM32F1上实现定点PID算法,特别是在没有硬件浮点单元的情况下。内容主要涉及定点PID的结构体设计和比例积分部分的实现,通过右移运算代替除法以提高效率。
摘要由CSDN通过智能技术生成

前言

  之前使用有硬件浮点单元的单片机,就一直在用浮点PID,最近在STM32F1上面跑FOC,再使用浮点肯定是不太合适的了,就研究了下STM32官方的定点PID。由于FOC算法一般使用PI就够了,所以下面算法只有PI(比例,积分)部分,没有加入D(微分)部分。

结构体

	typedef struct {
   
		int16_t h_kp;
		int16_t h_ki;
		
		int32_t w_integral_term;
		
		// limit
		int32_t w_upper_integral_limit;
		int32_t w_lower_integral_limit;
		int16_t h_upper_output_limit;
		int16_t h_lower_output_limit;
		
		uint16_t h_kp_divisor_pow2;
		uint16_t h_ki_divisor_pow2;
		
	} mc_pid_t;

   ST的代码喜欢用h开头表示16位数据,w开头表示32位数据,对于需要做定点乘法的代码来说,这种表示方法能避免出错,所以我们这里沿用这种表示方法。

变量名 含义
h_kp 当前使用的kp值
h_ki 当前使用的ki值
w_integral_term 积分项的值,由于积分项需要累加,所以将其值保存在结构体中
w_upper_integral_limit 积分项的最大值
w_lower_integral_limit 积分项的最小值
h_upper_output_limit 输出的最大值
h_lower_output_limit 输出的最小值
h_kp_divisor_pow2 比例项右移的位数
h_ki_divisor_pow2 比例项右移的位数

   在我们使用浮点pid算法时,kp,ki的值我们都能够设置成小数,而定点不行。那怎么处理呢?最简单的办法就是,将比例项和积分项都除以一个数,如果kp为1,除以10就相当于kp是0.1了。
   在STM32这样的单片机中,进行除法运算效率也是比较低的,所以采用右移运算,右移1位表示除以2,右移2位表示除以2^2,一次类推。。。我们变量名中的pow2就是这个意思了,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值