找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5572|回复: 7
打印 上一主题 下一主题
收起左侧

关于pid控制pwm输出的问题

[复制链接]
跳转到指定楼层
楼主
ID:405033 发表于 2018-10-17 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
incrementalpid_t *pidStructure;


typedef struct{
float Target;      //设定目标值
float Measured;     //测量值
float err;        //本次偏差值
float err_last;     //上一次偏差
float err_beforeLast;  //上上次偏差
float Kp, Ki, Kd;    //Kp, Ki, Kd控制系数
float pwm;        //pwm输出
float zancun;
}incrementalpid_t;


int Position_PID(positionpid_t *pid_t, int target, int measured)

{
pid_t->Target = (float)target;
pid_t->Measured = (float)measured;

pid_t->err = pid_t->Target - pid_t->Measured;      //误差(目标值-测量值)
pid_t->integral_err += pid_t->err;           //误差积分

pid_t->pwm = pid_t->Kp*pid_t->err    //增量pid
      + pid_t->Ki*pid_t->integral_err
      + pid_t->Kd*(pid_t->err - pid_t->err_last);

pid_t->err_last = pid_t->err;

    if(pid_t->pwm < -PositionPID_Amplitude) pid_t->pwm = -PositionPID_Amplitude;
if(pid_t->pwm > PositionPID_Amplitude)  pid_t->pwm = PositionPID_Amplitude;

return (int)pid_t->pwm;
}

新人一枚,想问一下如果想用TIM_SetComparex()这个函数去接收pid_t->pwm的话,要怎么去写,一开始是
TIM_SetCompare1(TIM1,pidStructure->pwm)这样直接去写的,但是没有成效,所以不知道是哪里有问题(想法很简单,就把pid这个输出量传给TIM_SetComparex去控制pwm的输出)是这个想法一开始就不成立吗,恳求大佬指点指点(也省略了很多代码没贴出,主要是吧pid_t->pwm作为pwm的操控量)。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:388197 发表于 2018-10-18 16:13 | 只看该作者
没看懂positionpid_t是什么类型,是另外声明的结构体还是什么?怀疑是楼主在主程序里声明的结构体变量名,可能楼主把结构体变量名写成了函数声明时的形参.
如果函数调用的是上边声明的结构体变量,应该声明成这样才对.
int Position_PID(incrementalpid_t *pid_t int target, int measured)
主程序调用时则写成
Positon_PID(&pid_t,p1,p2);(假设pid_t已经声明为incrementalpid_t类型结构体,p1和p2已经声明为int类型变量)
回复

使用道具 举报

板凳
ID:405033 发表于 2018-10-25 20:34 | 只看该作者
cjm82 发表于 2018-10-18 16:13
没看懂positionpid_t是什么类型,是另外声明的结构体还是什么?怀疑是楼主在主程序里声明的结构体变量名,可能 ...

嗯嗯,看到了这个错误,谢谢你啦,还有我想问一下,这个最后return回来的值能够直接传给TIM_SetCompare1()这个函数吗,类似于TIM-SetCompare1(TIM1,pid_t->pwm),假设pid_t已经声明为incrementalpid_t类型结构体。
回复

使用道具 举报

地板
ID:405033 发表于 2018-10-30 18:31 | 只看该作者
不用了,已经解决了,谢谢
回复

使用道具 举报

5#
ID:438112 发表于 2018-12-3 20:08 | 只看该作者
请问楼主最后这个setcompare实现了吗?我是想利用PWM的输出结果去调整PWM的占空比,可以分享下代码吗?万分感激!邮箱journey1022@163.com
回复

使用道具 举报

6#
ID:405033 发表于 2018-12-3 20:39 | 只看该作者
journey1022 发表于 2018-12-3 20:08
请问楼主最后这个setcompare实现了吗?我是想利用PWM的输出结果去调整PWM的占空比,可以分享下代码吗?万分 ...

你好,其实你先在这个函数直接传固定值进去,看一下电压有没有变化就可以验证了,还有,参考原子的pwm输出程序库函数版本的,就可以看到这个函数的具体用处了,而且照你的说法,你有用到pid还是什么。。。。。。
回复

使用道具 举报

7#
ID:438762 发表于 2018-12-3 21:23 | 只看该作者
嗯嗯,看到了这个错误,谢谢你啦
回复

使用道具 举报

8#
ID:438112 发表于 2018-12-4 08:18 | 只看该作者
疯子本人 发表于 2018-12-3 20:39
你好,其实你先在这个函数直接传固定值进去,看一下电压有没有变化就可以验证了,还有,参考原子的pwm输 ...

好的,我先看看原子的例程,我是用PID,谢谢你啦。不懂的可能还要麻烦你
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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